An agentic coding CLI · voice-first · open source
Spruce Grove OS is a coding agent that streams its thinking, takes dictation, survives its own process dying, and lets you steer mid-run — in a desktop shell machined around the machine. Every trail inspired by Code Puppy. Every value our own.
No spinner-and-pray. The agent speaks the ACP protocol — message deltas, thinking blocks, tool cards with live status chips, per-turn token counts — and the desktop renders every event the instant it lands. Press run. It's the real dialect.
Legacy shells scrape terminal lines and guess. Grove speaks JSON-RPC over stdio: every token, every tool call, every permission is a typed event with a home in the UI.
Thinking streams in italics. Tools get cards. Usage lands at turn-end.
Dictation is on-device. Whisper runs locally, the transcript lands editable in the prompt, and nothing sends until you send it. The mic is a gate, not a wiretap.
The voice plugin records, transcribes with local whisper, and drops text in your prompt. Review is a first-class step, not a compromise.
And because it fills the same prompt box, dictation doubles as mid-run steering — speak a redirect while the agent works.
Because it is. ACP turns are strict request/response, so Grove makes steering clean: sending while busy cancels the turn and redirects within the same session — context intact, nothing re-explained. Type below mid-sweep.
Naive shells lose the thread on cancel. Grove's client races on purpose: turnActive tracking plus a fallback timer, so a steer can never wedge on a missed turn-end.
Two real bugs — found by the UI test, fixed before they shipped.
When the agent drives a browser, screenshots stream into a Live Look-in panel as they're taken — paths detected in tool payloads, ferried to the panel, rendered while the cursor still moves.
An ordinary form. The agent fills it; you watch it happen.
place orderBrowser tools save PNGs to tempdirs and report the path. The desktop scans tool payloads, whitelisted-reads the image, and slides it into the panel with a rolling action log.
Auto-opens on capture. Toggle it any time.
Sessions persist across process relaunches. Plant a marker, kill the agent, relaunch — the fresh process loads the same session and recalls the marker verbatim. Proven at the protocol level before a single line of UI.
The desktop stores your session per working directory. Relaunch the app and the pill reads ACP · resumed — same conversation, same context, new process.
A dead session never bricks the shell: load failures fall back to a fresh session, gracefully.
Nineteen beads tracked across the build. Sixteen closed with evidence. One needs your mic.
Rotation-safe aliases pin behavior while the vendor rotates models behind them. Keys resolve from the macOS Keychain — never a plaintext config.
| alias | backs onto | context | cost weight | role |
|---|---|---|---|---|
| syn:large:text | GLM-5.3-Flash | 524k | 1.0× | the builder |
| syn:small:text | GLM-4.7-Flash | 196k | 0.1× | the workhorse |
| syn:small:vision | Qwen3.8-27B | 262k | 0.1× | the eyes (look-in) |
| syn:large:vision | Qwen3.8-27B | 524k | 1.0× | the deep read |
The full what/why/how lives in TEST-MAP. The short version:
Every tool, hook, plugin tier and i18n catalog — CI-gated on macOS before any release.
ANSI stripping, ACP routing, permission selection, session parsing — plus Playwright driving the real UI: streaming, steering, look-in, dictation.
The recorded ACP session replays through the real router. Protocol drift fails loudly — and the lifecycle probe proves session/load recalls across process death.
The grove doesn't demo with mockups — it works for the town. Every link below is live today, built by the agent and shipped to a real door.
| for | what was built | see it live |
|---|---|---|
| tylergranlund.com | The flagship: TanStack Start · React 19 SSR · TypeScript strict · Tailwind v4 · Vitest gates — resale desk, ventures, career, writing, and a colophon that declares its own stack | tylergranlund.com |
| Benton Drones | Lead intake: form → geocode → Jira → dashboard — Python stdlib + SQLite core, Render, Playwright-verified (the full build story) | leads.bentondrones.com |
| Bentonville Barbershop | Static, accessibility-audited, owner-servable shopfront with a booking flow (the full build story) | candmbarbershop.net |
| The grove itself | This page, the CLI, the desktop shell — all shipped from the same tree | sprucegrove.io |
One command from the public index. No tokens, no config ceremony — the keychain asks when it's needed.