Mimir
A Linux-native terminal multiplexer built for AI coding agents. Think cmux but for Linux, written in Rust and GTK4. Right now it is growing its own terminal emulator from the ground up.
What it is
Mimir is a multiplexer designed around how AI coding agents actually work. Agent-driven panes, scrollback the agent can query as text, workspaces per project, and my browser agents (Blackreach, Huginn) running as panes inside the same window. I build it session by session and use it daily. It is a real tool, not a weekend demo.
Probing instead of guessing
A rendering bug was breaking TUIs like deepseek-tui inside Mimir panes. The lazy fix would
have been to patch the symptom. Instead I sent a DECRQM query from inside a pane and proved
the real cause: VTE reports synchronized output, mode 2026, as permanently unsupported. Mimir now
handles it correctly. As far as I can tell it is the only VTE-based multiplexer that does. That debug
session became a house rule: no fix until a probe proves the cause.
The native terminal stack
The bigger arc is making Mimir own its whole terminal stack instead of being a wrapper around VTE. Staged migration, no rewrite. VTE stays the default until the native backend earns parity. Turns out Mimir already owned the bottom of the stack, so this was migration work, not greenfield.
Six phases shipped so far:
- 1 and 2. Backend trait layer and PTY extraction. All terminal operations route through an abstraction now. Zero behavior change, which was the whole point.
- 3. The native core. Incremental VT500 parser, full terminal state including the cursor pending-wrap quirk, a grid with bounded scrollback and proper CJK/emoji width. Fuzz-proven across chunk boundaries.
- 4. Pinned by 12 hand-reviewed golden fixtures plus 9 differential tests where the same bytes go to real VTE and my emulator, and the dumps have to agree.
- 5. My renderer drew its first pixels with no VTE in the window. Verified with actual Xvfb screenshots, which caught a reverse-video bug the unit tests missed.
- 6. It went interactive. Real keyboard input, a VTE-free shell on a fresh pty. Screenshot-verified running bash with my powerline prompt.
What's next
Phase 7 is the query-reply path: DA, cursor position, pixel size. That last one is why fastfetch currently prints a warning inside native panes, and I knew about it before fastfetch told me. After that it is scrollback, search, and selection parity, then the native backend can take the default.