Run several
coding agents.
Read it all on
one screen.
One worktree per task. Start Claude Code or Codex inside it,
and read the changed code and the tests in the same window.
The window below replays a real working session.
add exponential backoff with jitter to the webhook retry, and test it
@@ -18,7 +18,11 @@ export function retryDelay(attempt) { - return 1000; + const cap = Math.min(BASE * 2 ** attempt, MAX); + return Math.random() * cap; } +if (attempt > LIMIT) return deadLetter(job);
@@ -4,3 +4,9 @@ +it("caps the delay", () => { + expect(retryDelay(9)).toBeLessThanOrEqual(MAX); +});
$ npm test -- retry▋ ✓ 18 passed in 1.24s $ ▋
Started by this project2
postgrespostgres:16
redisredis:7-alpine
Everything else1
mailhogmailhog/mailhog
payments · postgres 165432
public.webhook_deliveryid · endpoint · status · attempts
public.webhook_attemptdelivery_id · delay_ms · error
public.idempotency_keykey · created_at
select count(*) from webhook_attempt where error is not null;
These tabs sit beside the agent the whole time. There is no second app to walk to.
7f2d10cHEAD → feat/webhook-retryfeat(webhook): back off between retries
a3c9037Merge branch 'main' into feat/webhook-retry
1c84be0test: add the duplicate-request case
e3181d2origin/mainfix(desktop): the preedit sits on the grid
9b21f04chore: tidy the release script
Started by this project2
postgrespostgres:16
redisredis:7-alpine
Other containers on this machine1
mailhogmailhog/mailhog
Waiting on you 3
- #482 Tidy the webhook retry queue Review requested Openworktree
- #479 Verify webhook signatures Review requested Openworktree
- #488 Wording for the payment-failure notice Review requested Openworktree
Yours 6
- PAY-311 Sort out idempotency key reuse In progress Openworktree
- PAY-322 Re-run script for the settlement batch In progress Openworktree
- PAY-318 Put retry metrics on the dashboard To do Openworktree
- PAY-327 Settle the refund API response schema To do Openworktree
- PAY-290 Design note for webhook retries done Openworktree
- PAY-284 Mask the payment logs done Openworktree
To do 2
- PAY-318 Put retry metrics on the dashboard Paymentsthis week
- PAY-327 Settle the refund API response schema Paymentsnext week
In progress 2
- PAY-311 Sort out idempotency key reuse Paymentstoday
- PAY-322 Re-run script for the settlement batch Paymentsyesterday
Review 3
- #482 Tidy the webhook retry queue payments-apiwaiting on you2h ago
- #488 Wording for the payment-failure notice payments-webwaiting on you30m ago
- #479 Verify webhook signatures payments-apiwaiting on youyesterday
Done 2
- PAY-290 Design note for webhook retries Paymentslast week
- PAY-284 Mask the payment logs Payments2 weeks ago
Found in this folder3
public.webhook_attempt48,102 rows
public.webhook_delivery12,480 rows
public.idempotency_key3,914 rows
public.webhook_attempt SQLRefresh+ New row
error is not null
| id pk | delivery_id | delay_ms | error |
|---|---|---|---|
| 48100 | 9f2c | 1000 | empty |
| 48101 | 9f2c | 2480▋ | empty |
| 48102 | a71d | 4000 | timeout |
rows 1–50 · of 48,1021 value changed · ⌘↵ to saveSaved
20 matches4 files
retry.tssrc/webhook
retry.tssrc/webhook
retry.test.tssrc/webhook
queue.tssrc/webhook
16 const MAX = 30_000; 17 18 export function retryDelay(attempt) { 19 const cap = Math.min(BASE * 2 ** attempt, MAX);22 } 23 24 if (attempt > LIMIT) return deadLetter(job); 25 queue.push(job, retryDelay(attempt));2 import { retryDelay } from "./retry"; 3 4 it("caps the delay", () => { 5 expect(retryDelay(9)).toBeLessThanOrEqual(MAX);
- One windowworktree · code · terminal · agents
- No accountNo sign-in, no telemetry, no server
- memory 128MBA Tauri 2 shell that bundles no browser engine
- macOSApple Silicon · Intel
Scene 01
Leave the branch alone.
Take one more desk.
One worktree per task. Nothing swaps under you, so the build cache and node_modules stay warm — and the agent starts right where you made it.
- Making one, deleting one, moving between them — all in one menu
- If the branch is not on this machine, it is fetched and then made
Scene 02
Every agent gets its own desk.
Claude Code, Codex — whichever CLI you already use, started right there. How many are running and how many are waiting on you shows in the menu bar.
- The + menu asks first: start fresh, or resume
- Move to another worktree and the session stays where it was
Scene 03
Only what changed, at a glance.
The baseline is the moment the session started. Edits you made before that are not mixed in, and the tests run in the terminal of the same window.
- A diff with syntax highlighting, and folded lines that open
- Staging · committing · pushing, inside the same window
Features
What one codeme takes on.
From worktrees to diffs, terminals, containers and tickets. Everything you used to change apps for finishes inside this window.
-
01
worktree
Made per project, deleted, moved between. Nothing swaps under you, so the build cache and
node_modulesstay warm. -
02
Agent sessions
Claude Code and Codex, started inside a worktree. How many are running and how many are waiting shows in the menu bar.
-
03
Agent changes
Read only what the agent changed. The baseline is the moment the session started, so edits you made before that are not mixed in.
⌃⇧X
-
04
Editor
Monaco underneath. Completion, hover and go-to-definition are answered by the language server already installed here — nothing is bundled and nothing is installed for you.
-
05
Docker · databases
The containers compose brought up, and the tables inside them, in the same window. Connection details are found in the workspace — you do not retype a host and a port.
-
06
My work
GitHub, Forgejo and Jira, read directly through their own APIs. Pick a pull request and make a worktree on its branch. The token goes to the OS credential store.
Compared
An app built for agents.
Editors were built for one person typing, and agent wrappers mostly stop at the terminal. codeme is a window where worktrees, diffs, terminals and containers were there from the start.
| What | codeme | Editors · agent wrappers |
|---|---|---|
| A separate git worktree per task | ✓ | some |
| A diff of only what the agent changed | ✓ | — |
| Baselined at the moment the session started | ✓ | — |
| Terminal · Docker · databases in the same window | ✓ | extension |
| Uses the language servers already installed | ✓ | bundled |
| A worktree straight from GitHub, Forgejo or Jira | ✓ | — |
| No account · no server · no telemetry | ✓ | varies |
| A shell that bundles no browser engine | ✓ | bundled |
| Memory one window uses | 128MB | varies |
The flow
From ticket to commit, in codeme alone.
-
Pick a ticket in My work
Review requests on top, what you were assigned underneath. If the branch is not on this machine, it is fetched and then the worktree is made.
-
Start an agent in the worktree you made
Starting fresh and resuming are different actions. The + menu asks which one first.
-
Watch the files change beside you
A diff with syntax highlighting. Open the folded lines and you see which function these three sit in.
-
Stage it, commit it, push it
The history graph and the commit screen are in the same window. Pushing carries on from where you committed.
local-first
All of it inside the codeme app.
Open files, PTY processes, worktrees, commits — every piece of state this app handles is on disk. No server, no account, no request to wait on before the screen is drawn.
One exception, on purpose. Only the My work panel reads the GitHub, Forgejo and Jira APIs. The token goes to the macOS keychain, the settings file keeps only the address, and no IPC command hands a token back to the window. It is written out in the Privacy Policy.
Get it
Start with the branch you were on today.
There is no account and no server, so there is nothing to sign in to after you download it. Install it, open it, start.
macOS first — one app to install, and the agent CLIs stay the ones you already use.