Local-first coding agent ยท macOS

Meet Plank.
It's a good board.

The agent local inference deserves.

A coding agent that runs entirely on your Mac. No cloud, no API keys, no โ€œyour request has been queued.โ€ Just you, your Metal GPU, and a suspiciously capable piece of wood.

$ brew install aovestdipaperino/tap/plank-agent

Seasoned lumber โ€” the stable channel. brew upgrade keeps you steady.

Why keep it local

Your code stays in the workshop.

โœˆ๏ธ

Works in airplane mode

The only agent that respects your window seat. Zero bars, full brain.

๐Ÿ”’

No secrets leave the Mac

Your API keys, your NDAs, your embarrassing variable names โ€” all stay home.

๐Ÿงพ

$0.00 per token

The bill for local inference is a slightly warmer laptop. That's the whole invoice.

โšก

No round trips

Runs DeepSeek V4 Flash right there on Metal, or Gemma 4 in 5 GB on a laptop. The latency is you thinking.

What's in the box

Batteries, tools, and one plank.

โŒจ๏ธ

Lives in your terminal

A cozy Ratatui TUI with streaming output, thinking, diffs, and a status bar that occasionally roasts you.

๐Ÿงฐ

A full tool belt

Read, edit, glob, bash (sync & background jobs), web fetch โ€” the boring superpowers that actually ship code.

๐Ÿ”Œ

Speaks MCP

Plug in your own MCP servers via a tidy .mcp.json. Plank makes friends easily.

๐Ÿ’พ

Remembers things

Persistent sessions with a real KV-cache, so it only re-reads the new stuff. Elephants, meet lumber.

๐Ÿ‘๏ธ

Looks at your screenshots

Paste a picture and ask what broke. A vision encoder ships beside the model and runs on the same Metal device, so the pixels never leave the Mac.

๐Ÿ””

Taps you on the shoulder

Native macOS notifications when a turn finishes or it needs you. No hooks, no fuss.

๐Ÿฆ€

Written in Rust

Fast, fearless, and it compiles clean under -D warnings. The plank has standards.

Since you were last here

The plank has been busy.

A few of the newest arrivals. Turns that used to wander now finish, what you type mid-turn stays where you can see it, and a question you disagree with is no longer a forced choice.

โฑ๏ธ

Minutes, not hours

A repetition guard stops a turn the moment its reasoning starts looping, and low-effort thinking is the default. Measured on one real request: from two hours with nothing to show, to a tested change in 16 minutes.

โŒจ๏ธ

Type while it works

A prompt you write mid-turn waits in a region pinned under the status bar, in view until the turn takes it. It survives a resize โ€” and a turn that errors out hands it back to you instead of dropping it.

๐Ÿ’ฌ

“Chat about this”

When the model asks you a multiple-choice question, one row is always yours: none of these, talk to me first. It stops and waits instead of picking for you.

Everything new since v2.5 โ†’

Real screenshots, no mockups

Yes, it actually does this.

plank โ€” lock-free queue in Rust
plank writing a lock-free MPSC queue in Rust: dimmed thinking text above a syntax-highlighted code block
Writing a lock-free MPSC queue in Rust. Reasoning dimmed up top, code syntax-highlighted below โ€” every token generated on your Mac.
plank โ€” /context
plank's /context report showing 12.4k of 1,000,000 tokens used on DeepSeek V4 Flash, broken down by category
The /context report. 12.4k of 1,000,000 tokens used โ€” DeepSeek V4 Flash still has 98.8% of the workshop free.
plank โ€” /toks
/toks panel: two side-by-side braille line charts in the theme green. Generation speed on the left reads now 29.5, avg 32.9, min 26.9, max 45.9 tok/s; prefill speed on the right reads now 232.9, avg 440.0, min 42.8, max 2112.0 tok/s
The /toks chart. Generation speed beside prefill speed, both sampled once a second, live while the model types. A pass that feels slow is either prefill-bound or decode-bound, and the two panels answer that at a glance.
plank --profile hal
plank launched with --profile hal: HAL's pixel-art logo as the banner art beside HAL v0.3.1, plank v6.0.1 BETA and context 1.0M tokens, with the prompt framed by red rules instead of plank's green
A themed profile. One manifest gives the same binary a new logo, name and accent colour, here HAL's red, along with its own prompt and tools.
plank โ€” /btw split view
plank split view: the main task keeps counting on the left while a /btw side question is answered on the right
Split brain. The counting task keeps going on the left while a throwaway /btw question is answered on the right โ€” the aside runs on a fork of the session, so neither one waits for the other and the real conversation is never touched.

Read the manual

The whole thing, explained.

Thirteen chapters, from brew install to branching a session mid-turn. Written for people using plank, not building it.

Open the guide โ†’

Read the book

How the plank got built.

Cover of Writing an Agent Harness in Rust: an orange crab peeking over a terminal window beside the Rust logo

Writing an Agent Harness in Rust is the story of plank told from the workbench: why a local model makes the cache your problem, how the loop guards learned to catch a model going in circles, where memory can live without breaking the prompt. You build your own small harness along the way, one subsystem per chapter, with a test for every claim.

Fourteen chapters and six appendices, DRM-free EPUB and PDF. It is a living edition: revised as plank's answers change, and every update is included.

A day in the life

You talk. Plank works.

Copied! (to your clipboard โ€” not the cloud)