OpenHands Local Setup: 12 Steps, 60 Min [2026] OpenHands now ships its local experience through Agent Canvas, a browser client that connects to local, self-hosted, cloud or enterprise backends and runs agents against repositories on the user's disk, with a full local setup taking about 60 minutes. OpenHands said Agent Canvas releases v1.17.0 through v1.24.0 added agent profiles, isolated Docker runtimes, per-conversation containers and automation support plus 64 bug fixes, and version 1.27.0 added DigitalOcean Managed Agents support in public preview as of October 13, 2026. The setup pairs the Canvas client, an Agent Server and an Ollama-served model such as Qwen3.6-35B-A3B, and OpenHands co-founder and chief scientist Graham Neubig said in the October 21, 2026 Recursive Flint announcement that developers should be free to pick the best model for their workload. OpenHands now delivers its local experience through Agent Canvas, a browser client that connects to local, self-hosted, cloud or enterprise backends. The OpenHands changelog tracker https://agentbreakingchanges.com/tools/openhands/ logs releases and breaking changes, and it shows how quickly the pieces move. Pair that client with a model server on your own machine and your source code never leaves your network. A working OpenHands local setup takes about 60 minutes to build and ends with an agent that fixes a failing test inside a sandboxed container. OpenHands’ own local-LLM page still tells newcomers to start with Qwen3.6-35B-A3B, an open-weight mixture-of-experts model built for agentic coding. Newer options have landed since, including Recursive Flint https://shattered.io/recursive-flint-40b-moe-coding-model-2026/ , announced October 21, 2026. Ollama serves the model, one environment file pins it, and a model swap becomes a one-line change. A terminal-first route exists too. A separate walkthrough covers a self-hosted AI coding assistant built on Qwen Code https://shattered.io/self-hosted-ai-coding-assistant-qwen-code-2026/ . OpenHands covers different ground: a browser workspace, one container per conversation, and saved model profiles you can switch between mid-project. Don't miss new tech stories on Google Add Shattered once in the Google app and our stories show up in your news suggestions. Add now https://www.google.com/preferences/source?hl=en&q=https%3A%2F%2Fshattered.io%2F What OpenHands Agent Canvas Is in October 2026 Agent Canvas is the current local-facing product name. It connects to self-hosted model endpoints and runs agents against repositories on your disk. The official docs describe the launcher as an all-in-one stack: the Canvas client, an Agent Server, an Automation Server and an ingress proxy, all started by a single agent-canvas command. The older single-container GUI is a different thing. The local-LLM page’s quickstart still launches that older container image, so treat its Docker command as dated and borrow only its model settings. The product changed a lot over the last few months. By October 7, OpenHands said Agent Canvas releases v1.17.0 through v1.24.0 had added agent profiles, isolated Docker runtimes, per-conversation containers and automation support, along with 64 bug fixes across the September series. Version 1.27.0 followed by October 13 with DigitalOcean Managed Agents support, which was still in public preview on that date. Later builds keep arriving, so run agent-canvas --version after installing and judge your copy against the release notes rather than against this article. Three layers make up a working local setup, and knowing which layer makes which network call will save you hours. - The client. A browser tab at http://localhost:8000 where you start conversations, pick workspaces and manage LLM profiles. - The Agent Server. The process that runs the agent loop, executes shell commands and edits files. In per-conversation Docker mode, this loop runs inside a container, not on your host. - The model server. Ollama here. It exposes an OpenAI-compatible API, and the Agent Server calls it for every reasoning step. That last point drives most setup failures. The model URL has to be reachable from wherever the agent loop runs, which is not always the machine your browser sits on. Terminal tools such as Aider with a local Ollama model https://shattered.io/aider-local-ai-coding-assistant-ollama-git-2026/ keep one process and one repository in view, so they never hit this split. Agent Canvas separates the pieces on purpose, and that separation buys you sandboxing, parallel conversations and a client you can point at a remote GPU box later. Graham Neubig, co-founder and chief scientist at OpenHands, framed the project’s stance in the October 21 Flint announcement: developers should be free to pick the best model for their workload, infrastructure and cost. Every choice below follows from that idea. The agent stays constant while the model underneath it stays replaceable. Why Self-Host the Model, and What the Bill Looks Like Privacy is the usual reason. A coding agent reads your repository, your environment files and often your test fixtures. Keeping inference on a box you control removes one whole category of data-handling questions. Cost is the second reason, though it cuts both ways. Running models on your own hardware is free and unlimited in software terms, and Ollama’s local use carried no charge as of October 25, 2026. You still pay for the GPU, the electricity and the time you spend tuning. The table lays out the options side by side, using the prices listed on the vendors’ own pages this week. | Path | Software cost | Where inference runs | Catch | |---|---|---|---| | Agent Canvas + Ollama on your hardware | $0 | Your machine | You supply the GPU or unified memory | | Ollama Pro | $20/month or $200/year | Ollama cloud and local | Cloud models leave your network | | Ollama Team | From $500/month | Ollama cloud and local | Listed as early access | | OpenHands Cloud Teams | $499/month for up to 10 users | OpenHands-managed | Extra seats cost $50/month each | | OpenHands Cloud trial | 30 days | OpenHands-managed | Trial of the Teams plan | | OpenHands Enterprise | Custom pricing | Your infrastructure | No public price confirmed | Local models trail the best hosted ones on hard, multi-file work. A recent Claude Opus 5.5 versus GPT-6 Astra terminal benchmark comparison https://shattered.io/claude-opus-5-5-vs-gpt-6-astra-terminal-bench-2026/ shows how far the top hosted tier has pulled ahead on long-horizon terminal tasks. The practical answer is a split: route routine refactors, test fixes and codebase questions to the local model, and keep a hosted profile saved for the rare job that needs more. Agent Canvas supports saved profiles, so the split costs you one dropdown. Ollama’s pricing page also changed shape this year. Per the company’s August 31 announcement, its Pro, Max and Team plans moved to per-token pricing with usage included on every plan. None of that touches the local path, but it explains why Ollama now lists cloud-hosted models next to local ones. Check which kind a tag is before you pull it. Prerequisites and Versions to Check First Verify each item before an OpenHands local setup begins, because a missing prerequisite produces errors that look unrelated to the real cause. Agent Canvas uses uv to run its local agent server, so a missing uv breaks startup even when Node is fine. | Component | Version or minimum | Check command | |---|---|---| | Node.js | 24 or later | node --version | | npm | Ships with Node.js | npm --version | | uv | Current release | uv --version | | Docker | Daemon running Desktop on macOS and Windows, Engine on Linux | docker ps | | Ollama | v0.40.11 October 24, 2026 or newer | ollama --version | | Python | Not listed | python3 --version | | Agent Canvas | Latest from npm | agent-canvas --version | | Memory for Qwen3.6-35B-A3B | 24 GB VRAM quantized or 64 GB Apple Silicon unified memory | nvidia-smi or About This Mac | The Ollama row comes from the Ollama blog and release feed https://ollama.com/blog?trk=public post main-feed-card-text , which lists v0.40.11 as the newest build. The memory row comes from OpenHands’ local-LLM page. If you have less than that, you can still follow every step with a small model for plumbing tests. Ollama’s own quickstart uses gemma4:e2b , a download of about 7.2 GB that it says wants 8 GB of VRAM or unified memory, and notes that systems with less can spill into system RAM at a speed cost. A model that small will not drive an agent well. Use it to prove the wiring, then move up. Buying hardware for this? Unified-memory machines suit big mixture-of-experts models, since the weights have to fit somewhere. Our look at RTX Spark PCs with large unified memory https://shattered.io/nvidia-rtx-spark-n1x-october-launch-2026/ covers that class of machine. Recursive reported its Flint numbers on a 64 GB RTX Spark, which is the kind of box the vendor had in mind. Windows users should run everything in PowerShell or inside WSL2. The Agent Canvas docs call out macOS, Linux, Windows with PowerShell and Windows with WSL2 as the supported targets and say mobile Linux environments like Termux are not a primary target. Budget your time like this: 10 minutes for Ollama, 10 for the context settings, 10 for Agent Canvas, 15 for the profile and sandbox, and 15 for the demo task and the launcher script. Steps 1 and 2: Install Ollama and Pull the Model Step 1: install Ollama. Download the installer for macOS or Windows from ollama.com. On Linux, the official one-line installer works: curl -fsSL https://ollama.com/install.sh | sh ollama --version The second command should print a version at or above 0.40.11. Reviewers now describe Ollama as a local-and-cloud runtime, a shift covered in The Latent Daily’s Ollama review https://www.thelatentdaily.com/reviews/ollama-review/ . That matters for you because the app can sign in to a cloud account and list hosted models next to local ones. Stay signed out if the goal is to keep every token on your machine. Step 2: pull a smoke-test model, then the real one. Start small. A 7.2 GB download finishes quickly and proves that Ollama can load a model and answer a prompt before you commit to a much larger file. ollama pull gemma4:e2b ollama run gemma4:e2b "Reply with the single word ready." Once that works, pull the model OpenHands recommends. The tag below comes straight from the OpenHands local-LLM page. Expect a large download, so start it and move on to the next section while it runs. ollama pull qwen3.6:35b-a3b ollama list Expected output from ollama list looks like this. Sizes and IDs will differ on your machine. NAME ID SIZE MODIFIED qwen3.6:35b-a3b a1b2c3d4e5f6 ~20 GB 2 minutes ago gemma4:e2b f6e5d4c3b2a1 7.2 GB 9 minutes ago The exact size depends on the quantization the tag resolves to. If the name column shows anything other than the tags you typed, stop and check for a typo before moving on, because every later step references this tag by name. Keep the tag in one place from now on. The launcher script in step 12 stores it in a single environment variable, MODEL TAG , so a future swap to a newer model touches one line. One more habit pays off early. Pick a model by its tool-calling behavior, not its benchmark headline. OpenHands’ agent loop leans on structured tool calls for every file edit and shell command, and some local models answer in prose instead of calling tools. The troubleshooting section covers what that failure looks like and which models the OpenHands docs say the community has had luck with. Steps 3 and 4: Raise the Context Window and Prove the Endpoint Works Step 3: set the context length before anything else talks to Ollama. This is the single most common reason a local OpenHands setup misbehaves. OpenHands needs a large context to function. The docs recommend at least 22,000 tokens on lower-VRAM systems and 32,768 for better results, and they warn that Ollama’s 4,096-token default is too small to fit even the system prompt, so the agent behaves incorrectly. Three variables do the work: export OLLAMA CONTEXT LENGTH=32768 export OLLAMA HOST=0.0.0.0:11434 export OLLAMA KEEP ALIVE=-1 nohup ollama serve ollama.log 2 &1 & OLLAMA HOST=0.0.0.0 makes Ollama listen on every interface so Docker containers can reach it. OLLAMA KEEP ALIVE=-1 keeps the model loaded between requests, which saves a long reload each time the agent pauses. If you start Ollama by hand as above, the variables apply. If Ollama already runs as a background service, they do not, and that mismatch causes many of the mystery failures later. Set them where the service reads them. Linux systemd : add the variables to the service sudo systemctl edit ollama.service In the editor, add: Service Environment="OLLAMA CONTEXT LENGTH=32768" Environment="OLLAMA HOST=0.0.0.0:11434" Environment="OLLAMA KEEP ALIVE=-1" sudo systemctl daemon-reload sudo systemctl restart ollama macOS menu bar app : set, then quit and reopen Ollama launchctl setenv OLLAMA CONTEXT LENGTH 32768 launchctl setenv OLLAMA HOST "0.0.0.0:11434" launchctl setenv OLLAMA KEEP ALIVE -1 Binding to 0.0.0.0 has a cost. Anyone on your network can now reach an unauthenticated model endpoint. On a laptop at home that may be acceptable, but on a shared network it is not. Either block port 11434 from outside with your host firewall, or bind to the Docker bridge address only. Run ip addr show docker0 on Linux to find that address, which is commonly 172.17.0.1 by default. Step 4: prove the endpoint answers over the OpenAI-compatible API. OpenHands will talk to /v1 , so test that exact path, not Ollama’s native one. First list the models: curl -s http://127.0.0.1:11434/v1/models {"object":"list","data": {"id":"qwen3.6:35b-a3b","object":"model","created":1792000000,"owned by":"library"},{"id":"gemma4:e2b","object":"model","created":1791990000,"owned by":"library"} } The id field is the exact string you will paste into OpenHands later, so copy it from here. Now send one real chat request: curl -s http://127.0.0.1:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer local-llm" \ -d '{"model":"qwen3.6:35b-a3b","messages": {"role":"user","content":"Reply with the single word ready."} ,"max tokens":32}' A healthy reply contains a choices array with a message and a usage block. Ollama ignores the bearer token, which is why the placeholder local-llm works, and OpenHands expects some string in its API key field for the same reason. The first call after loading a big model can take a while because the weights have to move into memory. If it hangs for minutes, check ollama.log for out-of-memory messages before you blame the network. Steps 5 and 6: Install Agent Canvas and Confirm It Starts Step 5: choose an install method. The official docs list five. Three matter here, and the choice decides what the agent can touch. - npm global install. The quickest route to a reusable agent-canvas command. Everything runs on your host with your user’s permissions. - npx. Same behavior with no global install, good for a first look or when a PATH problem blocks the global command. - Docker. The whole stack inside one container, with only the directories you mount visible to the agent. The npm install comes first, and per-conversation Docker sandboxes follow in step 9. That combination keeps the Canvas client and outer server on the host while each agent session gets its own hardened container. The Docker-only route is a fair alternative if you prefer one moving part, and the commands are below. node --version uv --version npm install -g @openhands/agent-canvas agent-canvas --version Alternative: whole stack in Docker macOS and Linux mkdir -p ~/projects docker run -it --rm \ -p 127.0.0.1:8000:8000 \ -v openhands-data:/home/openhands/.openhands \ -v ~/projects:/projects \ ghcr.io/openhands/agent-canvas:latest Use the named volume openhands-data exactly as shown. The 127.0.0.1: prefix on the port mapping keeps the agent reachable from your machine only. In Docker mode the UI lives at http://localhost:8000/canvas . Step 6: start it and confirm the backend connects. Run the command with no flags to launch the full local stack: agent-canvas busy port? pick another: agent-canvas --port 3000 Open http://localhost:8000 . The default local backend should show as connected. If the browser stays blank, read the terminal where you launched it. The usual causes are a missing prerequisite, a busy port or a stopped Docker daemon. Useful flags to know now: --backend-only starts a headless backend, --frontend-only serves just the UI, --info prints stack details, and --public opens the server beyond localhost but refuses to start without a LOCAL BACKEND API KEY . Leave --public off here. Treat the process you just started as untrusted territory. The Agent Canvas docs warn that agents can run shell commands, read and write files and use connected tools, and that the client itself provides no isolation. If the backend runs directly on your machine, the agent acts with your account’s permissions. Step 9 fixes that, so do not point this install at a folder you cannot afford to lose until you have finished it. Steps 7 and 8: Create the Local LLM Profile and Test It Step 7: add a profile for the local endpoint. In the browser, open Settings LLM and add a new LLM profile. Use the Advanced tab, because the Basic tab only offers providers and models from its dropdowns. The Advanced tab lets you type the model name and base URL directly. Fill in four fields: - Model: openai/qwen3.6:35b-a3b . The openai/ prefix tells OpenHands to speak the OpenAI-compatible protocol, and the rest must match the id you saw in /v1/models . - Base URL: depends on where the agent loop runs, covered below. - API key: any placeholder such as local-llm . Ollama does not check it. - Profile name: something recognizable, such as local-qwen-ollama . Watch one default in particular. When you create a local profile, the form starts out selecting OpenAI GPT-5.6 Sol as the model and derives the profile name from it. Overwrite both before saving, or you will end up with a profile named after a hosted model that points at your laptop. The base URL is where people lose an hour. Pick by topology: - Agent Canvas on the host with the default local runtime: http://127.0.0.1:11434/v1 . - Agent Canvas in Docker, or per-conversation Docker runtime step 9 : http://host.docker.internal:11434/v1 . - Ollama on another machine: http://