--
Every coding-agent CLI in one place. A desktop app (Tauri + xterm.js): add a project folder, then spawn Claude Code, Codex, Cursor, or a plain terminal in any directory - tiled side-by-side, each with a live activity dot and a workflow status you set.
Download the latest .dmg from Releases,
open it, and drag tt to Applications.
The build is unsigned, so on first launch: right-click tt -> Open -> Open (only needed once). Then install the agent CLIs you want (see Requirements).
- Projects - add a folder via the native picker; switch via the top-bar dropdown (persisted).
- Directory tree (right panel) - browse, create folders, and open an agent in any folder.
- Auto-grid tiling of all running agents; click a tile to zoom (focus mode).
- Status - a live dot (working / idle / exited) plus a workflow tag you set: Planning · In progress · In review · Done (it colors the tile).
- Rename agents (double-click the title); collapse the left/right panels.
- × kill an agent from its tile or the rail.
-
Rust (rustup) and Node 20+
-
tmux (optional) - agents run inside it so their sessions survive closing/restarting the app; without tmux they still work but don't persist.
-
The agent CLIs you want to use, on your
PATH:claude- Claude Codecodex- Codex CLIcursor-agent- Cursor CLIgemini- Gemini CLIopencode- opencode CLIantigravity- Antigravity CLI- a shell for the plain terminal (uses
$SHELL)
Gemini's free Google sign-in was deprecated for the CLI. Set a
GEMINI_API_KEY(free key at aistudio.google.com/apikey) or choose "Use Gemini API Key" in its prompt.
# from the repo root
source scripts/dev-env.sh # puts cargo + node on PATH (see note below)
npm install
npm run tauri dev # compiles the Rust, opens the app windowProduction build: npm run tauri build.
scripts/dev-env.shexists because this machine loads node through an nvm lazy-loader that only works in interactive shells; it drops the stub and pointsPATHat node +~/.cargo/bin. If cargo and node are already on yourPATH, you can skip sourcing it.
Each agent is launched in the folder you pick:
| Agent | Command |
|---|---|
| claude | claude --permission-mode auto --effort high --session-id <uuid> |
| codex | codex --sandbox workspace-write --ask-for-approval never |
| cursor | cursor-agent |
| gemini | gemini |
| opencode | opencode |
| antigravity | antigravity |
| terminal | $SHELL -l |
Claude gets a pinned --session-id so tt reads exactly that session's title +
token count from ~/.claude/projects (no cross-talk between two claudes in one
folder).
While tt is running it exposes an MCP server at http://127.0.0.1:4127/mcp
(loopback only, no auth). Point any agent CLI at it and that agent can spawn and
coordinate more agents — the new agents appear as normal tiles in tt.
Tools: spawn_agent(agent, dir) · list_agents() · send(agent_number, text) ·
broadcast(text, numbered?) · close_agent(agent_number). Agent numbers are
hierarchical — a sub-agent spawned by #1 is 1-1.
Add it to Claude Code (restart the session afterward):
claude mcp add tt --transport http http://127.0.0.1:4127/mcp
# verify: claude mcp list → tt … ✔ ConnectedEvery other CLI uses the same URL — see docs/MCP.md for Codex, Cursor, Gemini, and opencode config snippets.
source scripts/dev-env.sh
cd src-tauri && cargo test # Rust: registry, PTY, jsonl parsing, fs
cd .. && npm test # frontend: store + tiling mathdocs/superpowers/specs/ (design) and docs/superpowers/plans/ (implementation
plan).