Skip to content

About tmnl

tmnl is a GPU-rendered terminal emulator with a structured-cell display surface — apps can connect over a Unix socket and ship typed cell Frames straight into the grid, skipping the ANSI round-trip entirely. It also hosts your $SHELL like any other terminal, with offline AI command completion and OSC 133 shell integration baked in.

It’s small. One author, written in Rust, designed to be the host for a class of terminal apps that couldn’t exist before.

tmnl runs in two modes from the same window. Shell mode is your daily driver — a GPU terminal hosting your $SHELL with mouse, OSC 133, and offline AI completion. Native mode is the differentiator — apps connect over a Unix socket and ship typed cell Frame { cells: [Cell { ch, fg, bg, attrs }] } directly into tmnl’s GPU grid via tmnl-protocol. No vt100, no escape codes, no parser between the app’s intent and the pixels. DiffRun puts only changed cell-runs on the wire; apps set their own tab titles.

Reference clients: mnml (terminal IDE) and mixr (terminal DJ). Both ship a --blit <socket> mode that connects them as native tmnl tabs.

If you’ve ever tried to render a real UI inside a terminal — fine-grained graphics, knobs, structured grids — you’ve fought ANSI. tmnl’s native mode is the escape: an app opens a Unix socket, ships Frame messages of typed cells, and tmnl draws them on the GPU. No vt100 parser between the app and the screen. App and terminal agree on a Grid instead of trading bytes.

Inside tmnl, mixr’s crossfader renders as actual graphics, not unicode block art. mnml gets native-tab integration with workspace switching. You don’t have to use any of this — tmnl works fine as a regular terminal emulator hosting your shell. The cell-streaming layer just makes it the host for a class of apps that couldn’t exist before. See Native tabs for the full protocol walkthrough.

tmnl is v0.1.x. It’s solid as a daily driver on macOS for me (the author), but it has sharp edges:

  • macOS is the primary platform. Linux and Windows ship binaries via the same release pipeline (.deb / .AppImage / .msi — see Install) and the wgpu cell pipeline runs everywhere, but the native menu bar is mac-only, and not every integration has been validated end-to-end on the other platforms. Treat non-macOS as second-class but not abandoned.
  • No scrollback search, no font-config UI. Font config rides through TOML (~/.config/tmnl/config.toml), but there’s no Settings-overlay row for it yet. Scrollback search (Cmd+F is wired for the focused pane, but it doesn’t search backwards through paged-out history) is the next pass.
  • Native-mode SDK is published as tmnl-protocol on crates.io — Client::connect, capability negotiation (Caps::CLIENT_COMMANDS / FOCUS_EVENTS / HOVER_EVENTS / IME_EVENTS / INLINE_IMAGES), the published Client::run_loop driver. mnml and mixr ride it daily. A second non-family reference client is still ahead.

For shipped features see FEATURES.md; for the roadmap see .local/PLAN.md (or just file an issue).