Open-source runner · Claude Code · Codex · OpenCode

Every agent. Every machine. One board.

Signal Inbox queues work for your coding agents, runs it on hardware you own, and tells you the second one finishes, fails, or needs an answer.

getsignalinbox.com/board
Board
All 5Needs you 1
New task
Add rate limiting to POST /api/tasks
signal/api · main · claude-code
Running
3:34
Fix worktree cleanup when a runner is killed
signal/runner · main · codex
Queued
—
Move board updates to server-sent events
signal/web · main · claude-code
Queued
—
Which provider for the runner handshake?
signal/runner · main · opencode
Needs you
waiting
Strip token analytics from the schema
signal/api · main · codex
Done
merged
4f2a · live
Kill
runner mbp-16 · claimed 4f2a
$ git worktree add .signal/4f2a -b agent/4f2a
$ claude-code --headless --prompt task.md
read src/api/tasks.ts
read src/lib/limiter.ts
edit src/lib/limiter.ts +64 −3
edit src/api/tasks.ts +12 −1
$ npm test -- limiter
✓ 24 passed 0 failed
$
The problem

Three terminals is not a system.

The agents work. The supervision doesn't scale.

01

Tabs don't know about each other.

Five sessions, five windows, no shared state. You hold the queue in your head.

02

Another machine is invisible.

Work running on the desktop or a VPS takes an SSH session to check on. So you don't.

03

A finished agent waits in silence.

Done, failed, or stopped to ask a question — it sits there until you look. You look late.

04

Closing the laptop loses the plan.

The code survives. What was queued, what was blocked, and what was next does not.

The loop

One loop. That's the whole product.

1

Write the task

Title, prompt, repo, base branch, agent. One form. From the desk or from your phone.

repo signal/api
base main
agent claude-code
2

A runner claims it

Your machine creates a git worktree, invokes the CLI headless, and commits to a branch.

$ git worktree add .signal/4f2a
$ claude-code --headless
✓ pushed agent/4f2a
3

You review the diff

Changed files on the task, then one button opens the pull request. GitHub is the diff viewer.

3 files +114 −4
Open pull request →
What v1 does

Seven things. Nothing else.

No sprints. No estimates. No labels. No workflows. No dashboards about dashboards.

01

One board, five states

Queued, running, needs-you, done, failed. Sorted by what changed last. Every session on every machine, on one screen, reflected within two seconds.

QueuedRunningNeeds youDoneFailed
02

Live log tail

Click a running task. Watch the output stream as it happens, from anywhere.

03

Kill switch

Stop a run from the board. A crashed runner marks its tasks failed — never running forever.

04

Review handoff

Changed files, then one button opens a pull request. We don't rebuild GitHub.

05

Agent-neutral

Claude Code, Codex, OpenCode. Pick per task. Nobody wants three dashboards.

06

Durable state

The backlog outlives the session. Close the lid, reopen on the phone, the plan is still there.

07

Concurrency you control

You set the cap per runner. Five at once or one. Your hardware, your call.

The runner

Your machines. Your credentials.

One command registers a machine and starts claiming work. Models are invoked through the CLI you already pay for, on hardware you already own. State lives in Signal Inbox. Secrets never do.

→Laptop, tower, or VPS. Register as many as you like.
→Survives network loss and reconnects without losing task state.
→Every run happens in its own git worktree. No stepping on your working tree.
$ npx signal-runner
✓ machine registered · claiming tasks
mbp-16
macOS 15.4 · claude-code, codex
2 running
tower
ubuntu 24.04 · claude-code
1 running
vps-fra1
ubuntu 24.04 · opencode
idle
Away from the desk

Genuinely usable at 380px.

Not a native app. A board that works in a phone browser — because the moment an agent needs an answer, you are rarely at your desk. Queue a task from a train. Unblock a run from a queue.

QueueAnswerKillOpen PR
9:41
Board
Needs you 1
Add rate limiting to POST /api/tasks
signal/api · claude-code
Running
Fix worktree cleanup when a runner is killed
signal/runner · codex
Queued
Move board updates to server-sent events
signal/web · claude-code
Queued
Which provider for the runner handshake?
signal/runner · opencode
Needs you
Strip token analytics from the schema
signal/api · codex
Done
New task
Cost

Free to start. Open where it counts.

The runner — the part that lives on your machines, next to your repos and your credentials — is open source, so you can read every byte before it leaves. The hosted board is the product: free for one runner and one task at a time, $19/month when you want a fleet. No seats, no token accounting. Models are invoked through the Claude Code, Codex or OpenCode CLI you already have, on hardware you already own. Signal Inbox holds the state. It never holds your credentials.

The runner repo goes public the day there's something worth cloning. Not before.

Runner: MIT, at launchFree: 1 runner, 1 taskPro: $19/mo, 5 at once
Pricing

You pay for concurrency. Nothing else.

The product exists because you run many agents at once — so that's the meter. No seats, no token accounting.

Free

$0
  • 1 runner
  • 1 task at a time
  • 7-day history
  • No card required

Pro

$19/mo
  • Unlimited runners
  • 5 tasks at once
  • Unlimited task history
  • Log output kept 30 days, redacted on your machine before it's sent

Nothing is billed until there's a product to bill for. The numbers are here now so you can decide with them, not discover them later.

Status

Not built yet. That's the honest version.

This page exists to find out whether anyone else has this problem badly enough to want a fix. I'm building it because I have four agents running right now and no idea which one is stuck.

The runner will be open source, and the free tier won't ask for a card. If the idea is useful to you, leave an email — you'll get one message when there's something worth running, not a newsletter.

Stop checking. Start being told.

One command on your machine, one board in your pocket.