The Problem
Development teams spend considerable time orchestrating code‑generation, review, and integration loops, especially when multiple LLMs and external services (GitHub, Slack, Jira) are involved. Manual scripting of these steps leads to inconsistent results and high operational overhead.
What This Does
OpenHands supplies an end‑to‑end, agent‑centric platform that automates development actions (e.g., PR creation, issue triage) through composable Python agents. The core SDK lives in the repository root (software‑agent‑sdk is referenced from the README) and is imported via the enterprise/ package, which contains the production‑grade integrations and database models.
Key directories: enterprise/ – source‑available enterprise edition, includes Django settings, Alembic migrations, and integrations such as enterprise/integrations/github/, enterprise/integrations/slack/, and enterprise/integrations/jira/. .github/workflows/ – CI pipelines for linting, unit/e2e tests, Docker image builds, and release publishing (py-tests.yml, e2e-tests.yml, ghcr-build.yml). containers/ – Dockerfiles for the application (containers/app/Dockerfile) and a development environment (containers/dev/Dockerfile).
Agents are defined under .agents/skills/ as markdown specifications that the SDK parses into executable tasks (e.g., update-sdk, cross-repo-testing).
How To Use It
Setup
Build the development container (Dockerfile at containers/dev/Dockerfile) docker compose -f containers/dev/compose.yml up --build -d
Alternatively, use the Makefile targets
make dev # defined in root Makefile → invokes containers/dev/dev.sh
The docker-compose.yml at the repository root also defines the production stack (services: app, db, redis).
Configuration
Create a .env file (referenced by enterprise/.env.example in the enterprise/ folder) with keys required by integrations: GITHUBAPPID, GITHUBPRIVATEKEY, SLACKBOTTOKEN, JIRAAPITOKEN, etc. Database URL is read from DATABASEURL (used by Django’s settings.py in enterprise/init.py). LLM provider credentials are expected in OPENHANDSLLMAPIKEY (checked in enterprise/integrations/solvability/utils.py).
Running
Start the API server (entrypoint defined in containers/app/entrypoint.sh) docker exec -it openhandsapp python -m manage runserver 0.0.0.0:8000
Or invoke the CLI directly from the SDK:
python -m openhands.cli run --agent mycustomagent.py --config config.yaml
The CLI entry point is openhands/cli/main.py (exposed via the openhands-cli package).
Real‑World Use
A SaaS team can automate PR reviews: a scheduled job calls the githubservice to list open PRs, then triggers the cross-repo-testing agent defined in .agents/skills/cross-repo-testing/SKILL.md. The agent runs tests, comments results back to GitHub, and updates a Slack channel via enterprise/integrations/slack/slackmanager.py. Example snippet:
from openhands.sdk import AgentRunner runner = AgentRunner(skill="cross-repo-testing") runner.execute(prurl="https://github.com/org/repo/pull/42")
Code Health & Issues
Low – Missing explicit entry‑point documentation – README refers to CLI and GUI but does not list the exact module path; users must infer from openhands/cli/main.py. Medium – Environment variable leakage risk – .env.example files are present, but no .env.sample is version‑controlled; accidental commit of real keys is possible. Low – Limited test coverage – Only five test files (tests/) exist; many integration modules (e.g., enterprise/integrations/stripe_service.py) lack unit tests. Low – Docker multi‑stage builds – Dockerfiles are straightforward but do not pin base images, potentially leading to nondeterministic builds. Low – License present – MIT license is included (LICENSE). Low – CI/CD present – GitHub Actions cover linting, unit/e2e tests, and image publishing, indicating a mature pipeline.
Overall, the repository shows a coherent structure, consistent use of Django migrations, and a complete CI suite. The primary gaps are sparse test coverage and reliance on undocumented environment variables.
The Bottom Line
OpenHands delivers a functional, container‑ready platform for AI‑driven development automation, with solid CI pipelines and clear separation of enterprise integrations. It is best suited for teams that can manage Docker environments and are comfortable configuring external service credentials. Solo developers may find the setup overhead and limited test suite a hurdle, while larger organizations will benefit from the extensible agent SDK and enterprise‑grade features.