Install
One binary. One command.
A single Go binary that watches the claude sessions you already run. Apache-2.0, local-first, no account.
Paste into the agent you already have open.
That is the whole install. Everything below is what it does, and what to do if it does not.
1Check what you have
One 5-second check:
claude --version # need Claude Code — Caprock watches it, doesn't replace it
No claude? Install Claude Code first.
2What it touches
Two binaries — caprock and caprock-hook — and one directory of its own. Nothing else, unless you say yes to the two questions on first run.
- A data directory — its SQLite database, config and logs. On macOS that is ~/Library/Application Support/caprock. Delete it and Caprock has never run.
- ~/.claude/settings.json, twice, with your consent — the hook shim, which is what makes activity live, and the status line, which is how the Cost screen knows your plan windows. Say no to either; both edits back the file up first, and caprock hooks uninstall removes them.
- Nothing on the network. The daemon binds 127.0.0.1. No account, no telemetry. The one outbound call is a release check, off until you turn it on.
Other ways to install
Have Go? go install github.com/dspv/caprock/cmd/caprock@latest — the dashboard is embedded, so there is no Node build.
Or download caprock and caprock-hook for your OS/arch from GitHub Releases, or build from source (Go 1.26, Node 22):
git clone https://github.com/dspv/caprock && cd caprock make ui && make build # → ./bin/caprock, ./bin/caprock-hook
Coming from the old Python caprock?
An unrelated package of the same name exists on PyPI and will shadow this one. Remove it first, then check which caprock prints nothing:
pipx uninstall caprock # or: pip uninstall -y caprock rm -rf ~/.caprock # its old data which caprock # should now print nothing
Nothing is lost — this version reads the transcripts Claude Code already writes, so your history appears on first run.
3Run it
On first run it asks twice before touching ~/.claude/settings.json, and you can say no to either. Both edits are non-destructive and back the file up first.
- The hook shim, so it sees your sessions live. Say no and nothing is lost — Caprock still reads your history and your live sessions from the transcripts Claude Code already writes, a few seconds delayed. Removable with caprock hooks uninstall.
- The status line, which sets statusLine.command to caprock statusline so the Cost screen can show your plan-limit windows (5h/7d, Pro/Max). If you already have a status line of your own, Caprock leaves it alone and does not ask. Add or remove it later with caprock statusline install / caprock statusline uninstall.
Then start Claude Code as usual in any terminal and watch it appear on the Now screen.
claude # any terminal — Caprock sees it caprock status # daemon, hooks, ingest, pricing in force caprock down # stop the daemon; your data (SQLite) is kept
The daemon does not come back by itself after a reboot. To have it start at login — a LaunchAgent on macOS, a systemd user unit on Linux, a Startup-folder script on Windows, nothing needing root and nothing outside your own home:
caprock service install # start at login, survives a reboot caprock service status # is autostart on, and which file defines it caprock service uninstall # remove it; the daemon and your data are untouched
4Control & run tasks (optional)
From the dashboard, New session spawns a claude you can type into, pause, resume or kill in the browser.
The Tasks screen runs queued tasks unattended behind a test gate. It is the one part of Caprock that starts sessions on its own, so it is off until you turn it on. Two buttons, in order: Turn on the task runner, which confirms first and names the queue directory and the repository, then Start orchestrator once you have written a task — starting it over an empty board has nothing to assign. Each task carries the commands that have to pass; Caprock runs one session per task in its own git worktree and then runs those commands itself, so only green is done.
Two things to know before you turn it on. Those commands are not sandboxed: they run in a real checkout of your repository, with your own privileges, unattended, on a five-minute ceiling each — treat them as commands you are running yourself, because go build ./... leaves a binary behind exactly as it would in your own tree. And use it for independent tasks only: nothing here merges branches, and nothing notices two workers editing the same file. Details on the docs page.
5Update, or remove it
Use the command matching how you installed:
brew update && brew upgrade caprock # Homebrew scoop update caprock # Scoop go install github.com/dspv/caprock/cmd/caprock@latest # go install
The brew update is not decoration: a tap is read from a local git clone that brew upgrade refreshes only through auto-update, which runs at most once a day. Without it Homebrew can report already installed for a release that has been public for hours.
Then restart so the new binary is the one running — caprock down leaves your database alone, so history from before the upgrade stays where it was:
caprock down && caprock up
To remove it: caprock hooks uninstall and caprock statusline uninstall take Caprock back out of ~/.claude/settings.json, caprock service uninstall removes autostart, and deleting the data directory removes everything else. No lock-in by construction.
Full source, issues and the roadmap are on GitHub. Local-first: the daemon binds 127.0.0.1 only, no telemetry, no account. The one thing that can reach the network is an optional check for new releases — off until you turn it on.