← Back
HimalayanNomads

HimalayanNomads/drawa

A browser canvas for coding agents: run Claude Code, OpenCode and Codex sessions side by side, watch what they touch, review every change.

View on GitHub ↗https://drawa.cc ↗
canvasclaude-codecodexcoding-agentsdeveloper-toolshacktoberfestopencode
Stars
29
Forks
5
Watchers
29
Open issues
7
Contributors
5
Language
TypeScript
License
GNU Affero General Public License v3.0
Default branch
main
Created Sep 25, 2026Updated Oct 1, 2026

Star growth

Today—
This week—
This month—

Star history will appear here once this repo has been tracked for a couple of days.

README

Drawa

Your coding agents, on a canvas.

Run Claude Code, OpenCode and Codex side by side, watch every file they read, edit and run as a live map, and review each change without leaving the browser.

drawa.cc

Latest release License: AGPL-3.0 Platforms

Install · Quick start · Features · Shortcuts · Contributing

The Drawa canvas: session cards, each wired to a window of the files its agent read, edited and wrote, with a diagram beside them

Why Drawa

In a terminal, an agent's work scrolls past as a transcript. Drawa lays it out as a map instead.

  • Several agents at once. Each session is a card on the canvas: Claude Code, OpenCode or Codex, side by side, on the same project.
  • Work drawn as a map. The files each agent reads, edits and writes appear in a window wired to its card, colored by what happened to them. The commands it runs collect beside it.
  • Review in place. Click any file for its diff from every session, and approve or answer the agent from the card it's running in.

Drawa runs entirely on your machine. It drives the agent CLIs you already have, with your logins, settings, skills and MCP servers, and serves the UI on 127.0.0.1.

Requirements

Claude Code One agent is required. claude on PATH and logged in, for your Claude subscription.
OpenCode Or, instead or as well: opencode on PATH, for any other provider or its free models. See below. Tested with OpenCode 1.18.32.
Codex Or: codex on PATH and logged in, for your ChatGPT plan or an OpenAI API key. See below. Tested with Codex 0.158.0.
git Optional. Powers the Git window and file history.
gh Optional. Powers the GitHub window.
universal-ctags Optional. Code symbols: Ctrl+K finds functions, classes and the like by name, and clicking a name in a diff shows where it's defined. brew install universal-ctags on a Mac. Turn it off in Settings.
OS macOS or Linux. Windows isn't supported yet.

Choosing an agent

No Claude subscription? OpenCode is an open-source coding agent that works with most model providers (OpenRouter, Google, OpenAI, local models and more), and Codex is OpenAI's. With either installed, New session ▾ in the toolbar offers it next to Claude Code, and each session card picks its model from that agent's list. Drawa's startup check lists the agents it finds, and warns if a version isn't the one Drawa was tested with.

Claude Code OpenCode Codex
Sign in with Your Claude subscription Any provider, via opencode auth login; its own free models need no key Your ChatGPT plan or an OpenAI API key, via codex login
Install claude.com/claude-code curl -fsSL https://opencode.ai/install | bash (docs) Codex CLI docs
Tested with Not pinned 1.18.32 0.158.0
Approvals, files and commands windows, canvas tools, history ✓ ✓ ✓ (looking at the canvas never asks)
Pasted images ✓ ✓ ✓
Sub-agents Own window Own window One row, not their own window
Auto mode ✓ – –
Effort setting ✓ – – (uses its default)
Usage windows in the status line ✓ – –
Take back a queued message ✓ – –
Memory per session Its own claude process About 300 MB (its own opencode server) About 250 MB (its own codex app-server)

Neither OpenCode nor Codex has an agent-specific process limit: set DRAWA_MAX_LIVE if your machine needs one. The Git window's Write with ▾ picks which agent writes commit messages and pull request descriptions.

  • OpenCode privacy. A session's prompts, and the files it reads, go to the provider you pick. OpenCode's free models are run by third parties that may use what you send to improve their models (check OpenCode Zen's terms), so don't use them on code you can't share.
  • Codex trust. For a local folder, Drawa marks it trusted for Codex, so, as with Claude Code, its .codex/ settings and AGENTS.md load. A cloned GitHub repo you didn't trust is marked untrusted, so they don't. Either way nothing is written to ~/.codex/config.toml.
How the permission modes map onto Codex

Read only asks before edits and before any command Codex doesn't consider safe. Plan only never asks, nothing it runs can write, and it doesn't hand you a plan to approve: it answers in the chat. Allow edits approves file changes inside the project only (not in .git, .codex, .agents or .claude, and not renames out of it). Always allow covers a command or edit until the card's Codex process closes (after 30 idle minutes, or to stay under DRAWA_MAX_LIVE; it asks again after resuming), and Drawa doesn't save Codex's permanent command rules; canvas changes ask each time. A mode change applies from the next turn (a message sent mid-turn joins the running one), except that leaving Allow everything stops a running turn, since it can't lose full access mid-turn.

Install

curl -fsSL https://raw.githubusercontent.com/HimalayanNomads/drawa/main/install.sh | sh

This downloads the right release binary for your OS and architecture and installs it to ~/.local/bin/drawa. You don't need Go or Node.

Update later with drawa --update. For manual downloads, custom install locations and uninstalling, see INSTALL.md.

Build from source

Needs Go 1.22+ and Node 20.19+ (or 22.12+).

git clone https://github.com/HimalayanNomads/drawa.git
cd drawa/web && npm install && npm run build
cd .. && go build -o drawa .

Quick start

cd ~/my/project
drawa

Drawa opens http://127.0.0.1:8765 in your browser, and Claude works in that folder. Press N for a new session and start typing.

drawa                  # the current folder
drawa ~/some/project   # any other folder
drawa --net .          # also reachable from other devices on the network
drawa https://github.com/owner/repo   # clones it into a cache folder and opens it (reruns reuse the clone)
drawa --clean          # removes cached clones (or pass one repo's URL)

Opening a GitHub URL, or a folder inside its clone, asks on each launch whether to trust the repo (only the server's own restarts after code changes reuse the answer). Answer n (the default) and its own .claude/ settings, hooks, .mcp.json, CLAUDE.md, OpenCode project config, and Codex's .codex/ config and AGENTS.md are ignored, since they could run commands on your machine.

--clean keeps any clone with uncommitted, unpushed, stashed or ignored files. Don't run it while a Drawa is open on that clone. A GitHub folder link (/tree/main/docs) opens the repo on its default branch.

In the message box, / opens skills and slash commands and @ references files or canvas items. The toolbar picks the model and permission mode.

By default Drawa only answers on localhost. Pass --net (in any position) and, like a Vite or Next.js dev server, it also listens on the machine's network address and prints both:

  - Local:   http://127.0.0.1:8765
  - Network: http://192.168.1.23:8765/?token=fpKZrzCN

It also prints a QR code of the Network link, so a phone can open it with its camera. The Network link lets another device on the same network — a laptop, a phone — open the same workspace. It only works with its ?token= (a fresh one each run, checked once, then kept in a cookie and dropped from the address), and an address that guesses wrong 5 times locks out for a few minutes. See Security.

Features

  • Parallel sessions. Each card is a live agent process: Claude Code, OpenCode or Codex, picked per session. Type any time; messages queue while the agent or its sub-agents work.
The New session menu listing the installed agents: Claude Code and OpenCode
  • Your work, drawn as a map. Files the agent reads, edits and writes are linked to its card and colored by action. Commands it runs collect in their own window.
A session card wired to its files window: dom.ts edited (+2 −1), keys.ts read, and a commands window below
  • Review in place. An edit waiting for approval shows its diff inside the card. Click any file for its changes from every session, plus the file itself with Markdown and Mermaid preview.

An edit to dom.ts waiting for approval, its diff shown inside the card above Deny, Always allow and Allow

  • Sub-agents in the open. Each sub-agent gets its own window showing its work as it happens, and you can message it directly.
  • Agents can use the canvas too. They can read, create, edit and link canvas items through built-in tools, with changes going through the normal approval flow.
  • A whiteboard around your code. Sticky notes, a Markdown scratchpad, Mermaid diagrams, pictures, pinned snippets, shapes, arrows and freehand ink. @-reference any of them in a message, or drop them on a card.
A Mermaid diagram Claude drew on the canvas, in full view: how a window, its reference chip and its arrows relate
  • Git and GitHub built in. Browse status and history, commit and push. Repos in subfolders (a folder of cloned repos, or repos inside your project) get a group each in the Git window, with their own pull request, and the GitHub window switches between them. Open pull requests and issues through gh, and send a PR, its failing checks or its reviews straight to a session.
The GitHub window pinned to the sidebar beside a session card, showing a pull request with Send to Claude, Merge and its conversation
  • Picks up where you left off. Resume past sessions from history. The whole layout survives a reload, and a reload re-attaches to sessions that are still running.
  • Works on your phone. Start with --net and open the printed link or QR code: the same canvas, starting in Hand mode so a drag pans.
Drawa at phone width: a session card and its commands window
  • Themes. Light and dark, with Rosé Pine, Catppuccin, Tokyo Night, Gruvbox, Nord, Kanagawa, Everforest, Solarized and GitHub color schemes.

Configuration

Variable Default Purpose
DRAWA_PORT 8765 Port to serve on. Set it to run two projects at once.
CLAUDE_CONFIG_DIR ~/.claude Claude Code's config directory, if you keep a separate login or set of skills for Drawa.
DRAWA_NET_TOKEN a fresh one per run The --net token. Drawa sets it itself so the token survives its self-restarts; set it only to pick your own.
DRAWA_MAX_LIVE unset (no cap) Most agent processes kept running at once, of any agent (each takes a few hundred MB). Past it, the least recently used idle session is closed; its next message resumes it. Idle sessions close after 30 minutes either way.
DRAWA_DEV unset 1 trusts the Vite dev server's origin (port 5173). npm run dev sets it; see CONTRIBUTING.md.
DRAWA_PORT=8766 CLAUDE_CONFIG_DIR=$HOME/.claude-work drawa ~/other/project

Settings file

Settings that follow you to every project and browser live in ~/.drawa/config.json. Drawa writes it with the defaults the first time it starts, and the Settings panel (the gear in the toolbar) changes it. You can also edit it by hand: the change applies the next time you reload the page. A file that isn't valid JSON is left alone, and the defaults apply until it's fixed.

{
  "darkScheme": "claude-dark",
  "lightScheme": "claude-light",
  "theme": "system",
  "ui": "full"
}
Key Default Values
ui full full shows every window's title tab; minimal shows a window's tab only when you hover or focus it. A session card waiting for your approval keeps its tab either way.
theme system system follows your computer's light or dark mode; light or dark fixes it.
lightScheme, darkScheme claude-light, claude-dark The color scheme for each mode: the ids in web/src/lib/theme.ts, such as rose-pine-dawn, catppuccin-mocha or nord.

Fonts and which key sends a message are kept per browser.

Keyboard shortcuts

Shortcuts follow Excalidraw's where the tool exists, and don't fire while you're typing. Press ? in the app for this list, and Ctrl+K to run any action by name. A short tip shows in the corner at launch; Hide tips turns them off.

Area Keys
Canvas V/1 select · H hand (hold Space to pan) · Shift+1 fit all · Shift+2 zoom to selection · Shift+0 zoom 100% · F fit · +/- zoom in/out · arrows pan (Shift: bigger steps; with a selection they nudge it instead)
Items N new session · C/Shift+C next/previous session (Enter to type) · T sticky note · S scratchpad · 9 insert picture · G Git · Shift+G GitHub · Shift+H history & files · Ctrl+K find a window, file, code symbol or command · ? all shortcuts
Windows W/Shift+W next/previous window (selects it, so Delete, arrows and Ctrl+G act on it) · M collapse/expand · Shift+F full view · F2 rename · Shift+P pin to the sidebar · Shift+S stick to the screen. They act on the selected window, else the one in front
Draw D toggle Draw mode · P/7 pen · A/5 arrow between items · E/0 eraser · T/8 text · R/2 rectangle · 3 diamond · O/4 ellipse · L/6 line (Shift for square, circle, 45°) · Ctrl+Z undo · Esc stop
Selection Ctrl/Cmd+A select all · arrows nudge (Shift: 10px) · Delete remove · Esc clear · Ctrl/Cmd+G group the selected windows (groups in it merge; nothing selected: an empty group) · Ctrl/Cmd+Shift+G ungroup the selected groups
Message box Enter send · Shift+Enter new line (or Ctrl+Enter send and Enter new line: pick in Settings, the gear) · Esc leave the box · ↑ at the start / ↓ at the end: previous/next message or ! command you sent in this session (past the newest: your draft)

Mouse: drag the background to select (Select mode) or pan (Hand mode). The middle button and the wheel always pan. Ctrl/Cmd+scroll or pinch zooms; Shift+scroll scrolls sideways. The zoom is saved with the canvas. Jumping to a window (Ctrl+K, C, a notification) keeps the zoom unless the window would be under 50% or wouldn't fit, then it zooms to fit that window (at most 100%). Click a picture or diagram for full view, and click it again to zoom and pan it. Phones start in Hand mode.

Security

Drawa is built to run locally for one user:

  • The server listens on 127.0.0.1 only, unless you pass --net (see Quick start), and checks the Host header on every request either way.
  • With --net, the network address additionally needs its one-time ?token=; wrong guesses lock that address out after 5 tries. Still only pass --net on a network you trust, and treat the printed link like a password — don't post it anywhere public.
  • Changing requests must come from Drawa's own page (a matching Origin).
  • File access is confined to the project folder you opened.
  • Claude's canvas tools use a per-process token, so only that session's own claude process can call them.

To report a vulnerability, see SECURITY.md: please open a private security advisory rather than a public issue.

Contributing

Questions, ideas and things you built with Drawa go to Discussions. Issues and pull requests are welcome. Maintainers cut the releases; a merged pull request ships in the next one. See CONTRIBUTING.md for the development setup and an architecture overview, and CLAUDE.md for the conventions the codebase follows. Everyone taking part is expected to follow the Code of Conduct.

License

Drawa is licensed under the GNU Affero General Public License v3.0.