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.

Repositorypayments-api Branchfeat/webhook-retry Pull origin↑1 ↓2
Agent Git History
Claude Codefeat/webhook-retry Waiting

add exponential backoff with jitter to the webhook retry, and test it

Reading the existing retry path and where the tests draw the line.

Code searchretry · webhook · backoffdone

Replacing the fixed delay with capped exponential backoff, and applying jitter.

npm test -- retry18 passed · 0 failedpassed

Done. The retry policy and its regression tests were updated together.

Starting the agent… ⌘ ↵
Agent changes retry.ts My work
What the agent changed2 files · baselined at the start of the session +14−3
src/webhook/retry.ts+8−2
@@ -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);
src/webhook/retry.test.ts+6−1
@@ -4,3 +4,9 @@
+it("caps the delay", () => {
+  expect(retryDelay(9)).toBeLessThanOrEqual(MAX);
+});
Terminal
$ npm test -- retry
✓ 18 passed in 1.24s
$ 
Docker DB

Started by this project2

postgrespostgres:16Up 12m5432→5432

redisredis:7-alpineUp 12m6379→6379

Everything else1

mailhogmailhog/mailhogExited (0)

payments · postgres 165432

public.webhook_deliveryid · endpoint · status · attempts12,480 rows

public.webhook_attemptdelivery_id · delay_ms · error48,102 rows

public.idempotency_keykey · created_at3,914 rows

select count(*) from webhook_attempt where error is not null;

memory 128MB terminals 2 buffer 1.2MB / 8MB watching 3 start 2.4s switch 240ms let it sleep clean up

These tabs sit beside the agent the whole time. There is no second app to walk to.

Changes History
Historyfeat/webhook-retry · ↑1 on origin

7f2d10cHEAD → feat/webhook-retryfeat(webhook): back off between retriesdhmkchs

a3c9037Merge branch 'main' into feat/webhook-retrydhmkchs

1c84be0test: add the duplicate-request casedhmkchs

e3181d2origin/mainfix(desktop): the preedit sits on the griddhmkchs

9b21f04chore: tidy the release scriptminseo

Pick a commit and its diff opens beside it
Docker
Containers3 containers · 2 running Filter containers

Started by this project2

postgrespostgres:16Up 12m5432→5432

redisredis:7-alpineUp 12m6379→6379

Other containers on this machine1

mailhogmailhog/mailhogExited (0)Starting…Up 3s

My work
My work ListBoard Filter this list Refresh

Waiting on you 3

  • #482 Tidy the webhook retry queue Review requested payments-api jiwon backend 3 comments 2h ago Openworktree
  • #479 Verify webhook signatures Review requested payments-api minseo yesterday Openworktree
  • #488 Wording for the payment-failure notice Review requested payments-web sora frontend 30m ago Openworktree

Yours 6

  • PAY-311 Sort out idempotency key reuse In progress Payments dhmkchs Sprint 24 5 comments today Openworktree
  • PAY-322 Re-run script for the settlement batch In progress Payments dhmkchs Sprint 24 yesterday Openworktree
  • PAY-318 Put retry metrics on the dashboard To do Payments dhmkchs this week Openworktree
  • PAY-327 Settle the refund API response schema To do Payments dhmkchs next week Openworktree
  • PAY-290 Design note for webhook retries done Payments dhmkchs last week Openworktree
  • PAY-284 Mask the payment logs done Payments dhmkchs 2 weeks ago 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
Signed in: Jira · GitHub ⌃⇧Y
Databases
paymentspostgres 16 · localhost:5432

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 pkdelivery_iddelay_mserror
481009f2c1000empty
481019f2c2480empty
48102a71d4000timeout

rows 1–50 · of 48,1021 value changed · ⌘↵ to saveSaved

Search the project
retry ⌘⇧O

20 matches4 files

retry.tssrc/webhook:18

retry.tssrc/webhook:24

retry.test.tssrc/webhook:4

queue.tssrc/webhook:57

src/webhook/retry.tssrc/webhook/retry.tssrc/webhook/retry.test.tsPreview
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);
↑↓ move · ⏎ open — the line shows beside you before you pick
  • 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_modules stay 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.

  1. 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.

  2. Start an agent in the worktree you made

    Starting fresh and resuming are different actions. The menu asks which one first.

  3. Watch the files change beside you

    A diff with syntax highlighting. Open the folded lines and you see which function these three sit in.

  4. 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.