I Lost Myself In Terminal Tabs, So I Built An Infinite Canvas
I haven’t opened an IDE in about a year. Not out of principle, I just stopped needing one. Everything happens in the terminal now: the agents write the code, I read the diffs, I run the tests, I yell at the agents, the agents apologise (very sincerely, every single time), repeat.
The problem is how many terminals that is.
A couple of years ago I worked on two projects at a time, three on a heroic week. One editor window each, a terminal underneath, done. Now, on a normal day, I have five or six projects open at once, each with a Claude Code session chewing on something, plus a dev server, plus a log tail, plus that one shell where I ran git log forty minutes ago and never closed. Agentic coding didn’t just change how I write code, it changed how many things I’m supervising at the same time. My job went from “programmer” to air traffic controller for a fleet of very polite robots.
The Great Terminal Shopping Spree
So I did what every developer does when a tool annoys them: I tried every other tool.
- WezTerm: gorgeous, endlessly configurable, a Lua file away from anything
- Ghostty: fast enough to make my old terminal look like it runs on a potato
- cmux and Superset: built for exactly this agent-juggling life
- iTerm2: the old reliable, the one I always crawl back to
And every single one had the same problem. Not a bug, a shape. Tabs. Splits inside tabs. Panes inside splits. A pane I zoomed to full screen and then forgot existed. Past twenty sessions I’m not navigating anymore, I’m spelunking, clicking through tabs until I recognise a prompt, like trying to find one specific sock in a laundry basket while the laundry is on fire.
And the agents made it worse in a very specific way. The question was never “where is that session”. It was “which one needs me?” One Claude is still working, one has been sitting on a permission prompt for ten minutes waiting for me to press 1, one finished ages ago and is quietly judging me. From a tab bar, they all look exactly the same.
I Just Wanted To See Everything At Once
What I wanted was embarrassingly simple: all of it, on one screen, at a glance. Not a smarter tab bar. A wall.
So I built infiniterm. Every terminal is a card on an infinite canvas that you pan and zoom. A card stays where you put it. Nothing re-tiles behind your back, new cards fill a grid from the top left, and after a week you know where your stuff lives the way you know where the coffee is in your own kitchen.
Then the part I actually built it for: the border. Every card’s border answers one question, in one of four colours:
- violet: working, leave it alone
- yellow: waiting on you, a permission prompt or a question
- red: something failed
- green: done, go look

Claude Code and Pi report through hooks. Everything else reports through zsh: a build that runs past five seconds goes violet then green, and a command that fails goes red no matter how fast it died. Zoom out until thirty cards fit and the text turns into little bars, but the borders stay loud. I look up, see one yellow card, and go there. That’s the whole trick.
The Things It Refuses To Do
Nothing flashes. Nothing steals focus. Nothing sends a notification. This is on purpose: the state is there when I look, and I look when I’m ready, not when some agent decides it’s done and wants applause.
It’s also unapologetically narrow. It’s a native macOS app for Apple Silicon, written in Rust (gpui draws the canvas, alacritty_terminal parses the shells). No Electron, no account, no telemetry. Shells survive quitting the app. Only zsh reports its commands so far, and the agent hooks cover Claude Code and Pi; Codex and OpenCode aren’t there yet.
Yes, The Robots Built Most Of It
Here’s the funny part: most of infiniterm’s code was written by Claude Code sessions running in cards on infiniterm itself. Robots building the control tower they’re supervised from. My job was the product, which mostly means saying no and changing my mind loudly:
- “Failed” started life as part of “waiting”, until I realised a question and a crash are different news
- “Working” was Claude’s clay orange, until at fit-all zoom it blurred into red and became violet
- Shell sessions first ran on tmux, for exactly one evening, which produced ten bugs, so each card got its own little daemon instead
- I let it try drawing zoomed-out text as little word shapes, looked at it for an hour, and threw it out for flat bars, which read better and cost less
The repo’s CLAUDE.md has the whole saga, with the reasons. (And yes, this post too: an LLM drafted it, I took a scalpel to it until it sounded like me. Same deal as the code.)
Go Get Lost In It
1curl -fsSL https://infiniterm.app/install.sh | sh
or brew install --cask ekinertac/tap/infiniterm. It’s free for personal use; paid work needs a $29 licence. The source is on GitHub, and what I want most right now is your bug reports, ideally from someone juggling even more projects than me. I’d love to know if that person exists, and if they’re okay.