New year, new dev setup. This year the theme is:
a life lived in (text) tokens
Agentic software develompent tools (Claude Code, Codex CLI, Opencode, pi, Continue, etc) have become pretty crucial to my workflow, and they work best when consuming and producing text and calling CLI tools which do the same.
So I’ve re-jigged my entire development workflow again. Emacs lasted me ~20 years, and while I like Zed and enjoyed the setup I’ve moved on from that just two years later. This year, as part of my commitment to a life lived in tokens, I’m moving back to purely terminal apps[1].
The core of it is
- ghostty is my terminal emulator
- zellij is the terminal multiplexer, and handles all my multi-pane & multi-tab needs (I don’t really use ghostty tabs at all)
- helix is my text editor, using various LSPs to provide a pretty-close-to-IDE experience
- yazi as a file browser
- neomutt for emails, as I’ve already discussed here
- nb for a file-based “personal knowledge base”, think Obsidian but without the GUI app
I could write up more about it, but honestly if you’re curious just look in my dotfiles, because it’s all in there.
The main reason I switched from Zed is that it’s fundamentally a GUI app. There are ways to mount remote projects, but I always found them a bit flaky. I’m increasingly working across lots of different remote machines via ssh[2]. Terminal stuff just works, Zed takes setup and mental energy.
The other reason I moved was that even though Zed can run agentic coding agents via the ACP (in fact I think they invented it) the DX isn’t as nice. For example, there’s no /resume command so you can’t resume an old conversation. It seems like the companies making these agentic harnesses are trying out new things in the “native” terminal app first, and if/when those things make it to the ACP spec is unknown.
The final bonus is that most of the above tools are also configured via text config files (to be fair, so is Zed). So Claude has been helping me set up this new environment so that it’s to my tastes. A handy tool I found is ht-mcp which is a MCP server that can run a headless terminal app, so that Claude Code can even e.g. open a file in helix and issue commands to do stuff. That’s been really handy for debugging things when they haven’t worked correctly.
Anyway, we’ll see if this stack satisfies me long-term—at this rate of change (20 years in Emacs, then 2 years in Zed) I might be changing it all up again in 2 months.
with my usual strong preferences for OSS + tools which run on both macOS and Linux ↩︎
fly sprites are particularly interesting as a bit of a middle ground between fully-reproducable Docker stuff and randomly spinning up VMs to mess around. ↩︎