OpenHands Enterprise 0.103.0
Released November 6, 2026.Highlights
- Multi-Repository Conversations — Start a conversation with several repositories from the web app, Slack, Jira, or Jira Data Center. The agent can clone private repositories from any connected git provider.
- Model Routing — Organization admins can create a Model Router that picks the model for each conversation. It is on by default; turn it off with Enable Model Routing in the Admin Console.
- Bitbucket Data Center — Add Bitbucket Data Center as a git provider and trigger automations from its pull request events.
- Service Accounts (Beta) — Super Admins can turn on service accounts from the Instance page and run automations under them instead of a personal account.
- Installation and Security — Use your own TLS certificate secret, restrict sandbox egress with an opt-in NetworkPolicy, and limit password login to permitted email patterns. Images now distrust the compromised emSign certificate authorities.
Upgrade Notes
- Public conversation links require organization membership — A conversation shared publicly from an organization can now be opened only by signed-in members of that organization. Links shared from a Personal Workspace are unchanged.
- Azure DevOps Organization setting removed — Azure DevOps now works across every organization a user belongs to, so this Admin Console field is gone. No action is needed.
- Docker Compose port changed to 9043 — The stack no longer conflicts with Agent Canvas on
3100. Update bookmarks and tunnels, or setAPP_PORT=3100to keep the old port.
Features
Enterprise Server
- feat(compose): add HTTPS overlays for the compose stack by @jlav in https://github.com/OpenHands/enterprise/pull/1015
- feat: Expose OAuth access tokens to conversations under a configurable named_secret by @tofarr in https://github.com/OpenHands/enterprise/pull/1024
- feat(compose): PLTF-3689 add Redis so GitLab webhook events are processed by @aivong-openhands in https://github.com/OpenHands/enterprise/pull/1002
- feat(llm): offer OpenHands Cloud as an LLM provider when LiteLLM is off (OHE-3698) by @hieptl in https://github.com/OpenHands/enterprise/pull/1017
- feat(sharing): limit public shares from team orgs to org members (OHE-3763) by @hieptl in https://github.com/OpenHands/enterprise/pull/1026
- feat(secrets): replace organization secret values atomically (OHE-3674) by @rajshah4 in https://github.com/OpenHands/enterprise/pull/917
- feat(model-router): add org Model Router storage, API and feature flag (OHE-3766) by @hieptl in https://github.com/OpenHands/enterprise/pull/1032
- feat(jira-dc): forward Jira DC events to every org with a Jira DC automation by @ak684 in https://github.com/OpenHands/enterprise/pull/1043
- feat(app-conversations): start a conversation with several repositories by @ak684 in https://github.com/OpenHands/enterprise/pull/1046
- feat(git): credential helper for every provider so hooks and the agent can clone any private repository by @ak684 in https://github.com/OpenHands/enterprise/pull/1070
- feat(app-conversation): read files, diffs, skills and hooks of every repository in a multi-repository conversation by @ak684 in https://github.com/OpenHands/enterprise/pull/1073
- feat(jira-dc): start one conversation when a ticket names several repositories by @ak684 in https://github.com/OpenHands/enterprise/pull/1074
- feat(auth): configurable identity attribute mapping per auth provider by @tofarr in https://github.com/OpenHands/enterprise/pull/1091
- feat: Show skill descriptions in expandable rows on the Skills settings page by @tofarr in https://github.com/OpenHands/enterprise/pull/1101
- feat: generate conversation titles alongside sandbox startup by @ak684 in https://github.com/OpenHands/enterprise/pull/1119
- feat(service-accounts): add the service account admin API by @henriquehirako in https://github.com/OpenHands/enterprise/pull/1049
- feat(frontend): add the service accounts settings page by @henriquehirako in https://github.com/OpenHands/enterprise/pull/1050
- feat(service-accounts): put service accounts behind the ENABLE_SERVICE_ACCOUNTS feature flag by @henriquehirako in https://github.com/OpenHands/enterprise/pull/1088
- feat: Add Bitbucket Data Center option to the Add Provider modal (OHE-3815) by @tofarr in https://github.com/OpenHands/enterprise/pull/1143
- feat(jira): start one conversation when a ticket names several repositories by @ak684 in https://github.com/OpenHands/enterprise/pull/1085
- feat(slack): start with every repository named in the message; multi-select picker otherwise by @ak684 in https://github.com/OpenHands/enterprise/pull/1086
- feat: Restrict password login to permitted email patterns (OHE-3912) by @tofarr in https://github.com/OpenHands/enterprise/pull/1180
- feat(compose): add a support bundle script for log collection by @jlav in https://github.com/OpenHands/enterprise/pull/1178
- feat(frontend): name the product and link its terms on the accept-ToS page (OHE-3865) by @hieptl in https://github.com/OpenHands/enterprise/pull/1173
- feat(super-admin): add a Connect Git step to the setup guide (OHE-3901) by @hieptl in https://github.com/OpenHands/enterprise/pull/1199
Software Agent SDK
- feat(workspace): clone Bitbucket Data Center repositories by @ak684 in https://github.com/OpenHands/software-agent-sdk/pull/6281
- feat(sdk): make ThinkTool opt-in instead of a default tool by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/6159
Runtime API
- feat: PLTF-3529 make runtime command optional to preserve image entrypoint by @aivong-openhands in https://github.com/OpenHands/runtime-api/pull/749
Automation
- feat: support tags on automations by @VascoSch92 in https://github.com/OpenHands/automation/pull/622
- feat(events): publish Jira DC and Bitbucket DC event catalogs by @ak684 in https://github.com/OpenHands/automation/pull/653
- feat: let automation run as a service account by @henriquehirako in https://github.com/OpenHands/automation/pull/655
- feat: record who started a manual run by @henriquehirako in https://github.com/OpenHands/automation/pull/662
- feat: name runs after Jira DC issues and Bitbucket DC pull requests by @ak684 in https://github.com/OpenHands/automation/pull/684
- feat(events): deduplicate Jira DC and Bitbucket DC events on their delivery ids by @ak684 in https://github.com/OpenHands/automation/pull/686
- feat(events): publish an Azure DevOps event catalog by @ak684 in https://github.com/OpenHands/automation/pull/687
- feat: plugin-spec automations from private repositories by @ak684 in https://github.com/OpenHands/automation/pull/696
OpenHands Cloud (Helm Chart)
- feat(openhands): add opt-in sandbox egress NetworkPolicy by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/1504
- feat(replicated): default new embedded cluster installs to a 3-day sandbox deletion time [PLTF-3913] by @dylan-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/1477
- feat(openhands): serve a customer-managed tls secret via tls.existingSecret [PLTF-3913] by @dylan-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/1478
- feat(replicated): add a certificate source option for customer-managed tls secrets [PLTF-3913] by @dylan-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/1479
Bug Fixes
Enterprise Server
- fix(auth): link logins by email based on the provider setting alone (OHE-3723) by @tofarr in https://github.com/OpenHands/enterprise/pull/986
- fix: OHE-3737: only lock out unverified users when REQUIRE_VERIFIED_EMAILS is on by @tofarr in https://github.com/OpenHands/enterprise/pull/992
- fix: Skip git-info 401 auto-logout when OAuth v2 login is enabled (OHE-3739) by @tofarr in https://github.com/OpenHands/enterprise/pull/994
- fix(security): declare certifi>=2026.10.19 floor in pyproject.toml by @neubig in https://github.com/OpenHands/enterprise/pull/981
- fix(compose): PLTF-3689 let background jobs use linked git accounts by @aivong-openhands in https://github.com/OpenHands/enterprise/pull/888
- fix(slack): show the agent server’s error when a conversation fails to start (OHE-3564) by @hieptl in https://github.com/OpenHands/enterprise/pull/1021
- fix(skills): rebuild PathTrigger from agent-server skill paths (OHE-3565) by @hieptl in https://github.com/OpenHands/enterprise/pull/1016
- fix: Clear Agent Canvas’s active backend from storage on logout (OHE-3743) by @tofarr in https://github.com/OpenHands/enterprise/pull/999
- fix(budgets): make alert thresholds editable instead of preset values (OHE-3408) by @hieptl in https://github.com/OpenHands/enterprise/pull/1022
- fix: Test linked git provider tokens on the Integrations page (OHE-3741) by @tofarr in https://github.com/OpenHands/enterprise/pull/1006
- fix(secrets): reject unsupported org secret updates and invalid names (OHE-3674) by @rajshah4 in https://github.com/OpenHands/enterprise/pull/916
- fix(secrets): bind sandbox secret lookups to the launch organization (OHE-3674) by @rajshah4 in https://github.com/OpenHands/enterprise/pull/915
- fix(codex): write rotated Codex credentials back to CODEX_AUTH_JSON (OHE-3289) by @hieptl in https://github.com/OpenHands/enterprise/pull/1018
- fix: Request offline_access so OAuth v2 Azure DevOps tokens can refresh (OHE-3817) by @tofarr in https://github.com/OpenHands/enterprise/pull/1077
- fix(integrations): serve git provider webhook routes with OAuth v2 login by @tofarr in https://github.com/OpenHands/enterprise/pull/1080
- fix(app-conversations): install .openhands/pre-commit.sh in the repository by @ak684 in https://github.com/OpenHands/enterprise/pull/1067
- fix(automations): use the provider connection of a pinned LLM profile by @henriquehirako in https://github.com/OpenHands/enterprise/pull/1041
- fix(profiles): use the provider connection wherever a saved profile becomes a live LLM by @henriquehirako in https://github.com/OpenHands/enterprise/pull/1051
- fix(auth): accept only session cookies as openhands_auth (OHE-3812) by @hieptl in https://github.com/OpenHands/enterprise/pull/1066
- fix(app-conversations): keep git tokens out of the sandbox clone URL (OHE-3812) by @hieptl in https://github.com/OpenHands/enterprise/pull/1064
- fix(auth): scope every JwtService JWS to an audience (OHE-3812) by @tofarr in https://github.com/OpenHands/enterprise/pull/1093
- fix: add direct admin user sandbox quota setter by @neubig in https://github.com/OpenHands/enterprise/pull/1071
- fix: keep intentional logout free of credentials error toasts by @ak684 in https://github.com/OpenHands/enterprise/pull/1116
- fix(skills): list the extensions public skills on the skills settings page by @tofarr in https://github.com/OpenHands/enterprise/pull/1102
- fix(org): onboard new invitees through the integrated IDP sign-up form (OHE-3825) by @hieptl in https://github.com/OpenHands/enterprise/pull/1082
- fix(auth): keep org-bound API keys in step with org membership by @henriquehirako in https://github.com/OpenHands/enterprise/pull/1047
- fix: OAuth v2 user lookup for Bitbucket Data Center and Cloud (OHE-3815) by @tofarr in https://github.com/OpenHands/enterprise/pull/1135
- fix(sandbox): scope quota cleanup to the sandbox owner by @ak684 in https://github.com/OpenHands/enterprise/pull/1153
- fix(slack): handle mentions that arrive without client_msg_id by @ak684 in https://github.com/OpenHands/enterprise/pull/1146
- fix(slack): complete the Slack install without Keycloak when OAuth v2 login is on (OHE-3876) by @tofarr in https://github.com/OpenHands/enterprise/pull/1156
- fix(jira-dc): show the Jira DC connection in Settings to members of every org by @ak684 in https://github.com/OpenHands/enterprise/pull/1192
- fix: Link OAuth provider form to provider app setup pages by @tofarr in https://github.com/OpenHands/enterprise/pull/1190
- fix(llm): never launch a managed-proxy LLM with a member’s custom key (OHE-3852) by @hieptl in https://github.com/OpenHands/enterprise/pull/1152
- fix(idp): land sign-up link invitees in their org and hide personal workspaces on Compose (OHE-3902) by @hieptl in https://github.com/OpenHands/enterprise/pull/1181
- fix(super-admin): clarify the LLM step and suggest the organization name in the install wizard (OHE-3906) by @hieptl in https://github.com/OpenHands/enterprise/pull/1189
- fix(skills): say which Git provider to connect when a private marketplace cannot be cloned (OHE-3907) by @hieptl in https://github.com/OpenHands/enterprise/pull/1182
- fix(secrets): hide edit and delete actions for the system-managed OPENHANDS_API_KEY (OHE-3879) by @hieptl in https://github.com/OpenHands/enterprise/pull/1174
- fix: name provider tokens GITHUB_TOKEN in sandbox secrets endpoints by @jpshackelford in https://github.com/OpenHands/enterprise/pull/752
- fix(compose): keep app and sandbox traffic on the Docker network by @jlav in https://github.com/OpenHands/enterprise/pull/1207
Software Agent SDK
- fix(security): pin Debian snapshot to 20261021 so system ca-certificates distrusts emSign G3 by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/6167
- fix(security): update locked Zod to 4.6.7 by @smolpaws in https://github.com/OpenHands/software-agent-sdk/pull/6202
- fix(security): ship Node.js fixed for CVE-2026-111497 (Brotli) in agent-server images by @ElanHasson in https://github.com/OpenHands/software-agent-sdk/pull/6200
- fix(llm): honor provider retry delays without retrying early by @ak684 in https://github.com/OpenHands/software-agent-sdk/pull/6274
- fix(agent-server): expand secret references in the MCP connection test by @ak684 in https://github.com/OpenHands/software-agent-sdk/pull/6157
- fix(sdk): keep a conversation loadable when an event file is missing by @CodeAlex52 in https://github.com/OpenHands/software-agent-sdk/pull/6197
- fix(llm): temporarily map exact SGLang context overflow errors by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/6301
- fix(agent-server): re-check containment for directory index.html by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/6316
- fix(sdk): never send an LLM request that ends with the assistant turn by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/6309
- fix(tools): read the current page in browser_get_content by @ak684 in https://github.com/OpenHands/software-agent-sdk/pull/6329
- fix(sdk): mask the longest overlapping secret value first by @yftx293 in https://github.com/OpenHands/software-agent-sdk/pull/6356
- fix(tools): edit a symlink’s target instead of replacing the link by @yftx293 in https://github.com/OpenHands/software-agent-sdk/pull/6358
- fix(agent-server): encrypt bash event files at rest (OHE-3812) by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/6343
- fix(llm): preserve gpt-oss reasoning across tool calls by @Oliveryfaso in https://github.com/OpenHands/software-agent-sdk/pull/6111
- fix(sdk): skip auto-loaded plugins and installed extensions that fail to load by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/6439
- fix(git): keep file names verbatim in git changes and commit changes by @enyst in https://github.com/OpenHands/software-agent-sdk/pull/5782
- fix(sdk): match the URL scheme case-insensitively when redacting credentials by @yftx293 in https://github.com/OpenHands/software-agent-sdk/pull/6380
- fix(sdk): report auto-load marketplace and plugin failures to the user by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/6460
- fix(mcp): start each MCP server separately so one failing server drops only its own tools by @ak684 in https://github.com/OpenHands/software-agent-sdk/pull/6480
- fix(agent-server): fetch apt packages over HTTPS and pin the Debian base by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/6502
- fix(plugin): percent-encode secret values in plugin source URL user info by @ak684 in https://github.com/OpenHands/software-agent-sdk/pull/6511
Runtime API
- fix(snapshots): skip re-snapshot while the old VolumeSnapshot is terminating by @simonrosenberg in https://github.com/OpenHands/runtime-api/pull/774
- fix(security): distrust compromised eMudhra/emSign CAs (certifi/pip/uv) by @neubig in https://github.com/OpenHands/runtime-api/pull/777
Automation
- fix: trust ingress forwarded headers by @Linxiushen in https://github.com/OpenHands/automation/pull/305
- fix(presets): fail the run when a configured repository cannot be cloned by @ak684 in https://github.com/OpenHands/automation/pull/651
- fix: let org admins and owners edit other users’ automations by @jpelletier1 in https://github.com/OpenHands/automation/pull/678
- fix: allow cloud plugin sources on any HTTPS git host by @ak684 in https://github.com/OpenHands/automation/pull/682
- fix: retry git sync auth as Bearer when Basic x-access-token is rejected by @ak684 in https://github.com/OpenHands/automation/pull/683
OpenHands Cloud (Helm Chart)
- fix(replicated): retry a deploy call that gets no reply from kotsadm by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/1487
- fix(keycloak): import enterprise SAML profile attributes by @rajshah4 in https://github.com/OpenHands/OpenHands-Cloud/pull/1423
- fix(infra): check Sysbox host prerequisites before deployment by @ak684 in https://github.com/OpenHands/OpenHands-Cloud/pull/1520
- fix(openhands): add an opt-in cronjob that bounds clickhouse system logs [PLTF-3913] by @dylan-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/1481

