OpenHands Cloud (the hosted SaaS at app.all-hands.dev) and
OpenHands Enterprise (the self-hosted product) run the same codebase. The open-source
OpenHands project provides the core agent and
application server, and an enterprise layer adds SaaS-specific concerns on top: Keycloak
authentication, organizations and billing, Git-provider app integrations with
webhooks, chat/ticketing integrations, the Automation service, and license/telemetry
tooling. See Enterprise vs. Open Source for a full
feature comparison.
How It Works
A user’s browser talks to the OpenHands application (server + frontend), which coordinates with Keycloak for identity, a LiteLLM proxy for LLM calls, and the Runtime API for spinning up isolated sandboxes where the coding agent actually runs. Optional services extend this core with scheduled/event-driven automations, plugins, and richer integrations. The core loop is:- A user (or a webhook from GitHub, GitLab, Slack, Jira, or Linear) creates or resumes a conversation.
- The OpenHands app authenticates the request (via Keycloak-issued cookies/tokens) and asks the Runtime API for a sandbox.
- Runtime API assigns a warm (pre-started) or freshly created Runtime pod — an isolated sandbox running the agent server.
- The agent in the sandbox calls out through the LiteLLM proxy to the configured LLM provider, executes tools (bash, file edits, browser, git), and streams events back to the app and browser.
- The agent can push commits, open PRs/MRs, and comment back on the originating issue/PR/message through the relevant Git provider or chat/ticketing integration.
- Conversation state and artifacts are persisted to PostgreSQL, Redis (cache/sessions), and an object store (S3/GCS/MinIO — the “conversation bucket”).
Components And Services
Core Components
These are present in every deployment.Enterprise Supporting Services
Optional Platform Services
These ship as independently toggled services alongside the core deployment:Integration Adapters
Each Git, chat, or ticketing integration (GitHub, GitLab, Bitbucket, Bitbucket Data Center, Azure DevOps, Jira, Jira Data Center, Linear, Slack) follows the same pattern: an integration router receives an HMAC-signed webhook, an integration manager resolves the org/user and applies filters, a conversation is started in a sandbox, and a callback processor posts the result back to the external service once the agent finishes. Each adapter is independently enabled, and only wires up its webhook router if the corresponding OAuth app credentials are configured. See the Azure DevOps, Bitbucket Data Center, Jira Data Center, and Slack integration guides.Required Vs. Optional External Systems
Required For Any Deployment
Optional, Feature-Gated
Deployment Topology Notes
- Sandboxes (“Runtimes”) can run in the same Kubernetes cluster as the rest of the stack, or in a separate cluster reachable by the Runtime API — useful for isolating untrusted agent workloads from the control plane, or for scaling sandbox capacity independently.
- A warm runtime pool is maintained so new conversations can claim an already-running sandbox instead of waiting for a cold pod to schedule.
- Production deployments should use managed PostgreSQL (for example, RDS or Cloud SQL) instead of an in-cluster database, and real S3 or GCS instead of bundled MinIO. See the Sizing Guide for capacity planning based on peak concurrent sandboxes.
Next Steps
Enterprise vs. Open Source
Compare OpenHands Enterprise against Agent Canvas and OpenHands Cloud.
Sizing Guide
Size your deployment from peak concurrent sandboxes.
Kubernetes Installation
Deploy OpenHands Enterprise into your own Kubernetes cluster using Helm.
Conversations And Sandboxes
Understand how conversations map onto sandboxes and Agent Servers.

