~/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 previewsoonmacOS · Linux · built on Ghostty’s terminal core
> 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
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.
# 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)
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