Cookies ahead

Our support chat tool "Intercom" would like to collect some more data on you. See the related link for more details.

Docs

On TUI design patterns

/clear

Every agentic coding tool ships its own slash commands, its own keybindings, its own pane layout, its own status line. Let's talk about this.

In 2023, John Loeber wrote an essay called Bring Back Idiomatic Design. An app should be bound to the operating system it runs on. Native widgets. Standard menus. Shortcuts users already know. When every app reinvents its own design language, users pay for the difference with cognitive overload.

Three years later we have a new class of tools: agentic coding TUIs. Claude Code, Codex, Aider, Crush, opencode, Goose, many more. They run in the terminal. They are powerful, useful, and undisciplined.

Every agent is its own system

I don't know about you. But getting into agentic workflows (with Claude) was also my introdcution to work with a TUI on a daily basis. Slash commands, keybindings, status lines, prompts, a lot of new stuff for me to cope with. No shared conventions, no documented standards. Relearning tax.

The terminal is not a GUI platform

The terminal has no idioms beyond ANSI escape codes and a handful of accidental conventions (Ctrl+C, Ctrl+D, Ctrl+L). There is no system menu. There is no shortcut catalogue. There is no accessibility tree. There is some folklore — ESC to go back (well sometimes it works), a persistent footer of available shortcuts — that tools like menuconfig, htop, and irssi quietly settled on decades ago. TUIs build their own. Consistency becomes a thing each tool has to invent in isolation.

The other part is that inventing your own design paradigm is also a lock-in strategy. The more muscle memory a user has built into one tool, the harder it is to switch. That aligns neatly with the VC-funded playbook of winner-takes-most: "competition is for losers".

The tyranny of shortcuts, again

The desktop version of this problem is well known see my tyranny of shortcuts. Cmd+K opens a command palette in VS Code, a chat in Slack, a search in Linear, a quick-find in Figma, and creates a hyperlink in Notion.

The TUI version is /. Slash plus a word. The word means whatever the agent decided it means. /edit edits a file in one tool, edits a message in another, opens an editor in a third. /help is, mercifully, mostly consistent. /exit versus /quit versus Ctrl+D versus Ctrl+C is not.

Regressed accessibility

You may assume that as "it runs in the terminal, it must be accessible". Modern TUI frameworks (Ink, Bubble Tea, tcell) treat the screen as a reactive canvas and redraw aggressively, so with a screen reader attached every spinner tick becomes an interruption. irssi and menuconfig got this right decades ago by pinning focus and only speaking on change; most agentic TUIs do none of that. There is a good piece making the case — same root problem, higher human cost.

Just resizing the terminal window often breaks the whole of the nice ASCII tables and line breaks.

To be fair, new tech is allowed to come with new paradigms. Some of them are fun. Typing "stop" instead of hunting for a shortcut is cool. Watching a diff get proposed and approved inline, talking to your editor like it is a colleague. Not every novelty is a regression. The TUI form factor is also a reasonable MVP. The category is full of fast-growing companies with teething problems; a TUI is what you build when you are still figuring out what the product even is.

AI agents accept fuzzy, natural-language commands. "Stop", "undo that", "show me what you are about to do" mostly work, in any tool, without anyone having to memorize a shortcut. That takes a lot of pressure off the strict-syntax surface.

But beside the chat itself, there is still a TUI-GUI wrapped around it: a status line, a permissions prompt, a diff viewer, a slash menu, a settings screen. That part is not natural language — it is buttons, panels, and labels, and it is exactly the surface where idiomatic design used to apply. So a small shared vocabulary for the things you do hit often would not hurt. Not a framework, just a convention. Loeber points at the macOS Human Interface Guidelines as the model. The terminal has nothing comparable.

Conclusions

For now, every user of these tools carries a private mental compatibility table.

We build for the terminal at fortrabbit too — ssh access, the fortrabbit CLI, deploy hooks. The temptation to invent your own little language is strong, because there is no platform language to inherit. We try to lean on what already exists (POSIX flags, --help, exit codes).

Bring some idiomatic design to TUIs!

More reading

Written by humans and AI in collaboration.

AI use & editorial process