v0.3.0 · Linux and macOS · Apache-2.0

Talk to one agent. It runs the rest.

In twr you have one conversation, with an orchestrator. Ask for work and it starts named threads on Claude Code, Codex, Grok Build or any ACP agent, each in its own git worktree. Send a thread a follow-up by name. Questions, permissions and results come back here.

curl -fsSL https://twr.tools/install.sh | sh

ORCHESTRATOR your conversation illustration · the messages of a recorded session

  1. You: On api, rate limit logins per IP. On billing, round tax once on the invoice total.
  2. Orchestrator: Called 2 toolsspawn_thread × 2: a named thread each, with its own worktree and branch.
  3. Orchestrator: Started ratelimit on api and invoice-rounding on billing. I'll tell you when they need you.
  4. ✓ ratelimit allowed · Allow execute: cargo test -p api
    ratelimit · permission
    PERMISSION Allow execute: cargo test -p api
    task: Rate limit POST /login per client IP: 5 attempts a minute, then 429.
    1 allow 2 denyThe hub puts it here and on the thread's card. No orchestrator turn.
  5. You: allow ratelimit
  6. Hub: Applied: ratelimit: allow.The hub applies a short command as typed. Any other answer goes on a card only you can confirm.
  7. ratelimit finished · success
    Added a per-IP limiter to POST /login: 5 attempts a minute, then 429 with Retry-After. All 31 api tests pass, including the new one.
  8. invoice-rounding finished · success
    Tax is now rounded once on the invoice total instead of per line. The 12 invoice tests pass.
  9. You: Tell ratelimit to cover POST /signup the same way.
  10. Orchestrator: Called 1 toolsend to ratelimit: “Also limit POST /signup the same way: 5 attempts a minute per client IP, then 429.” Queued if the thread is busy.
  11. Orchestrator: Sent to ratelimit. I'll tell you when it's done.
  12. ratelimit finished · success
    POST /signup now shares the login limiter: 5 attempts a minute per IP, then 429. All 33 api tests pass.
orchestratorstarts and messages threads; writes no code

THREADS

ratelimitapi · twr/ratelimitdone ✓ · 2 ahead of main
invoice-roundingbilling · twr/invoice-roundingdone ✓ · 1 ahead of main

An illustration of the session recorded below, with its real messages; in twr it's a terminal UI. The TUI folds the orchestrator's tool calls into “Called 2 tools”; the orange notes say what they did.

how it works

Four things you just saw.

The orchestrator writes no code and runs no commands. It starts and messages threads with twr's tools, and the hub brings back what they need from you.

  1. You ask

    On api, rate limit logins per IP. On billing, …

    It starts one named thread per task, on the runtime you choose, each in a git worktree on its own branch.

    spawn_thread × 2

  2. A thread needs you

    allow ratelimit

    Permissions and questions land in the conversation and on the thread's card. You answer there, or open the card with Enter and press a digit.

    applied by the hub, never decided by an agent

  3. Results come back

    ratelimit finished · success

    Each report arrives in the same conversation, and the card keeps the branch and how far ahead it is.

    no orchestrator turn spent

  4. You follow up by name

    Tell ratelimit to cover POST /signup …

    The orchestrator sends it to that thread, which picks up with its own context. Or open its card and type to it directly.

    send · queued if busy

the real thing

The same session, in the terminal.

Threads on the left, your conversation on the right. Press Enter twice on a card to open a thread and type to it directly; Esc brings you back. On a phone, under 60 columns, the TUI turns into one screen at a time, so you can answer from anywhere over SSH or mosh.

twr · recorded session
The twr TUI: the user asks for two threads, they appear in the Threads sidebar, ratelimit asks to run its tests, the user types allow ratelimit, both threads report back, the user sends ratelimit a follow-up, it reports again, and the user opens ratelimit's transcript.
Recorded from the real hub, MCP tools and TUI. The orchestrator and the workers are small scripted ACP agents, so no model ran; nothing here is a mock-up.

around the conversation

What makes the threads worth delegating to.

Any agent you use

Claude Code, Codex, Grok Build or any ACP agent, under your own login. Switch the orchestrator or a thread to another runtime mid-task. Runtimes

A worktree per thread

Parallel threads on one repo never touch each other's files. Park one to free its worktree and resume it later. Worktrees

Your permissions stay yours

Thread agents can't answer a permission, change a mode or prompt another thread, and the orchestrator passes on only an answer you gave. twr is not a sandbox: the security model says what it covers.

Threads on other machines

Run a thread on a box over SSH, in a container, or on a machine that dials in. It keeps going across disconnects and laptop sleep. Boxes

Answer from your phone

A compact layout for any phone terminal, with tabs for Chat, Needs you and Threads. No app and no server in between. Phone layout

Built for long work

The orchestrator keeps notes on your setup across sessions; threads compact their context; jobs queue on the machine's slots. Memory

twr itself has no account, no cloud service and no telemetry. Your agents call their providers under your logins, so their terms and quotas apply; the hub also asks a small model for suggestions and summaries until you turn them off.

install

Your first conversation in three steps.

  1. Install twr. The release build for your machine goes in ~/.local/bin, without sudo, checked against the release's checksums.
    curl -fsSL https://twr.tools/install.sh | sh

  2. Sign in to an agent. twr runs claude, codex or grok as you; log in with each one's own CLI first.
  3. Open it and say what you want. The first run asks which agent runs your orchestrator.
    twr        # the TUI; starts the hub
    twr update # later: the latest release

Linux x86_64 and aarch64, macOS on Apple silicon and Intel; Windows is unsupported. Or download an archive from the releases page, or build it with Rust 1.89 or newer: cargo install --locked --git https://github.com/ignaval/twr twr-cli. twr is before 1.0 and has one maintainer. install.md · changelog