@dominquechurch/dom-agent
v0.1.0
Published
dom — a terminal coding agent. OpenRouter-only, runtime model switching, Windows-first.
Downloads
192
Maintainers
Readme
██████╗ ██████╗ ███╗ ███╗
██╔══██╗ ██╔═══██╗ ████╗ ████║
██║ ██║ ██║ ██║ ██╔████╔██║
██║ ██║ ██║ ██║ ██║╚██╔╝██║
██████╔╝ ╚██████╔╝ ██║ ╚═╝ ██║
╚═════╝ ╚═════╝ ╚═╝ ╚═╝dom is a terminal coding agent that runs entirely on OpenRouter (bring your own key), lets you switch models mid-session, and ships with a web UI that visualizes your agents as figures moving around an office floor.
Office floor — manual agents across all zones, two live sessions, file browser, goal bar
Why dom
Most coding agents lock you to one model. dom runs on any of hundreds of models via OpenRouter — switch from Sonnet to DeepSeek mid-session and your history survives intact. Verified live.
It is Windows-first, where most tools treat Windows as an afterthought: real path handling, a working ConPTY terminal, and CI that runs the full suite on windows-latest.
Prompt caching gives a measured ~12× cost reduction on cached turns.
And the browser UI is not a dashboard bolted on the side — it is a live pixel-art office floor where every agent, background job, and sub-agent is a figure at a desk, working in real time.
What it has
- Any OpenRouter model, switched at runtime —
/modelmid-session, no restart, conversation history carries over - Browser UI with an animated office floor — agents as figures in zones (coordinator, planning, coding, application, sub-agents), each showing what it is doing right now
- MCP client — connect Context7, Playwright, Chrome DevTools, or any MCP server
- Obsidian vault memory — browse your vault, save messages as notes, and auto-save by intent into
Code/,Decisions/, andResearch/ - Sub-agents with isolated context budgets — parallel or scoped work on a restricted tool set, with per-sub-agent cost accounting
- Tree-sitter repo map, PageRank-ranked — structural map of the codebase with the most central files first, so edits are grounded
- Web terminal, file browser, diff viewer, webhook inspector — a real ConPTY shell in the browser, streaming diffs, and a replayable webhook capture buffer
- Goal bar with an automated verifier loop — hold an agent to a goal; a read-only reviewer checks each turn's diff and steers it back on fail
- 90 automated test suites — offline, isolated, run on every push
- BYOK — your key stays in
~/.dom/.env, and there is no telemetry
Runtime model switching — full OpenRouter catalog in the browser
Also in the box: 15 built-in tools (read, write, edit, glob, grep, bash, http, web_search, task, todo, memory, oracle, view_image, send_message, list_tabs), multi-session tabs, inter-agent messaging, a skills system, plan mode, hooks, and auto-commit on every successful edit.
Install
npm install -g @dominquechurch/dom-agent
echo "OPENROUTER_API_KEY=sk-or-..." >> ~/.dom/.env
domOptional keys:
BRAVE_API_KEY=BSA... # enables the web_search tool (Brave Search API)To route groq/-prefixed models natively to Groq, add a Groq key to ~/.dom/config.json:
{ "groqApiKey": "gsk_..." }Usage
dom # start the TUI
dom serve # start the web UI (office floor, file browser, terminal)
dom -p "prompt" # pipe mode: one turn, final answer to stdout, exitdom serve prints a LOCAL and a LAN URL, each with a scannable QR code — point your phone's camera at the LAN one to drive the same session from the couch. Both carry the session token, which is what gates access.
Common in-session slash commands:
/model— switch the active model (session-scoped)/serve— start the web server from inside a running session/vault— switch the working root to your configured Obsidian vault/init— generate anAGENTS.mdfor the current repo/map— show the tree-sitter repo map/plan— enter plan mode (propose before editing)/yolo— allow all tools (dangerous commands still prompt)/cost— show token usage and spend for the session/undo— revert the last agent commit/jobs— list background jobs
Type @ to attach files and / to autocomplete commands.
Keys & network
Your key never leaves your machine. Keys are read at request time from ~/.dom/.env (or ~/.dom/config.json for Groq), are never bundled with the package, and are never sent anywhere except the service they belong to. There is no telemetry — dom does not phone home.
dom makes outbound HTTP(S) requests to:
- OpenRouter (
openrouter.ai) — every model call, plus the public/modelscatalog. UsesOPENROUTER_API_KEY. - Groq (
api.groq.com) — only when you run agroq/-prefixed model; fetches its/modelsand routes chat completions natively. UsesgroqApiKeyfrom~/.dom/config.json. Skipped entirely if no Groq key is set. - Brave Search (
api.search.brave.com) — theweb_searchtool. UsesBRAVE_API_KEY. Skipped if unset. - Arbitrary public hosts — the
httptool fetches URLs you (or the agent) request. Loopback, private-network, and cloud-metadata addresses are refused. Secrets are never inlined: reference them as${VAR_NAME}and the value is pulled from~/.dom/.envat send time.
See SECURITY.md for the permission model and how the dom serve token gate works.
Development
git clone https://github.com/DOMCHURCH/dom.git
cd dom
npm install
npm run build
npm link
npm run verify # 90 test suites
npm run eval # 10-task eval harnessContributions welcome — see CONTRIBUTING.md for the test conventions, how to add a skill, and PR guidelines.
MIT © 2026 Dominique Church
