OpenHands Agent Canvas turns your coding agents into a self-hosted, always-on engineering team. It's a developer control center for starting conversations and automating everyday tasks — like generating reports that publish to Slack or automatically decomposing GitHub issues into tasks.
It runs locally on your machine by default, but can connect to multiple “agent backends”, e.g. running agents in Docker containers, on VMs, or within your company infrastructure. You can optionally choose to run agents on OpenHands Cloud or OpenHands Enterprise infrastructure.
Agent Canvas runs the open source OpenHands agent out-of-the-box, but can use third-party agents such as Claude Code, Codex, Gemini CLI, Pi, and OpenCode.
You can install OpenHands to run agents on any machine: on your laptop, on a dedicated computer like a Mac Mini,
or on a server in the cloud.
The most powerful way to run OpenHands is on a server in the cloud. This allows your agents to continue running
even when your laptop is shut, and makes it easier to trigger your agents through third-party services
like Slack, GitHub, and Datadog. See SELF_HOSTING.md for details, especially with respect to security hardening.
Notably, you can run the backend in multiple different environments, and switch between
them from the same Agent Canvas frontend. E.g. you can share an Agent Server with your team for agents doing
code review and dependency updates, then have your personal agents running on your laptop.
Option 1: Without a Sandbox
[!WARNING]
This runs the agent-server directly on the machine you're installing on — the agent will have full access to your filesystem!
On Linux Docker Engine, uid 10001 inside the container must be able to read
and write the workspace and its existing files. Grant that user access using
appropriate ownership or ACLs for your system. For a dedicated workspace you are
comfortable sharing with all local users, the following is another option:
find "$PROJECTS_PATH" -type d -exec chmod a+rwX {} +
find "$PROJECTS_PATH" -type f -exec chmod a+rw {} +
These commands grant all host users access to the workspace. Keep it separate
from ~/.openhands and other sensitive data. Docker Desktop on macOS/Windows
handles bind-mount permissions, so those commands are normally unnecessary.
Open http://localhost:8000/canvas. Reuse openhands-state to retain state across container removals. A fresh volume does
not contain existing ~/.openhands data; inspect or back it up with docker volume inspect openhands-state.
Linux permission troubleshooting and existing state
If startup reports Permission denied, check access to the path named in the
error. On SELinux hosts, check whether the bind mount needs a :z or :Z label.
If you bind-mount existing ~/.openhands state instead of the named volume,
uid 10001 needs access to its directories, existing key files and automation
database. Grant access using ownership or ACLs while keeping keys private.
Making state directories writable by all users can let another local user
replace the session key; do not use recursive world-writable permissions there.
Keep the default container user. An override can make the browser configuration
directory inaccessible. If you override the user, configure a writable XDG_CONFIG_HOME and ensure state and workspace mounts are accessible.
[!NOTE]
The entrypoint stops the container with exit code 1 when the Agent Server stops answering
its /alive check for about 30 seconds, so a crash or hang fails visibly instead of leaving
a container that returns 502 for every request.
Automatic recovery needs a restart policy: use --restart unless-stopped instead of --rm, or restart: unless-stopped in Docker Compose.
The agent will be able to access any project under PROJECTS_PATH.
Option 3: With Multiple Docker Sandboxes
Run each new conversation in its own Docker container, with its own Agent Server and tools. This is useful for running several agents concurrently. Canvas and the outer Agent Server run on your host and route conversation requests to the containers.
Prerequisites: Node.js 24 or later, uv, and a running Docker Desktop (macOS) or Docker Engine/Desktop (Linux). The user starting Canvas must be able to run docker commands.
Open http://localhost:8000 and start a new conversation. Existing local conversations are not converted. Each container mounts its conversation's workspace and persisted state, so workspace files and conversation history survive container replacement. Conversations using the same host workspace still share those files; choose separate directories or worktrees to avoid conflicting edits.
This setting isolates conversation execution; it does not move the entire Canvas or automation service into a sandbox. For Windows, see README.windows.md.
Option 4: From Source
[!WARNING]
This runs the agent-server directly on the machine you're installing on — the agent will have full access to your filesystem!
Prerequisites: Node.js 24 or later, npm 11.12.1 (the repository pin), uv (for running the agent server via uvx)
Check npm --version before resolving dependencies. The seven-day release-age
filter (npm install --min-release-age=7) requires npm >=11.10; older versions
do not enforce it. Use npm ci to replay the committed lockfile. This npm
requirement is for contributor dependency resolution, not for installing the
published Canvas package.
git clone https://github.com/OpenHands/OpenHands.git
cd OpenHands
npm ci
npm run dev
Local (npx / npm run dev) listeners bind loopback only (127.0.0.1) so the auto-injected session key is not reachable from other machines on the network. To listen on all interfaces, pass --host 0.0.0.0 (or set OH_BIND_HOST); the session key is then not injected and the UI uses the same API-key entry screen as --public.
Docker listens on all container interfaces so port publishing works, but does not inject its session key into HTML by default. The quickstart above explicitly enables injection while publishing the host port on 127.0.0.1 only. If you publish Docker on a LAN or public interface, omit AGENT_CANVAS_ALLOW_LAN_SESSION_KEY and enter the API key in the UI. Set LOCAL_BACKEND_API_KEY to a strong value, or retrieve the generated value with docker exec <container> sh -c 'cat "$STATE_DIR/api-key.txt"'. For internet-facing installs, follow self-hosting.
Architecture
Agent Canvas is powered by the OpenHands Agent Server, a REST API for running multiple agents on a single machine. Each Agent Server runs on a single host/port; the Agent Canvas can connect to multiple Agent Servers and easily flip between them.
You can run an Agent Server anywhere:
Directly on your laptop (be careful!)
On a dedicated machine like a Mac Mini
On a virtual machine in the cloud
Inside OpenHands Cloud (our commercial offering)
The Agent Server is often paired with an Automation Server, which lets you set up agents that run on a schedule or in response to events.
Repository boundaries
Agent Canvas is part of a multi-repository OpenHands system. Changes should go to the repository that owns the behavior:
Automation definitions, scheduling, webhooks, run history, and dispatching.
The Agent Server API is implemented by the SDK and consumed through the TypeScript client by Agent Canvas. The automation service decides when work runs and dispatches conversations to the Agent Server/SDK, which decides what runs. See AGENTS.md for contributor-specific boundaries and the required custom code-review guide.
What is OpenHands? OpenHands is a coding tool listed on Scriptiii AI Tools. Open-source platform for AI software development agents that run in sandboxed environments. Pricing: Free. Free to use. Best for: ai-agents, coding-agent, autonomous-agent.
Questions & answers
Everything you need to know about OpenHands
What is OpenHands?
OpenHands is a coding tool. Open-source platform for AI software development agents that run in sandboxed environments.
What does OpenHands cost?
Free. Free to use.
What is OpenHands best for?
ai-agents, coding-agent, autonomous-agent. It is filed under Coding.