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 Build DB

Started by this project2

postgrespostgres:16Up 12m5432→5432

redisredis:7-alpineUp 12m6379→6379

Everything else1

mailhogmailhog/mailhogExited (0)

gradlew build2

cannot find symbolsymbol: variable delayMsRetryPolicy.java:42

incompatible types: long cannot be converted to DurationWebhookSender.javaWebhookSender.java:88

$ ./gradlew build --console=plain

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;

start 2.4s switch 240ms memory 128MB terminals 2 buffer 1.2MB / 8MB watching 3 let it sleep clean up
  • 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

Coming from VS Code · IntelliJ

The keys your hands already know.

Keep your IDE. A worktree is an ordinary folder, so the IDE you use opens it as it is — hand codeme only the part where several agents run and you read what they did. The shortcuts were transcribed from the keymap files the two products actually ship.

Keymap
Go to file ⌘P⌘⇧O
Find in files ⌘⇧F⌘⇧F
Go to symbol ⌘T⌘⌥O
Replace in files ⌘⇧H⌘⇧R
Commit · Source control ⌃⇧G⌘K
Terminal ⌃`⌥F12
Open the debugger ⌘⇧D⌘5
Step over F10F8
Step into F11F7
Toggle breakpoint F9⌘F8
Duplicate line ⇧⌥↓⌘D
Go to line ⌃G⌘L
Format code ⇧⌥F⌘⌥L
The problems list ⌘⇧M⌘6
Agent changes ⌃⇧X⌃⇧X
Say it to several agents ⌘⌥⇧A⌘⌥⇧A

As on macOS. A key that does not suit you is re-recorded per command under Shortcuts in settings, by pressing it.

What you installed extensions for, from the start.

  • Prettier · ESLintOn save, the formatter and linter the project declares. If it declares none, nothing runs.
  • GitLensWho last changed the current line, at the end of it; the commit graph in the History tab.
  • DockerThe containers Compose started, in the Docker tab — start · stop · restart · logs.
  • SQLToolsThe Database tab. Connection details are found in the workspace.
  • Error LensThe language server's diagnostics, right in the editor's gutter.
  • launch.jsonIf there is a .vscode/launch.json, the debugger reads it as it is.

Where the tool windows were.

  • Project⌘1The files sidebar
  • Run⌘4Tests — failures as a list of lines you can click
  • DebugF8IntelliJ's stepping keys, unchanged — F7 · F8 · ⇧F8
  • Services⌘8The Docker tab — the containers Compose started
  • Version Control⌘9The history graph, and commits
  • Database⌃⇧QThe Database tab — postgres · mysql · sqlite · H2 …

The editor is Monaco, and the language servers are the ones already installed. Gradle · Maven run through their wrappers, and nothing is installed on your behalf.

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

Scene 04

And why it was changed that way.

A diff says what changed. Why it was done that way scrolls past in a terminal and is gone. codeme keeps that conversation beside the file it changed.

  • Pick a file and the conversation that wrote it opens
  • Nothing new is recorded — it reads what is already on disk

Try it

One more, and another.

Each agent has a worktree of its own, so none of them steps on another's files. How many are running and how many are waiting for your answer is counted in the menu bar — even while you are in another app.

  • Press Answer on a waiting card and that agent carries on
  • When the window is not in front, an OS notification says so instead

codeme 2running 1waiting on you

  • feat/webhook-retry+14−3 Exponential backoff and jitter for retries doneClaude Code
  • fix/idempotency-key+31−8 Stop duplicate requests with the same key waiting on youCodex Should I write a migration too?
  • feat/invoice-table+22−1 Add a total row to the invoice table Writing codeClaude Code
  • chore/bump-deps+6−6 Bump dependencies and run the tests Running testsCodex Major versions too?

A closer look

When several worktrees run side by side.

Ports, a browser, review, going back — what working on several branches at once needs. Pick a tab to see each one. What arrived when is in the release notes.

payments-api3 worktrees

  • feat/webhook-retry:5173 ✓ Checks… CI✓ CI
  • fix/idempotency-key:5174 ✓ Checks✕ CI
  • feat/invoice-table:5175 … Checks 1 file would conflict if merged into origin/mainsrc/webhook/retry.ts

Each card carries the port of the server its worktree started, and if you turn it on, a new worktree's ports are moved so they do not overlap. Clashes are measured again every minute, and when you come back to the window.

retry.tsInvoices

localhost:5173/invoices

Invoices

INV-1042Acme$1,200
INV-1043Globex$860
Total$2,060

ConsoleNetworkElements

200GET /api/invoices38ms

200GET /api/invoices?total=121ms

Type just 3000 in the address bar and localhost opens. The app's shortcuts still work while you are looking at the page, and devtools dock inside the tab.

#482 Tidy the webhook retry queuejiwon → you

src/webhook/retry.ts

 export function retryDelay(attempt) {+  const cap = BASE * 2 ** attempt;+  return Math.random() * cap;

jiwonjust now

Without a cap the delay can go past 30 seconds. Please bound it with MAX.

Paste to agentReply

Claude Code · feat/webhook-retry› Comment from jiwon — without a cap the delay can go past 30 seconds.

When an agent is running in the worktree that has the PR's branch, every thread gets Paste to agent. GitHub · Forgejo take line comments; Bitbucket Cloud is read.

Local historyfeat/webhook-retry

  1. 14:32Agent turnretry.ts · retry.test.ts
  2. 14:28Saveretry.ts
  3. 14:05Agent turnqueue.ts — deleted file
-  return Math.random() * cap;+  return cap / 2 + Math.random() * cap / 2;

Restore to this point

The previous contents are kept on every save, and every time an agent finishes a turn. Go back to the time between two commits that git knows nothing about.

Features

What one codeme takes on.

From worktrees to diffs, the terminal, tests, builds, the debugger, containers and tickets. Everything you used to move between apps for ends 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, go to definition and implementation, usages, callers and highlighting are all answered by the language server already on your machine — nothing is bundled or installed on your behalf.

  • 05

    Tests and builds

    Only the runners the project declares in its own files, and for Gradle and Maven that means the wrapper. A failure arrives as a list of lines you can click rather than four hundred lines of log.

    ⌃⇧U · ⌘⇧B

  • 06

    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.

  • 07

    The debugger

    Go, Python, Java, C, C++ and Rust. Conditional and hit-count breakpoints, logpoints and watches. It uses the adapter already installed, and reads VS Code's launch.json as it is.

    ⌘⇧D · F5

  • 08

    Local history

    Every save keeps what was there before. Between one commit and the next — the stretch git knows nothing about — you can put a file back in one step.

    ⌃⌥⇧H

  • 09

    Queued work · checks

    While you are away, agents work through jobs one at a time. Send one instruction down several branches, keep only the one that won, and the checks the project declares run when an agent stops.

    ⌃⌥Q

  • 10

    My work

    GitHub, Forgejo, Gitea, Bitbucket and Jira, read directly through each one's own API. You connect by signing in from the browser, and the token goes into the OS credential store. A worktree from a ticket, a pull request from a worktree — and reviews asked of you are read and answered line by line inside the app.

    ⌃⇧Y · ⌃⌥Y

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 and Linux for now — one app to install, and the agent CLIs stay the ones you already use.

Already used it? Leave some feedback. One star on its own is enough.