Skip to main content
This page explains how OpenHands Enterprise (OHE) and OpenHands Cloud are built: the overall solution, the individual components/services that make it up, and which external systems are required versus optional.
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:
  1. A user (or a webhook from GitHub, GitLab, Slack, Jira, or Linear) creates or resumes a conversation.
  2. The OpenHands app authenticates the request (via Keycloak-issued cookies/tokens) and asks the Runtime API for a sandbox.
  3. Runtime API assigns a warm (pre-started) or freshly created Runtime pod — an isolated sandbox running the agent server.
  4. 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.
  5. 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.
  6. 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.