{
  "manifest_version": "1",
  "slug": "openhands",
  "title": "OpenHands",
  "headline": "Self-host OpenHands",
  "description": "Self-host OpenHands Agent Canvas on an exe.dev VM: the web UI behind exe.dev login, each conversation in its own Docker sandbox, and models with no API keys.",
  "category": "ai-agents",
  "tags": [
    "openhands",
    "openhands agent canvas",
    "self-hosted openhands",
    "opendevin",
    "autonomous coding agent",
    "docker sandbox",
    "devin alternative"
  ],
  "url": "https://exe.dev/deploy/openhands",
  "markdown_url": "https://exe.dev/deploy/openhands.md",
  "upstream": {
    "website": "https://openhands.dev/",
    "source": "https://github.com/OpenHands/OpenHands",
    "docs": "https://docs.openhands.dev/",
    "license": "MIT"
  },
  "example_vm_name": "my-openhands",
  "time": "15 minutes",
  "stack": [
    {
      "name": "Agent Canvas 1.40",
      "detail": "@openhands/agent-canvas from npm on Node.js 24, as a systemd service",
      "port": 8000,
      "data": "~/.config/agent-canvas (API key)"
    },
    {
      "name": "Agent Server 1.62",
      "detail": "started by Agent Canvas; runs conversations, settings, secrets and automations",
      "data": "~/.openhands"
    },
    {
      "name": "Docker sandboxes",
      "detail": "one ghcr.io/openhands/agent-server container per conversation, with only its project folder mounted",
      "data": "~/projects"
    }
  ],
  "access": [
    {
      "url": "https://my-openhands.exe.xyz/",
      "who": "private",
      "what": "Agent Canvas in your browser, behind exe.dev login and OpenHands' API key"
    },
    {
      "url": "ssh my-openhands.exe.xyz",
      "who": "private",
      "what": "your terminal, for the API key and upkeep"
    }
  ],
  "delivers": [
    "Agent Canvas 1.40.0 running as a service on port 8000, back after a reboot",
    "Conversations in Docker sandboxes by default, one container per conversation, with only its project folder mounted",
    "The OpenHands agent on Claude Sonnet 5.5 through exe.dev's LLM integration, with no API key to paste",
    "A random backend API key in `~/.config/agent-canvas/env`, readable only by you",
    "A project at `~/projects/hello` and a setup-check conversation that ran in a container and answered `42`"
  ],
  "deployable": true,
  "deploy": {
    "new_vm_url": "https://exe.dev/new?prompt=Set%20up%20OpenHands%20on%20this%20VM%20by%20following%20the%20exe.dev%20recipe%20at%20https%3A%2F%2Fexe.dev%2Fdeploy%2Fopenhands.md%20from%20top%20to%20bottom.%0A%0AThe%20recipe%27s%20example%20VM%20name%20is%20my-openhands.%20This%20VM%27s%20name%20is%20the%20output%20of%20%60hostname%60%3A%20use%20it%20wherever%20the%20recipe%20writes%20my-openhands.%20Skip%20the%20step%20that%20creates%20the%20VM%3B%20you%20are%20on%20it.%0A%0AYou%20are%20done%20when%20all%20of%20these%20are%20true.%20Check%20each%20one%20yourself%3A%0A-%20Agent%20Canvas%201.40.0%20running%20as%20a%20service%20on%20port%208000%2C%20back%20after%20a%20reboot%0A-%20Conversations%20in%20Docker%20sandboxes%20by%20default%2C%20one%20container%20per%20conversation%2C%20with%20only%20its%20project%20folder%20mounted%0A-%20The%20OpenHands%20agent%20on%20Claude%20Sonnet%205.5%20through%20exe.dev%27s%20LLM%20integration%2C%20with%20no%20API%20key%20to%20paste%0A-%20A%20random%20backend%20API%20key%20in%20%60~%2F.config%2Fagent-canvas%2Fenv%60%2C%20readable%20only%20by%20you%0A-%20A%20project%20at%20%60~%2Fprojects%2Fhello%60%20and%20a%20setup-check%20conversation%20that%20ran%20in%20a%20container%20and%20answered%20%6042%60%0A%0ARun%20the%20VM-side%20commands%20in%20%22Install%20by%20hand%22%20only%2C%20from%20%22Install%20Agent%0ACanvas%22%20on.%20Verify%20that%20%60systemctl%20is-active%20agent-canvas%60%20says%20active%2C%0Athat%20%60curl%20-s%20-o%20%2Fdev%2Fnull%20-w%20%27%25%7Bhttp_code%7D%27%20localhost%3A8000%2Fapi%2Fsettings%60%0Aprints%20%60401%60%20%28the%20API%20key%20is%20on%29%2C%20and%20that%20the%20setup%20check%20prints%0A%60%7B%22response%22%3A%2242%22%7D%60.%20Never%20print%20the%20API%20key%20in%20your%20messages.%20Skip%20the%0Abackup%2C%20update%20and%20troubleshooting%20sections%20and%20the%20FAQ.%20Finish%20by%0Agiving%20the%20owner%20the%20browser%20URL%20and%20the%20command%20from%20%22Open%20OpenHands%22%0Athat%20prints%20the%20API%20key%2C%20with%20this%20VM%27s%20name%2C%20and%20tell%20them%20to%20follow%0A%22Open%20OpenHands%22%2C%20unticking%20the%20usage-data%20box%20if%20they%20prefer.%0A%0AFinish%20with%20the%20URLs%20I%20should%20open.%0A",
    "terminal": "curl -fsSL https://exe.dev/deploy/openhands/prompt.txt | ssh exe.dev new --prompt=/dev/stdin",
    "prompt": "Set up OpenHands on this VM by following the exe.dev recipe at https://exe.dev/deploy/openhands.md from top to bottom.\n\nThe recipe's example VM name is my-openhands. This VM's name is the output of `hostname`: use it wherever the recipe writes my-openhands. Skip the step that creates the VM; you are on it.\n\nYou are done when all of these are true. Check each one yourself:\n- Agent Canvas 1.40.0 running as a service on port 8000, back after a reboot\n- Conversations in Docker sandboxes by default, one container per conversation, with only its project folder mounted\n- The OpenHands agent on Claude Sonnet 5.5 through exe.dev's LLM integration, with no API key to paste\n- A random backend API key in `~/.config/agent-canvas/env`, readable only by you\n- A project at `~/projects/hello` and a setup-check conversation that ran in a container and answered `42`\n\nRun the VM-side commands in \"Install by hand\" only, from \"Install Agent\nCanvas\" on. Verify that `systemctl is-active agent-canvas` says active,\nthat `curl -s -o /dev/null -w '%{http_code}' localhost:8000/api/settings`\nprints `401` (the API key is on), and that the setup check prints\n`{\"response\":\"42\"}`. Never print the API key in your messages. Skip the\nbackup, update and troubleshooting sections and the FAQ. Finish by\ngiving the owner the browser URL and the command from \"Open OpenHands\"\nthat prints the API key, with this VM's name, and tell them to follow\n\"Open OpenHands\", unticking the usage-data box if they prefer.\n\nFinish with the URLs I should open.\n",
    "prompt_url": "https://exe.dev/deploy/openhands/prompt.txt"
  },
  "updated": "2026-11-13",
  "verified": "2026-11-13",
  "related": [
    "openchamber",
    "opencode",
    "claude-code",
    "openshell",
    "t3code",
    "openclaw"
  ],
  "alternatives": [
    "OpenHands Cloud",
    "Devin"
  ]
}
