HomeProjectskat800
Terminal

kat800

A tabbed, dockable terminal for Linux Mint, with a current VTE, remote tmux sessions as native tabs, containers and sandboxes as ordinary panes, and the desktop's clipboard, history and notes in docks beside the shells.

In daily use; experimental until 1.0
kat800
Business Source License, GPL-3.0 from 1 May 2033
GTK 4libadwaitaOdintmuxVTE
Amber Linux
kat800

kat800 is a tabbed, dockable terminal for Linux Mint and Cinnamon, written in Odin with GTK 4 and libadwaita. The clip above is a working session: the tests run, the git dock opens, a second project splits in beside the first, and the tree is browsed.

Mint is a stable distribution, which is the point of it, and also why its terminal stack lags behind. kat800 brings a current one: it uses VTE 0.84 from amber-vte, because Mint’s own 0.76 lacks the termprops that the shell integration and the tmux bridge need. Mint’s own GTK and VTE are left alone. On top of that sit the things you would otherwise leave the terminal for: attaching to a remote tmux session, entering a container, confining a job, and reaching the files, branches, notes and clipboard that belong to the work.

A file explorer beside a shell; breadcrumb, tree and prompt all track the same working directory

Remote sessions as native tabs

kat800 is a tmux control-mode client. Attached with tmux -CC, tmux stops drawing its own interface and streams its protocol instead, so kat800 can show the session with real widgets: its windows arrive as native tabs and its panes as native splits, with real scrollback, no status bar drawn inside one terminal and no prefix key. Close the window and the session keeps running on the server; attach again tomorrow and the panes are where you left them. iTerm2 has done this on macOS for years.

Three windows of a remote tmux session as native tabs, beside the panel listing the hosts from your own ssh config

The hosts come from your own ~/.ssh/config, so there is nothing extra to set up. Attaching is a row action in the Remotes panel, and kat800 ssh-setup HOST copies the shell integration to the other side so the prompt, the history and the directory tracking follow you there.

Containers and sandboxes as panes

The Containers panel lists the distrobox and podman boxes you have and the images you could start, and entering one is a row activation: the container becomes an ordinary pane, with the same scrollback, history and git dock as everything else. The panel marks the box a pane is inside, the tab puts its name before the title, and the tooltip names the runtime, all read from what the container tool itself announces.

Any pane can also start write-confined, one chord away, through bubblewrap and systemd scopes: levels from sandboxes.toml, with optional CPU and memory limits, and the strictest built-in level also cuts the network. The confinement is visible, a coloured shield on the tab and in the prompt, so the one confined pane among eight can be told at a glance. It suits an agent that shells out, and the tab says so.

Panes, docks and panels

A pane is one shell. A tab holds panes, split recursively; a window holds tabs. Every pane carries its own working directory, branch and command history, and the prompt, the tab label and the docks follow whichever pane has focus. Tab labels show as much of the working directory as fits, so a window full of jobs does not read as eight tabs called bash.

Two panes side by side, each with its own directory, branch and prompt

Three docks, left, right and bottom, each show one panel at a time, and every list panel works the same way: a filter box above a list, type to narrow, Enter to act. Enter runs the row in the focused terminal, Ctrl inserts it without running, Shift runs it in a new tab, and a busy terminal refuses with a message rather than typing into a running program.

  • Git worktrees: staged, unstaged and untracked files with diff counts, or the worktree list, following the focused pane. Several branches checked out in several folders, each with its own pane, without stashing. Every action shows the command it is about to run.
  • Files: an explorer that follows the active tab’s folder.
  • History, Clipboard, Memos and Bookmarks: kept by Ambrosia on the session bus, so they belong to the desktop, not to one terminal. Run a command in one tab and find it in another; copy something anywhere and it is here.
  • Opened: the files opened in kat800.
  • Remotes, Containers and Workspaces: the launchers above and below.
  • Doctor: live CPU, memory, GPU, temperature, disk and network meters, and the system facts that kat800 doctor prints.
  • Katai: an assistant beside the terminal, on its own page.

Workspaces

Other terminals save a named layout and launch it from a list. kat800 has no list, on purpose: the layout belongs to the folder. A .kat800/ marker in a project root makes it a workspace, and its tabs, splits, working directories, colours and dock state are stored inside it, saved a second after each change. Reopening a project puts you back where the work was. A workspace can carry its own colour profiles, sandbox levels and spell-check words, so one project’s rules do not leak into another’s. A cloned repository carrying one sets no shell, no assistant endpoint and no sandbox level until you trust it.

The editor

Files open in kat800 rather than in another application: an editor tab in the same strip as the shells, with syntax highlighting, inline spell check with per-workspace word lists, and a font of your choosing. Files arrive from the explorer, from the Opened panel, from kat800 -e FILE, or as a pane’s whole scrollback pulled into a tab to read properly. A memo is an editor tab too, saved back to the store instead of a file.

The built-in editor with syntax highlighting, beside the file explorer

Katai

One of the docks is a chat panel that reads the focused pane’s scrollback as its context and can start an agent in that pane’s folder. Katai covers what it does and where the model runs.

Leader-key chords

The leader key, Ctrl+A by default, starts a chord, and an overlay shows what can follow: s r splits right, p m maximises a pane, s s opens a sandbox. The shortcuts dialog and the F1 handbook, in English and German, are generated from the same command table as the chords, so they cannot drift apart. Every binding is on the key bindings page, which prints.

Smaller things

There is also a tray icon with minimise-to-tray and an autostart entry, and one binary that is both the application and its tooling: kat800 -- COMMAND runs a command in a new tab, kat800 worktree and kat800 workspace do what the panels do without a window, and kat800 doctor prints the configuration merged the way the app merges it.

Coming from Terminator

kat800’s model, recursive splits inside tabs, Alt and an arrow between panes, everything reachable from the keyboard, is Terminator’s. The first kat800 was a patched Terminator carrying what was missing. The second was a rewrite in Go, still on GTK 3, talking to VTE through cgo. This one is Odin on GTK 4, calling C directly. The handle registries and callback shims of the Go version were its largest source of crashes, and losing them was half the reason for Odin. The habits carry over; only the keys moved, to chords after the leader.

On YouTube

The recordings are in the KAT800 playlist on the Hyperquader channel. The first shows the terminal, its docks and its chords in one sitting.

kat800, a tabbed, dockable terminal for Linux Mint. Watch on YouTube

Under the hood

Odin with explicit allocators and no garbage collector; GTK 4 and libadwaita for tabs, client-side decorations and X11 window placement; TOML for the three configuration files and the session state; gettext for the English and German interface. The package carries the shell integration, which loads only inside kat800’s own terminals, so other terminals are untouched. The pseudo-terminal underneath, and the half century of escape sequences a terminal has to cope with, are on under the hood.

Install

Once the Amber Linux archive is set up (it takes three commands, on the packages page):

bash
sudo apt install kat800