Real CLIs, not wrappers
AgentDeck spawns the actual claude, codex, gemini, agy and grok binaries in embedded PTY terminals. Your subscriptions, your configs, your keybindings. Subagents a CLI spawns stay inside its pane.
Open source · macOS · MIT
← kontsek.ioOne desk for all your AI agents.
A native macOS app that runs Claude Code, Codex, Gemini CLI, Antigravity and Grok side by side in real terminals, next to browser panes for ChatGPT, Claude.ai, Gemini and Perplexity. Every agent gets a shared task board and its own MCP endpoint, so they hand work to each other without peering inside each other.
AgentDeck spawns the actual claude, codex, gemini, agy and grok binaries in embedded PTY terminals. Your subscriptions, your configs, your keybindings. Subagents a CLI spawns stay inside its pane.
Agents see a shared task board, each other’s status and pending questions. They never read each other’s terminals. Work moves through handoffs typed into the other session’s input.
An agent’s first browser call opens an isolated WebKit tab beside its terminal with its own cookies and sign-ins. It never drives your own browser, and sessions cannot see each other’s.
What you get
Drag, resize and stack panes, or tile them into a grid. Tidy and Fill Canvas re-pack them in one shortcut.
Working, Idle, Waiting for user, Stalled and Quota warning, read from the visible terminal rows and OSC program-status records.
Agents create and claim tasks, append notes, and hand work to a named session. You see every move in one log.
Each session gets http://127.0.0.1:4820/mcp/<id>, so identity is implicit and whoami just works.
Give a session its own worktree on an agentdeck/<slug> branch so parallel agents never collide in one checkout.
⌘T starts another instance of the same CLI in the same directory as a fresh conversation. Relaunching AgentDeck reopens each session’s last conversation.
Loads .agents/skills, .claude/skills and friends from your repos. Agents read them through list_skills and read_skill.
One session can recruit new agents into worktrees with a first prompt. You approve or deny each request in the sidebar.
How agents coordinate
Each session connects to its own endpoint, so an agent never has to say who it is. A typical turn looks like this:
read_board → see open work
update_task(task_id=4, owner="me", status="in-progress")
… do the work …
update_task(task_id=4, status="done", notes="PR #12 opened")
handoff(target_session="Codex B", title="Review PR #12",
note="focus on the auth middleware")Handoffs land in the other terminal as one typed line, queued until that agent is idle. An orchestrator session can also ask you to recruit a new agent; nothing is spawned without your approval.
Works with
Add any other CLI as a zsh snippet with placeholders for the MCP URL, briefing file and session name. Sign in to web models once; shared panes reuse the session.
Install
brew install xcodegen
git clone https://github.com/mkontsek/agentdeck.git
cd agentdeck
make runThe only package dependency is SwiftTerm. The app is ad-hoc signed and not sandboxed, because it has to spawn processes and bind a local port.
Read before you run it
The full threat model is in SECURITY.md.