Your AI coding agents shouldn't live in a dozen terminal tabs.
So I built AIWorkstation: a native macOS app that puts Claude Code & Codex on an infinite canvas — every agent a real terminal card you can see, arrange, and talk to.
• Real PTY terminals — full TUI, colors, Ctrl-C
• Two agents, one repo? Each auto-gets its own git worktree. No clobbering.
• Live status dots — who's working, who's waiting on you
• Focus Mode: one agent beside a live diff
• 100% local. No backend, no accounts.
Open source, built from scratch in SwiftUI.
Demo below — link in the first reply ⬇️
Holds up well — none of it scales with repo size. It's `git status --porcelain` plus a per-file `git diff` only on the file you click, both off the main thread, so the UI never blocks. Latency tracks the number of changed files + the size of the one file you're viewing, not the repo.
The only thing that scales with diff size is rendering a single huge file (eager view today) — virtualizing that is next on the list. What size repo are you throwing at it?
Your AI coding agents shouldn't live in a dozen terminal tabs.
So I built AIWorkstation: a native macOS app that puts Claude Code & Codex on an infinite canvas — every agent a real terminal card you can see, arrange, and talk to.
• Real PTY terminals — full TUI, colors, Ctrl-C
• Two agents, one repo? Each auto-gets its own git worktree. No clobbering.
• Live status dots — who's working, who's waiting on you
• Focus Mode: one agent beside a live diff
• 100% local. No backend, no accounts.
Open source, built from scratch in SwiftUI.
Demo below — link in the first reply ⬇️
Love this — agents as ambient thumbnails with a hotkey to pop each to the front and back is a really clean model.
Fork away (it's MIT), and honestly I'd happily take a PR. Most of the plumbing's already there: cards have z-order + bring-to-front, the camera can zoom to a single card, and I just added keyboard triage (⌃⌥→ to cycle the agents that need you). A global per-agent hotkey (Carbon RegisterEventHotKey) is the main missing piece.
How were you picturing the keys — assigned per agent, or a quick-switcher overlay?
A few people asked to actually see it — so here's a 30-second look at AIWorkstation.
Claude Code & Codex agents as live terminal cards on one macOS canvas — then Focus Mode on a single agent to review its work.
What are you using to run more than one coding agent right now — tabs, tmux, something better? 👇
If you run more than one AI coding agent, you know the chaos — scattered terminal tabs, repos trampling each other, no idea which one's done.
AIWorkstation puts them all on one native macOS canvas: every Claude Code / Codex agent a live terminal card you can see, arrange, and talk to.
Open source. Full rundown 👇
https://t.co/6mD3T7bw6V
Fair on restart — live sessions aren't persisted yet, the honest tradeoff of running the real CLI vs a protocol wrapper.
(The auto-compaction is Claude Code's own behavior, though — you inherit it precisely because it's the real thing, not a reimplementation.)
PTY buys generality: any agent CLI, real TUI, Ctrl-C — not just ones that speak a protocol. Durable history within that is what I want next.
Agreed — handoff is the hard part, not visibility. For me the canvas is really an attention-routing layer: live status dots + native notifications flag the exact moment an agent is waiting on a human, and Focus Mode is where you take the handoff — live diff next to a reply box.
Durable session state across restarts is still the open frontier though. How are you approaching it in the room model?
And you drive it all by typing, not clicking:
claude refactor the auth module → spawns an agent
codex → a second one
open github → a browser node on the canvas
Parsed instantly, on-device.
The part I'm proudest of: spin up a second agent in the same repo and it's automatically dropped into its own git worktree + branch. Two agents, one codebase, zero collisions — no manual setup.
Was able to run Qwen 3.5 35b 4 bit on a MacBook air M4 with 16 GB of Ram.
Streamlined the process with all the steps needed to run the model and got 5.9 tokens/s
https://t.co/1HjkiZXU2s