twindem.ai
Private preview · Native macOS · Signed & notarized · Windows next
Twindem Team — the nervous system around your terminal
The terminal is the stage: your AI coding agents — Claude Code, Codex — run unmediated,
exactly as in your favorite terminal. Team adds everything a bare terminal can't: every tab is
a board task, agents start briefed with the project's real context, a second agent reviews with
a typed verdict, and nothing ships while findings are open.
shipping in private preview · auto-updating · dark theme shown
00
One platform, two native clients
Everything meets on twindem.ai — Admin (organization, projects, seats),
Board (the single source of truth for work) and Docs (architecture, decisions,
approved designs). Two native apps work against it: Twindem Team, where humans and AI
agents build, and Twindem Pulse, where the project communicates.
Twindem Team
build · native macOS
Terminal-first shell for AI coding agents. Tasks captured with a brief, agents briefed
from the board, cross-agent reviews, visual Studio, delivery gates.
tasks · phases · verdicts · docs
⟵⟶
twindem.ai
the platform
AdminBoardDocs
One account. Projects, grants and agent access flow from here — the Board is the source
of truth; agents reach it through the official Twindem MCP tools.
⟵⟶
mail → tasks · digests · project chat
Twindem Pulse
communicate · native macOS
Mail, calendar and project communication with Vio AI — emails become board tasks, digests
brief your day, the same projects and docs everywhere.
01
What Team does
Everything below is built and running today.
Tasks with a brief, tabs that know them
⌘T captures a task with title + brief straight onto the Board; the tab binds to its key,
the phase moves to in-progress and you become the assignee the moment work starts. Numbered
tabs, ⌘1–9 jumps, project-grouped strip.
Agents that start briefed
Choose the agent at capture — Claude Code or Codex — and it opens already reading the
task: description, board history, approved designs. The official Twindem MCP tools and the
twd-* skill family work in ANY terminal, both CLIs, zero API-key setup.
Cross-agent review, typed verdicts
⌘R (or right-click → Review with…) spawns a second agent — even from the other vendor —
that reads the board record, reviews the code and posts a typed verdict. Request-changes
findings block Done at the server until fixed, resolved or dismissed.
The Studio — visual work, live
/twd-design, /twd-architecture, /twd-seq-diagram: the agent proposes HTML — UI mockups,
C4 diagrams, sequence flows — previewed live beside the terminal (mobile & desktop
viewports). Approve publishes it to Docs, flagged and linked; future FE work must follow it.
Peripheral vision, not dashboards
Ambient chips per tab (phase, CI, turn state, git, token cost), a two-second HUD (⌘0),
Needs-me/FYI notifications with per-class sounds, session digest when you return, menu-bar
count, focus mode that softens noise but never silences a blocked agent.
The app maintains the agent environment
Skills, MCP server and turn-detection hooks ship inside the app and are provisioned —
with consent — to Claude Code and Codex alike. A new teammate installs the app, signs in,
clicks once: their agents know Twindem. Updates arrive via the app (Sparkle).
02
The main window
One tab = one agent session bound to a work item. Here: Agent 1 just finished
its turn on TASK-142, the operator pressed ⌘R (confirmation bar, top), the
⌘⇧N drawer is open, and a toast announces Agent 2's verdict from another task.
Twindem Team — twindem-app
TASK-142 auth-fix ◦ idle 2m
TASK-139 settings-migration ⚑ verdict
TASK-127 rate-limiter ■ blocked
+
⌘R
Review TASK-142 (12 files vs main, branch feat/auth-fix) with A2
⏎split⇧⏎background tabesccancel
implement token invalidation on logout per the TASK-142 acceptance criteria
Reading the current logout flow in AuthService…
Read(src/auth/AuthService.ts)
214 lines
Edit(src/auth/AuthService.ts)
+18 −3 · revoke the refresh token server-side on logout
Write(src/auth/__tests__/logout.test.ts)
new test: redirect loop after logout
Bash(npm test -- auth)
42 passed, 0 failed · 3.8s
Done. The token is now revoked server-side on logout, with a regression
test for the redirect loop. Commit 3f2a19c on feat/auth-fix,
board status updated via MCP.
Notifications
⌘⇧N
Needs me · 3
⚑TASK-1391m ago
A2: Changes requested — 3 findings, 1 blocking
⏎ Findings → A1Focus tab
■TASK-1274m
A1 blocked: requesting Bash(prisma migrate) permission
Focus tab
◈TASK-15118m
Assigned to you: "Rate limiting on /api/auth"
⏎ Start sessionView on board
FYI
✓TASK-1422m
CI green on feat/auth-fix
→TASK-13331m
Moved to Verify by A1 · evidence posted
TASK-142
Execute
CI running
A1 idle 2m
↑2 · dirty
$1.84 · 96k tok
2
1
4
3
5
- 1A tab is a task. Every tab carries its work-item id and turn state (running / verdict / blocked / idle) — peripheral vision without switching tabs.
- 2The ⌘R confirmation bar — nothing ever enters an agent's stdin without you seeing the exact text and confirming with ⏎. No modals.
- 3Ambient chip row — phase (from the board), CI, turn state (from agent hooks), git delta, cost. Render-only; the board stays the single source of truth.
- 4A real terminal — your agent CLI session unmediated, full scrollback, nothing translated into chat bubbles.
- 5The Needs me / FYI drawer — only actionable items make noise; FYI drains silently into the digest.
03
The review loop — after ⏎
The split opens: Agent 2 runs /twd-review TASK-142 — the skill pulls
the work item over MCP, diffs the branch and will post its verdict through the board.
The app orchestrates nothing: the board is the message bus, the app just observes.
Twindem Team — twindem-app
TASK-142 auth-fix ● review
TASK-139 settings-migration ⚑ verdict
+
A1 · authorclaude · opusidle — awaiting review
Done. The token is now revoked server-side on logout, with a
regression test for the redirect loop. Commit 3f2a19c.
A2 · reviewerclaude · opus● running 1m 12s
/twd-review TASK-142
mcp:board · get_work_item(TASK-142)
acceptance criteria: 4 · delivery mode: Reviewed
Bash(git diff main...feat/auth-fix --stat)
12 files, +214 −38
Checking token invalidation across every logout path, including
session expiry…
Read(src/auth/SessionExpiry.ts)
88 lines
Found an uncovered case: the implicit logout on expiry
does not revoke the refresh token…
TASK-142
Review
CI green
A2 running 1m
$2.10 · 118k tok
04
The two-second overview — ⌘0 and the menu bar
There is no dashboard page — just a two-second HUD over the window, and a
menu-bar popover for when the app is hidden. Glance, answer, back to work.
Live sessions
Needs me · 3
TASK-142Revoke token on logout
ReviewCIA2 1m
TASK-139Migrate settings to profile
Executeverdict ⚑
TASK-127Rate limiter /api/auth
Executeblocked 4m
05
Session Digest — when you return
Shown automatically when you come back after >30 minutes (or ⌘D).
What happened while you were away, with the next action inline — inherited straight from
Digest Today in Twindem Pulse.
Friday · away for 2h 14m
While you were away, your agents advanced 3 tasks
TASK-142 — review passed, CI green. You are the last blocker: the merge has been waiting since 12:18.
A1: 2 turns · 96k tok · $1.84
⏎ Open PR
TASK-139 — A2 requested changes: 3 findings, 1 blocking (the migration drops legacy settings).
verdict posted to the board · 41m ago
⏎ Findings → A1
TASK-127 — A1 has been blocked for 1h 52m on a Bash permission.
a blocked agent is a paid worker standing idle
Focus tab
TASK-151 was assigned to you by Andrei: "Rate limiting on /api/auth".
priority: high · no session yet
Start session