A web IDE for Claude Code — editor, terminals, diffs, and chat in one place
Experimental fork of Kanna — this project builds on Kanna's excellent chat UI and agent coordination, adding embedded VS Code, standalone terminals, a diff viewer, and single-port multiplexing. Upstream changes are pulled in regularly. If you're looking for the stable original, head to jakemor/kanna.
Install everything in one shot (Bun, Claude Code, and Nomi):
curl -fsSL https://raw.githubusercontent.com/anglinb/nomi/main/install.sh | bashOr install manually:
curl -fsSL https://bun.sh/install | bash # install Bun (if needed)
curl -fsSL https://claude.ai/install.sh | bash # install Claude Code (if needed)
bun install -g nomi-code # install NomiThen run from any project directory:
nomiNomi opens in your browser at localhost:3210.
These features are new in Nomi on top of the upstream Kanna project:
- Embedded VS Code — a full VS Code editor runs inside Nomi, one instance per project, accessible from the sidebar
- Standalone terminals — terminals are first-class sidebar items with their own routes, not embedded in the chat view
- Git diff viewer — full-page diff viewer with file/chunk navigation, word-level highlighting, and inline comments
- Single-port multiplexing — VS Code, terminals, and Nomi all served through one port, so
--shareand reverse proxies just work - One-line installer —
curl | bashinstalls Bun, Claude Code, and Nomi in one shot - Sidebar toolbar — quick-access buttons for Editor, Terminals, and Diffs with active-state indicators
- Auto-create first chat — a chat is created automatically on startup so you land in a ready-to-use session
- Trusted npm publishing — releases publish via GitHub Actions OIDC with provenance signing
- Multi-provider support — switch between Claude and Codex from the chat input, with per-provider model selection and reasoning effort controls
- Project-first sidebar — chats grouped under projects, with live status indicators (idle, running, waiting, failed)
- Rich transcript rendering — hydrated tool calls, collapsible tool groups, plan mode dialogs, and interactive prompts
- Plan mode — review and approve agent plans before execution
- Persistent local history — refresh-safe routes backed by JSONL event logs and compacted snapshots
- Auto-generated titles — chat titles generated in the background via Claude Haiku
- Session resumption — resume agent sessions with full context preservation
- WebSocket-driven — real-time subscription model with reactive state broadcasting
- Public share links —
--sharecreates a temporary Cloudflare tunnel URL with terminal QR code
Browser (React + Zustand)
↕ WebSocket
Bun Server (HTTP + WS)
├── WSRouter ─── subscription & command routing
├── AgentCoordinator ─── multi-provider turn management
├── VsCodeProxy ─── reverse-proxy VS Code through same port
├── TerminalManager ─── PTY session lifecycle
├── EventStore ─── JSONL persistence + snapshot compaction
└── ReadModels ─── derived views (sidebar, chat, projects)
↕ stdio / child process
Claude Agent SDK / Codex App Server / VS Code Server
↕
Local File System (~/.nomi/data/, project dirs)
- Bun v1.3.5+
- A working Claude Code environment
- (Optional) Codex CLI for Codex provider support
Embedded terminal support uses Bun's native PTY APIs and currently works on macOS/Linux.
nomi # start with defaults (localhost only)
nomi --port 4000 # custom port
nomi --no-open # don't open browser
nomi --share # create a public share URL + terminal QRDefault URL: http://localhost:3210
By default Nomi binds to 127.0.0.1 (localhost only). Use --host to bind a specific interface, or --remote as a shorthand for 0.0.0.0:
nomi --remote # bind all interfaces
nomi --host dev-box # bind to a specific hostname
nomi --host 192.168.1.x # bind to a specific LAN IP
nomi --host 100.64.x.x # bind to a specific Tailscale IPUse --share to create a temporary public trycloudflare.com URL and print a terminal QR code:
nomi --share--share is incompatible with --host and --remote.
git clone https://github.com/anglinb/nomi.git
cd nomi
bun install
bun run devThe same --remote, --host, and --share flags work in dev mode. Use bun run dev --port 4000 to run the Vite client on 4000 and the backend on 4001.
Or run client and server separately:
bun run dev:client # Vite dev server
bun run dev:server # Bun backend| Command | Description |
|---|---|
bun run build |
Build for production |
bun run check |
Typecheck + build |
bun run dev |
Run client + server together |
bun run dev:client |
Vite dev server only |
bun run dev:server |
Bun backend only |
bun run start |
Start production server |
All state is stored locally at ~/.nomi/data/:
| File | Purpose |
|---|---|
projects.jsonl |
Project open/remove events |
chats.jsonl |
Chat create/rename/delete events |
messages.jsonl |
Transcript message entries |
turns.jsonl |
Agent turn start/finish/cancel events |
snapshot.json |
Compacted state snapshot for fast startup |
Event logs are append-only JSONL. On startup, Nomi replays the log tail after the last snapshot, then compacts if the logs exceed 2 MB.