pinrail
listLanding page, draft 1An agent is waiting on you
0 of 6 decided

↓ you're the reviewerAn agent wrote this page and submitted it for review. Accept each section or send it back with a reason, then hand your decision back. Keys: JK move, A accept, R reject.

#101R1

Before your agent
acts, it asks.

Pinrail is a desktop inbox for the moments your agent needs you: review comments about to be posted, emails about to be sent, an illustration or a voice-over still taking shape.

Pinrail

Inbox Retry failed webhook deliveries with exponential backoff

Pendingcode-review v1northwind/api / pr-review #482claude41m ago

The code review view: a diff of deliver.ts and backoff.ts, one finding accepted with a note being written, one rejected with a reason.
Add a note for the agent…Review and hand over ⌘↵
#102R1

One command in, one decision out.

You tell the agent when to stop for you, in whatever instructions it follows. When it gets there, it asks through Pinrail and waits.

~/northwind/api — claude
> review PR #482 and post your comments, but ask me first
⏺ I read the diff: 3 files, 5 findings worth a comment. I'll ask you before any of them is posted.
⏺ Bash(pinrail submit code-review --title "Retry failed webhook deliveries" --data findings.json --wait)
⎿ pinrail: review r_01K5R2 submitted; waiting for a decision
⎿ r_01K5R2 · decided · Retry failed webhook deliveries
review · northwind/api · retry-webhooks · decided by maya at 2026-09-23 10:14
- **#1 accepted** `src/deliver.ts:42` — retry with backoff (major)
> re-enqueue with runAt
- **#3 accepted** `src/deliver.ts:57` — add jitter (minor)
- **#4 rejected** `src/log.ts:18` — give-up log (nit)
> the log already has the delivery id
Undecided: #2, #5
⏺ Posting #1 and #3 as you worded them. #4 stays out, and #2 and #5 were left undecided, so I will not post them.
⏺ Bash(gh pr review 482 --comment --body-file comments.md)
⎿ 2 review comments posted
✻Pinrailing… (0s · esc to interrupt)
#103R1

A diff deserves a diff.

Each kind of request is a plugin, with a view made for deciding it: the diff for a code review, the draft itself for an email, the image for a picture, the waveform for a voice take. This page is using list.

#104R1

A no comes with a reason, and the reason comes back.

Send something back and the agent answers with a new round, submitted with --revises. It lands beside your earlier verdicts and comments, so you see what changed and why, and a view can set the two rounds side by side to check each fix. Every round and every decision is kept, and can be opened again later.

Try it: send a section above back and see what comes back.

#105R1

“Stop” is a real answer.

Discard a review with a reason and the waiting command exits 5. The agent stops the work the review was gating, reports why, and doesn't try again. Every ending has its code:

0Decided. The decision is on stdout, and in --decision-out if given.
3Withdrawn by the agent, or expired, before anyone decided.
4--timeout ran out. The review is still pending.
5Discarded: stop the work this review was gating.
#106R1

For an agent, and for a script.

An agent reads the decision as markdown. A script keeps the JSON and branches on the exit code, and --decision-out writes the decision to a file for a workflow that already reads one.

agent — zsh
# submit the proposed comments and wait for a person
$ pinrail submit code-review --title "Dedup tickets on save" \
    --origin repo=acme/api,workflow=pr-review,ref=42 \
    --data proposals.json --wait
pinrail: review r_01K5Q8 submitted; waiting for a decision
r_01K5Q8 · decided · Dedup tickets on save
review · acme/api · pr-review · 42 · decided by maya at 2026-09-23 10:14

## Proposals

- **#18 accepted** `lib/acme/tickets.ex:149` — reversing twice is a no-op (major)
- **#19 accepted** `priv/repo/add_hash.exs:6` — missing index on tickets.hash (minor)
  > mention the COALESCE
- **#20 rejected** `lib/acme/tickets.ex:151` — prefer Enum.uniq_by/2 (nit)
  > fine as it is
- **#21 accepted** `test/acme/tickets_test.exs:40` — test for the empty list (minor)
$ echo $?
0

Done reviewing?

Nothing decided yet. Items you leave undecided go back as not approved.