Skip to main content
pinbox pin writes a pin straight from your shell. Reach for it when you want to try pinbox before wiring up the toolbar, or when the thing that needs changing is in the code rather than on a page. Because there is no browser, a terminal pin records nothing about one — no viewport, no screenshot, no element rectangle. It carries only what is true: your text, whatever place you named, your git identity, and the branch and commit the hub stamps on every pin.

Usage

Arguments

string
required
What needs to change, in your words. Quote it — it is one argument, not several.

Options

path[:line]
Anchor to a source location (recorded repo-relative). The path must exist. It is stored relative to the repo root, so the anchor still resolves on another machine. :line is optional.
url
The web surface this pin is about. Must be an absolute http or https URL.
string
CSS selector on that surface. Requires --url — a selector with no page is not a target.
boolean
A note for people, not a task. The pin is stored with kind: "comment"; the hub never routes it to an agent session, and the agent skill tells agents to read such pins as context and never act on or resolve them. The toolbar’s Note option creates the same kind. Filter them with pinbox list --kind comment.
boolean
Machine output: the {"ok":true,"data":…} envelope.

3D targets

Use --model-anchor <json> to attach the pin to a part-local 3D point. A trusted backend can supply its verified user with --author-json <json>. See 3D model pins for the schema, security boundary, and viewer integration.

Examples

The new pin id goes to stdout. The confirmation goes to stderr, so 2>/dev/null leaves you with just the id.
With no anchor at all — a note about the product, not about a place:
About a page you never opened:
With a selector on that page. The confirmation names the page, and the selector is stored on the pin:

JSON

data is the created pin. Note what is absent: no env.viewport, no target.rect. Absent, not zeroed.
To capture the id in a script, parse the envelope rather than the human line — a pipe switches the command to JSON mode anyway:

Errors

A --file that points at nothing is rejected before the pin is created. An agent sent to a path that does not exist is worse off than one with no anchor at all.

Next: read it back with pinbox show, find it again with pinbox list, or close it out with pinbox resolve.