Skip to main content
This walks the whole loop in the terminal: set up a project, create a pin, read it, reply to it, resolve it. No browser and no agent are needed to follow along — the toolbar and the agent integration hook into the same commands you are about to run. Everything below is copy-pasteable, and every block of output is a real run.
1

Install pinbox

Pinbox ships as one self-contained binary with Bun compiled into it, so there is no runtime to install first.
Building from source is the route that works today — there is no published release or npm package yet. See Installation for the full picture and what each route needs.
Check that the command resolves:
2

Set up your project

Run pinbox init in the root of the project you want feedback on. It creates the state directory, adds it to .gitignore, installs the pinbox skill for each coding agent it finds on your machine, and installs a post-commit git hook.On a terminal it asks which agents to install for. --yes accepts what it detected, and --agent <list> picks them explicitly.
The block after the checklist is an integration brief: a set of instructions for your agent describing how to mount the toolbar in this specific project. You can paste it into your agent, or ignore it — the CLI works without the toolbar.
pinbox init --dry-run prints exactly what it would do and changes nothing.
3

Create a pin

pinbox pin creates a pin from the terminal. Anchor it to a web surface with --url and --selector, or to a source location with --file.
--file takes a path that exists, optionally with :line, and records it relative to the repo — swap in a real file from your own project.The id goes to stdout; the confirmation line goes to stderr. Facts on stdout, messaging on stderr, in every command — so pinbox list | grep open never matches a footer.You did not start a server. The first command that needs the hub starts it in the background and it exits when idle.
4

See what is open

pinbox show prints one pin with everything captured with it, plus its thread:
The branch and commit were recorded for you. That is the point of a pin over a sentence in chat: the agent does not have to ask where you were.
Pipe any of these to a file or another program and you get JSON instead — a non-TTY stdout switches the output mode. --json forces it on a terminal.
5

Reply on the thread

A pin is a conversation. Replying adds a message and never changes the status, so an agent can report progress or ask you a question without closing anything.
--as records who spoke: human (the default) or agent.
6

Resolve it

Resolving takes a note saying what changed — or why it will not.
The other way to resolve is not to run a command at all. Name the pin in a commit message and the post-commit hook pinbox init installed resolves it, with the commit attached:
Fixes, Resolves, and Closes all work, case-insensitively, with or without a colon and with or without the word pin in front of the id. Amending or rebasing is safe — an already-resolved pin is skipped silently, and a broken hub never blocks a commit.
7

Check the result

And a record you can hand to someone else:

What just happened

Pins are rows in .pinbox/pinbox.db, a SQLite file in your project that pinbox init added to .gitignore. They are served by a local hub daemon bound to 127.0.0.1 on an ephemeral port; the port sits in .pinbox/server.json and the bearer token lives outside the repo in your state directory with 0600 permissions. You never start or stop that daemon — any command starts it, and it shuts down when idle.

Next

Concepts

Pins, threads, sessions, the hub, and where your data lives.

CLI reference

Every command, flag, exit code, and JSON shape.