marshall — a coding agent that lives in your terminal

A coding agent that lives in your terminal. Describe the change — a planner/coder/reviewer loop reads, edits and runs your project, and nothing happens without your approval.

get started how it works

how it works

Three agents, one feedback loop

Not a single autocomplete on steroids — a planner breaks the task down, a coder executes with a safe tool belt, and a reviewer inspects the diff before you're asked to ship it.

01

planner

Turns "add rate limiting to the API" into an ordered, concrete plan. Runs on your deep tier.

02

coder

Reads, edits, runs tests — every write and shell command gated behind an approval you can audit.

03

reviewer

Second opinion on the actual diff. Loops with the coder until it holds up — never rubber-stamps.

why marshall

Batteries in, guardrails on

The boring parts — safety, memory, context management — are engineered in, not bolted on.

Approval for every mutation

write_file, edit_file and run_shell render their diff or command before they run. Approve once, always-allow for the session, or deny — esc denies everything pending.

Two model tiers

A frontier model reasons; a cheap or local model fetches and summarises. /model fast points the grunt work at llama.cpp or Ollama and your bill (and latency) drop.

Interrupt & steer

esc stops at the next safe boundary — no half-written files (atomic writes) — and your next message course-corrects instead of restarting.

Sandboxed tools

File tools are jailed to the workspace — .. traversal and escaping symlinks are rejected. Shell runs with a scrubbed env, timeouts, output caps and a command policy.

Memory that doesn't leak tokens

Rolling compression with pinned goals, tool-result masking, read dedup — plus AGENTS.md project memory loaded at session start.

Knows your repo's paperwork

Built-in gh_* tools read issues, pull requests and diffs, and open a PR when the work is done — so "fix #482" is a whole task, not a lookup.

providers

Your keys, your models, your call

Hosted frontier, a single OpenRouter key, or fully local — switch any time with /model. First run walks you through it, and marshall login signs in with a Claude account instead of a key.

claude · ANTHROPIC_API_KEY or login openai · OPENAI_API_KEY gemini · GEMINI_API_KEY mistral · MISTRAL_API_KEY openrouter · live model list, one key llama.cpp · local · no key needed ollama · local · no key needed

llama.cpp isn't an afterthought — it's a first-class provider. Point it at any OpenAI-compatible llama-server and marshall probes the router to see which model is actually loaded, not just what's on disk, so you're never surprised by a lazy cold start mid-task. Same treatment for Ollama — resident models listed first.

commands

Small surface, muscle memory

Eleven slash commands and three keys. /help prints the lot.

/modelpick deep + fast models; the wizard lists OpenRouter's live catalogue or probes local servers for what's actually loaded
/plan <task>get a plan before touching code — carried as context into your next task
/review [notes]second opinion on the current workspace state
/memoryview AGENTS.md, the project memory loaded at session start
/loginauthenticate with a Claude account instead of an API key
/tokenstoggle usage (↑ in / ↓ out / time) after each response
/streamtoggle live token streaming vs. final response only
/clearreset history, dedupe cache and scratch notes
ctrl-rtoggle live reasoning, on providers that stream it
esc / esc escinterrupt & steer / force-quit

fine print

What it doesn't do

Worth knowing before you point it at something that matters.

The sandbox is containment, not a security boundary. File tools are hard-jailed to the workspace, and shell runs under a command policy — but a shell command can still reach the network, or read a file outside the workspace by absolute path. OS-level isolation (container / microVM) is planned; only the executor behind the tool changes.
One workspace, one terminal. No multi-repo sessions, and no editor integration yet — a reference VS Code extension is on the roadmap, driven by the engine's stdio JSON-RPC transport. The engine itself is headless and has no idea a terminal exists.

get started

Your terminal is already open

Node 22+, one npm install, thirty seconds of setup wizard. No account required if you're running local models.

star on github