~/work ❯ ws

Run every agent.
Know which one needs you

wrkstrms is a terminal environment for running many AI coding agents at once. It holds them in real terminals that keep running when you close the window, shows you which one is waiting on you, and gives every agent the same memory, so work carries from one session, and one agent, to the next.

$ ws is in private previewsoon
read the docs →

macOS · Linux · built on Ghostty’s terminal core

▲ wrkstrms / checkout-flow◇ 2 to approve● 1 needs you⌃␣ a◐ 1 working✓ 1 done
● form statetests+
● form stateclaude · needs Bash
> keep the checkout form's values when a submit fails

● From memory: form state lives in
  useCheckoutForm, and specs need bin/setup_db.

● I'll add a failing test first, then move the
  form state out of the submit handler.

  Edit app/checkout/form.test.tsx +31
  Bash pnpm test checkout
    ✗ keeps values after a failed submit

● Fails as expected. Now the fix:

  Edit app/checkout/form.tsx +18 −4

Allow Bash: pnpm test checkout?
  1 yes  2 always  3 no
◐ limitscodex · working
› tighten the per-key rate limiter
  and add metrics

• Explored src/limiter.rs, src/metrics.rs
• Edited src/limiter.rs +42 −11
• Burst size is a guess; the last handoff
  asked the same. Keeping 20 for now.
• Added limiter_rejections_total
• Edited src/metrics.rs +14
• Edited tests/limiter.rs +58
• Running cargo test limiter 
devzsh · pnpm dev
~/storefront/checkout-flow ❯ pnpm dev

  ready in 412 ms
  ➜ Local   http://localhost:5173/

10:41:52 page reload app/checkout/page.tsx
10:42:07 hmr update /app/checkout/form.tsx
10:42:31 hmr update /app/checkout/form.tsx
10:42:31 hmr update /app/checkout/useCheckoutForm.ts
10:43:05 warn form.tsx: unused import 'z'
10:43:12 hmr update /app/checkout/form.tsx
✓ docsclaude · done
> document the new checkout states

● Added docs/checkout.md with the four
  states and when each one shows.

  Read  app/checkout/useCheckoutForm.ts
  Write docs/checkout.md +64
  Bash  git commit -m "Checkout states"

● Done. Proposed a memory: “checkout state
  lives in useCheckoutForm”.
NORMAL⎇ feat/checkout-v2#214 CI ✓⌃␣ ? keys · settings

shared memory

One memory.
Every agent.

Facts about the repo, decisions and why they were made, your preferences, where the work stands. ws keeps them in one place that every agent and model shares, so switching from Claude to Codex, or starting fresh tomorrow, doesn’t mean starting over.

  • at start

    Every agent starts briefed

    When an agent starts, ws hands it a context pack: pinned items, your preferences, decisions, current tasks, the latest handoffs and recent sessions in this repo. Claude Code gets it again after /clear and compaction.

  • ws mcp

    Agents read and write it themselves

    Over MCP, agents search memory and save what the next one should know. Anything shared waits as proposed until you approve it, so nothing reaches every agent without you seeing it.

  • ⌃␣ A

    Hand work to another agent

    Move a pane from Claude to Codex and back. The new agent starts with a “continuing from” section: the last prompts, commits, the uncommitted change and the handoff.

  • local

    Yours, on your machine

    One SQLite file, readable only by you, never sent anywhere. Tokens, keys and secrets are redacted before anything is stored, and every item records who wrote it.

what an agent sees when it starts
# Context from ws
Shared memory for storefront · checkout-flow

## Preferences
- Small PRs, one feature each [m:4f2a]

## Decisions
- Checkout form state lives in useCheckoutForm,
  not the page component [m:91c0]

## Facts
- Run bin/setup_db before the specs [m:0b7e]

## Latest handoffs
- codex · limiter done, metrics next;
  open: what burst size? [m:c3d1]

## Recent sessions here
- today · claude · keep the checkout form’s
  values when a submit fails (2 commits)
claude⌃␣ Acodexcontinues with the prompts, commits, diff and handoff

what else it does

Built for a dozen agents at once.

  • ⌃␣ a

    Jump to the agent that needs you

    Claude Code and Codex report through hooks: blocked, working, done or idle. The color runs through the pane frame, its tab and its sidebar row, and one key takes you to the next agent waiting on you.

  • ⌃␣ d

    Close the terminal. Keep the agents.

    Panes live in a background server. Detach, or just close the window, and every agent keeps running; ws puts you back on the same screen. After a crash or reboot it offers to restore the session.

  • ws new

    A workstream per task

    A git worktree and branch, the panes and layout from your template, and its setup, in one command. Start one from a pull request with --pr.

  • ws review

    Reviews with an agent on hand

    Each PR gets its own worktree, a file with its description, comments and reviews, and your review agent starting at once. ⌃␣ g lists what’s waiting for you across your GitHub logins.

  • ws project

    Projects that outlast a session

    A brief, a plan, decisions and a handoff log that carry work across agents and days. ws project continue picks up where the last session stopped.

  • nvim

    Real terminals, not a dashboard

    Every pane is a real terminal, rendered by Ghostty’s libghostty-vt: true color, the kitty keyboard protocol, mouse. Run Neovim, lazygit and shells beside your agents.

works with

Bring your agents.

Claude Code and Codex report their full status through hooks. Other agent CLIs are recognized by their process name, even under node, bun or Python.

  • Claude Code(status through hooks)
  • Codex(status through hooks)
  • OpenCode(recognized by process name)
  • aider(recognized by process name)
  • Gemini CLI(recognized by process name)
  • goose(recognized by process name)
  • Amp(recognized by process name)
  • Cursor agent(recognized by process name)
  • Qwen Code(recognized by process name)
  • Crush(recognized by process name)
  • Ollama(recognized by process name)

five minutes

Start a session.

Connect your agents once, start ws, and open a workstream. The getting started guide walks through the rest.

# once per agent CLI: status hooks and memory
$ ws integrate claude --mcp
$ ws integrate codex --mcp

# start, or reattach to what's running
$ ws

# a worktree, a branch and your panes
$ ws new web checkout-v2