Free · Open source · Mac + iPhone

Claude Code, Codex, and Grok in one native Mac app. Every agent works on its own branch. Every risky command waits for your yes. And when you walk away, your phone runs the whole thing.

MIT licensed. Mac + iPhone. No account. No servers of ours.

zsh
$ git clone https://github.com/rhh4x0r/grok-build-tauri-control-panel.git
$ cd grok-build-tauri-control-panel && ./scripts/install.sh
Works withClaude CodeCodexGrok
Add Stripe webhook retriescheckout-flow @ MacBook Pro
Opus 5.58 unsaved editsMerge to main
Add retries with exponential backoff to the Stripe webhook handler, plus a dead-letter table. Spin up a Codex helper on Astra to review it before you finish.
Thought · Read 3 files · Edited 3 files · Ran 2 commands
Readsrc/webhooks/deliver.ts
Editedsrc/webhooks/deliver.ts
Editedsrc/webhooks/deadLetter.ts
Subagent ·Review webhook retries (Codex · Astra)
Rannpm test -- webhooks
src/webhooks/deliver.ts +48−6
@@ -41,9 +41,22 @@ export async function deliver(event: StripeEvent) {
- await handler(event)
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
+ try {
+ return await handler(event)
+ } catch (err) {
+ await sleep(backoff(attempt)) // 2s, 8s, 32s, 2m
+ }
+ }
+ await deadLetter.put(event)
$npm test -- webhooks
✓ retries with backoff (412 ms)
✓ dead letters after 5 attempts (88 ms)
✓ signature survives a retry (31 ms)
● replays a dead letter…
Running · npm test · 1m 20s· ctx 42kexplain ▸
stripe-retriesIsolated branch42%
Do anything…
Ask firstOpus 5.5 High

Real interface. Mock data.

  • 01An agent edits main while you’re in another tab.
  • 02Four terminals. Zero idea which one is waiting on you.
  • 03Forty “Allow?” prompts a day. You stopped reading them at ten.

The model is fine. The cockpit is missing.

claude — zsh
› Reading src/cart/totals.ts
› Editing src/cart/totals.ts
› Running npm test
› ✗ 3 failing
› Editing test/cart.test.ts
› Allow Bash(rm -rf node_modules)? [y/N]
› Running npm install
› …
› Reading src/cart/totals.ts
› Editing src/cart/totals.ts
› Running npm test
› ✗ 3 failing
› Editing test/cart.test.ts
› Allow Bash(rm -rf node_modules)? [y/N]
› Running npm install
› …
› Reading src/cart/totals.ts
› Editing src/cart/totals.ts
› Running npm test
› ✗ 3 failing
› Editing test/cart.test.ts
› Allow Bash(rm -rf node_modules)? [y/N]
› Running npm install
› …
codex — zsh
› Thinking…
› apply_patch src/api/limits.ts
› Allow command: git checkout main? [y/N]
› git commit -am "wip"
› Allow command: git push --force? [y/N]
› ! pushed to origin/main
› Thinking…
› …
› Thinking…
› apply_patch src/api/limits.ts
› Allow command: git checkout main? [y/N]
› git commit -am "wip"
› Allow command: git push --force? [y/N]
› ! pushed to origin/main
› Thinking…
› …
› Thinking…
› apply_patch src/api/limits.ts
› Allow command: git checkout main? [y/N]
› git commit -am "wip"
› Allow command: git push --force? [y/N]
› ! pushed to origin/main
› Thinking…
› …

Here's the math.

1
agent you can watch
= one fast junior dev.
5
agents you can’t watch
= five ways to break main.
5
agents you can watch
= a team. That ships while you eat lunch.

Bomb Code is the third row.

01 · Isolation

Every agent gets its own branch.

Start a thread and it gets its own copy of the repo. Five agents, five branches, zero collisions. The board shows what’s working, what’s ready, and what’s already in main.

Main never breaks. You merge when you’re happy, by asking the agent to do it.

  • Threads can build on threads
  • Chat-driven merge: commit, resolve, check, merge
  • “Close feature” cleans up after itself
checkout-flowcheckout-flow @ MacBook Pro
checkout-flow
On this Mac
~/Documents/BombCode/checkout-flow
Put on a server Refresh
mainFinished work2 features have work that is not in main yet.Get latest from GitHub…New thread
Working2
An agent is on it, or nothing is saved yet.
Add Stripe webhook retriesAgent working
8 unsaved edits. The agent is running the tests.
Opus 5.5 · 2 chats · 3 helpers
Open chat
Fix flaky cart testNeeds you
Waiting for you to allow a command.
Astra · 1 chat
Open chat
In progress2
Has saved work that is not in main yet. Merge it when you’re happy with it.
Dead-letter dashboard
3 saved changes not in main yet · ready to merge
Sonnet 5 · 5 files changed · PR #212
Open chatMerge to mainMerge & close
Replay button
1 saved change not in main yet
Builds on Dead-letter dashboard · 2 newer changes there
grok-4 · 2 files changed
Open chatMerge Dead-letter dashboard first
In main2Clean up
Everything here is already in main. Close to tidy up.
Migrate to pnpm
Already in main.
Opus 5.5 · 14 files changed
Close
Explain the auth middleware
Questions only · no changes
grok-4 · 1 chat
Close

02 · Control

Nothing risky runs without your yes.

Plan mode is the default. Full access hides behind a confirm and never carries over to new threads. Deny rules win even when you turn everything on.

Every approval comes with a plain-English line explaining what you’re about to allow. You stop rubber-stamping.

  • Plan · Ask first · Auto · Full access
  • Deny rules beat every mode
  • Answered requests fold into one line
Fix flaky cart testcheckout-flow @ MacBook Pro
Astra2 unsaved editsMerge to main
The cart test fails about one run in ten on CI. Find out why and fix it. Don't touch the payment mocks.
Thought · Read 4 files · Ran 2 commands
Readtest/cart.test.ts
Readsrc/cart/totals.ts
Rannpm test -- cart --repeat 50
Editedtest/cart.test.ts
Found it. The test reads the clock twice, so a run that crosses a second boundary computes a different discount. I froze time in the test and want to prove it with 200 runs.
Permission requestedBash
npm test -- cart --repeat 200
In plain English: it wants to run only the cart tests, 200 times, to prove the flake is gone. Nothing is changed or sent anywhere.
AllowAlways allowDeny
Needs you· 1m 04s· Bashexplain ▸
stripe-retriesIsolated branch42%
Do anything…
Ask firstEnhanceReview loopOpus 5.5 HighFast · Off ▾

03 · Helpers

Claude writes. Codex reviews. Grok writes the docs.

Ask in plain words: “spin up a Codex helper on Astra to review this.” Your agent starts helpers on any agent and any model, in parallel, each on its own branch.

A second opinion from a different model, on every change, without opening a second app.

  • Up to 4 helpers at once
  • Never more permissive than the parent
  • Live cards: status, model, tokens
Add Stripe webhook retriescheckout-flow @ MacBook Pro
Opus 5.58 unsaved editsMerge to main
Add retries with exponential backoff to the Stripe webhook handler, plus a dead-letter table. Spin up a Codex helper on Astra to review it before you finish.
Thought · Read 3 files · Edited 3 files · Ran 2 commands
Readsrc/webhooks/deliver.ts
Editedsrc/webhooks/deliver.ts
Editedsrc/webhooks/deadLetter.ts
Subagent ·Review webhook retries (Codex · Astra)
Rannpm test -- webhooks
src/webhooks/deliver.ts +48−6
@@ -41,9 +41,22 @@ export async function deliver(event: StripeEvent) {
- await handler(event)
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
+ try {
+ return await handler(event)
+ } catch (err) {
+ await sleep(backoff(attempt)) // 2s, 8s, 32s, 2m
+ }
+ }
+ await deadLetter.put(event)
$npm test -- webhooks
✓ retries with backoff (412 ms)
✓ dead letters after 5 attempts (88 ms)
✓ signature survives a retry (31 ms)
● replays a dead letter…
Running · npm test · 1m 20s· ctx 42kexplain ▸
stripe-retriesIsolated branch42%
Do anything…
Ask firstOpus 5.5 High

04 · Flow

Keep typing. It queues.

Think of the next step while the agent works. Type it. It waits above the composer and goes out the moment the turn ends. Edit it, drop it, or send it now.

You stop waiting on the agent. Add dictation and read-aloud and you stop staring at it too.

  • Type-ahead queue
  • Dictation, on-device
  • Read replies aloud in any voice
Add Stripe webhook retriescheckout-flow @ MacBook Pro
Opus 5.58 unsaved edits · 1 change to mergeMerge to main
Add retries with exponential backoff to the Stripe webhook handler, plus a dead-letter table. Spin up a Codex helper on Astra to review it before you finish.
Thought · Read 3 files · Edited 3 files · Ran 2 commands
Retries are in. Failed webhook deliveries now back off at 2s, 8s, 32s, then 2m, and anything still failing after five tries lands in a dead-letter table you can replay from the dashboard. I also had a Codex helper review the change. It caught one real bug: we were re-signing the payload on each retry, which breaks Stripe's signature check. That's fixed, and there's a test for it.
2:14 PMRemember
Retries are in. Failed webhook deliveries now back off at 2s, 8s…1.25×
↺15❚❚↻150:41 / ~1:52
Queued · these go out together when the agent finishes
Edit · Remove · Send nowAlso log the attempt number
Edit · Remove · Send nowThen open a PR
stripe-retriesIsolated branch42%
And ping me on the phone when CI is green
Ask firstEnhanceReview loopOpus 5.5 HighFast · Off ▾

05 · Ship

From prompt to pull request in one window.

Review the diff file by file. Push the branch. Open the PR. Or run the review loop: plan, build, an independent review, then your approval.

The terminal, the diff tool, the PR page, and the second reviewer. All in the place you were already looking.

  • Changes panel with per-file diffs
  • Plan → Build → Review loop
  • Terminals, preview, and processes per thread
Add Stripe webhook retriescheckout-flow @ MacBook Pro
Opus 5.58 unsaved editsMerge to main
Add retries with exponential backoff to the Stripe webhook handler, plus a dead-letter table. Spin up a Codex helper on Astra to review it before you finish.
Thought · Read 3 files · Edited 3 files · Ran 2 commands
Readsrc/webhooks/deliver.ts
Editedsrc/webhooks/deliver.ts
Editedsrc/webhooks/deadLetter.ts
Subagent ·Review webhook retries (Codex · Astra)
Rannpm test -- webhooks
src/webhooks/deliver.ts +48−6
@@ -41,9 +41,22 @@ export async function deliver(event: StripeEvent) {
- await handler(event)
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
+ try {
+ return await handler(event)
+ } catch (err) {
+ await sleep(backoff(attempt)) // 2s, 8s, 32s, 2m
+ }
+ }
+ await deadLetter.put(event)
stripe-retriesIsolated branch42%
Do anything…
Ask firstOpus 5.5 High

Bomb Code for iPhone

Scan one QR code on your Mac. Now your phone sees every thread on every machine, live.

An approval card on the phone: Allow once, Always allow, Deny
A Claude Code thread mid-turn on the phone, running tests
Bomb Code for iPhone: threads across projects on a Mac and a server, with live status

Approve from anywhere

The agent asks. Your phone buzzes the card. Allow it from the grocery line. First answer wins.

Read along, live

The same transcript as the Mac, streamed. Steps, plans, subagents, all of it.

Talk, don’t type

Dictate the follow-up. Transcribed on the phone. Nothing leaves your device.

Listen to the reply

Read-aloud with lock-screen controls. Your agent’s report becomes a podcast for the walk home.

Start work from the couch

New thread, new project, or clone from Git. Pick the machine, the agent, the model.

No relay. No account.

The phone dials your Mac directly over pinned TLS. Tailscale gets you there from anywhere.

A finished Grok answer with headings, lists and a code block
Full answers, code and all
The New thread sheet: machine, project, own branch, prompt, mode and model
Start work from the couch
Composer with a follow-up and the dictation mic
Talk, don’t type
Paired machines: a MacBook Pro and a Linux server, both connected
Your Mac and your servers
A finished Claude Code thread with a summary
Done while you were out

Real iPhone app. Mock data.

Close the laptop. The work keeps going.

Put a project on a Linux box. Bomb Code installs its server over SSH, pairs it, and your threads keep running with the lid shut. Your Mac and your phone both drive it.

  • One-click SSH install
  • Sync both ways with git bundles
  • Invite a teammate to a shared server
Your Mac
lid closed
Linux box
agents running
Your iPhone
approving

No customer logos. Here are the facts instead.

3
agents in one app
0
telemetry
0
keys on our servers (there are none)
4
helpers at once
100%
of edits on a branch
“I was running four agents in four tabs and one of them touched main. So I built the cockpit.”
Max, builds Bomb Code

The offer

The Multi-Agent Cockpit for Mac and iPhone.

Here's everything in the box. And what it costs you to get it any other way.

  • Branch-per-thread isolation, board, and chat-driven mergeA weekend of git scripts
  • Cross-agent helpers: any agent, any model, in parallelThree apps and a clipboard
  • Approvals with plain-English explanationsReading forty prompts a day
  • iPhone companion: approve, read, dictate, start threadsBeing chained to your desk
  • Type-ahead queue, dictation, and read-aloudWatching a spinner
  • Plan → Build → Review loopA second engineer
  • Live usage bars for every providerThree billing tabs, always open
  • Servers that keep working with the lid shutA VPS and a tmux habit

Total

A lot of your weekends

Price

$0

MIT licensed. Bring your own Claude, ChatGPT, or Grok plan.

The Clean Exit Guarantee

Delete the app. Delete ~/.bombcode. Nothing else was touched. Your repos, your agent CLIs, and your configs stay exactly as they were.

Not for you if

  • ✕You want a hosted model or a cloud IDE.
  • ✕You’re on Windows. Today it’s macOS, iPhone, and Linux servers.
  • ✕You want yolo mode on by default.
  • ✕You don’t use Claude Code, Codex, or Grok yet.

For you if

  • ✓You run agents every day.
  • ✓You’ve been burned once.
  • ✓You’d rather approve from your phone than sit and wait.

The questions you’re already asking.

Five agents. One window. Zero edits to main.

zsh
$ git clone https://github.com/rhh4x0r/grok-build-tauri-control-panel.git
$ cd grok-build-tauri-control-panel && ./scripts/install.sh
Slide to detonate
Or slide. It’s more fun.

I’d rather you install it and delete it than keep running agents in tabs.