v1.0 · Linux, macOS, Windows · MIT
Split the terminal.
Keep it running.
A terminal multiplexer written in Go: tiling panes, tabs and workspaces in one window, and shells that keep running after you close it. New in 1.0 — every pane can be driven from outside, so a script or a coding agent can start work, wait for it, and read what it printed.
Not a screenshot: slat's own layout engine, ported to the page. Press the keys.
$ slat
One window, however many shells
It does the multiplexer things, and gets out of the way. No plugin manager, no server config, no second language to learn.
- Sessions outlive the window
- The shells run in a background daemon. Close the terminal, lose the SSH connection, come back with slat — the output is still there.
- Panes, tabs and workspaces
- Split a pane either way, move between them by direction, walk a pane around the layout, zoom one to full size, group tabs into named workspaces.
- Scroll back, search, copy
- Every pane keeps its own history, with vim keys and smart-case search. Select with v or V and press y — it copies over ssh too, because the clipboard asked for is yours, not the remote machine's.
- Only what changed is drawn
- slat paints from its own terminal emulator and sends the difference, so half a million lines of output arrive in about a third of a second.
- One binary, no runtime
- Static Go, nothing to install alongside it. The config file is optional — and a mistake in it is reported when you start, never ignored.
- Windows, properly
- Panes run on a ConPTY and the socket is an AF_UNIX socket, so the same session model works there. The test suite runs on all three platforms.
$ slat # in a real terminal
Here it is, actually running
Splitting, running two things at once, scrolling back through the output, then detaching and picking the session up again with everything still alive.
$ slat wait 4 --for idle --timeout 10m
A terminal an agent can drive
Agents are good at running commands and bad at watching them. 1.0 gives slat a command line of its own, so anything outside the terminal can open a pane, start the work, wait for it, and read the result — with exit codes instead of guesswork.
slat lsevery pane, and what each one is doingslat pane new --cmd Copen a pane running C, without taking your focusslat run PANE …type a command into a pane and press Enterslat wait PANE --for …block until idle, input, exit, or text=REGEX matchesslat capture PANEread a pane's text, screen or scrollbackslat send PANE --key ctrl-canswer a prompt, or interrupt
Four things a pane can be
- idle
- the pane's own shell has the terminal: the command finished
- working
- a program is running
- input
- something stopped to ask a human — the tab is marked
- exited
- the pane's program is gone
Exit codes are the contract
- 0
- it happened
- 1
- the command was wrong
- 2
- timed out
- 3
- that pane is gone
Add --json to any command for one object with a schema field.
A build that stops on Overwrite? [y/N] is neither finished nor working. slat calls that input, marks the tab with a ?, and can run a command to tell you. Waiting for idle wakes on it too, so an agent never sleeps through a question.
Shell builtins count: read -p is caught even though the shell itself is the foreground process.
Nothing leaves the machine. slat has no network code — the commands talk to the session over its own socket, readable only by you.
$ $EDITOR ~/.config/slat/config.toml
Make it yours
Colour, shape and motion all belong to whoever runs it: five palettes or your own, six border styles or your own glyphs, a status bar written as a format string, and animation timing per event. Pick two and watch the session change.
theme
borders
[theme]
name = "default"
[borders]
style = "sharp"
[status]
left = " {workspace} │ {tabs}"
right = "{badge} pane {pane}/{panes} "
tab = " {index}:{name}{alert} "
[animation]
split = "90ms"
move = "120ms"
easing = "out-cubic"A theme colours what slat draws — the bar, the borders, its overlays. Programs in your panes keep their own colours, and fonts belong to your terminal, not to slat.
Every key is rebindable, and a mistake anywhere — an unknown colour, a glyph two columns wide, a placeholder that doesn't exist — is refused when slat starts instead of drawn badly later.
Four finished setups live in docs/rices, including one that is ASCII and sixteen colours for a bare console. Send yours.
$ sudo apt install slat
Install it
One static binary, and a first run that needs no configuration. Type slat to start a session; type it again from anywhere to get that session back.
$ curl -fsSL https://noturbob.github.io/slat/apt/key.gpg | sudo tee /usr/share/keyrings/slat.gpg > /dev/null # trust the signing key$ echo "deb [signed-by=/usr/share/keyrings/slat.gpg] https://noturbob.github.io/slat/apt stable main" | sudo tee /etc/apt/sources.list.d/slat.list$ sudo apt update && sudo apt install slatslat is also on its way into Debian itself, sponsored through the usual review.
slat turns one this October, and 1.0 is tagged for the occasion. Until then the packages above install the current release, and building from main gets you everything on this page.
$ slat --help
Everything is a keystroke away
Press the prefix — Ctrl-S by default — then one key. Press it twice to send it through to the program. Every binding below can be changed, and two commands can never end up fighting over the same key.
Panes
C-s v hsplit left / right, top / bottomC-s k j H Lfocus the pane above, below, left, right (or the arrows)C-s mmove mode: walk the pane around with hjkl, q leavesC-s < > K Jmove the pane left, right, up, downC-s sswap with the next paneC-s + - =grow, shrink, equalizeC-s zzoom the pane to full sizeC-s xclose the paneC-s [scroll back, search, select and copy (v, V, y)
Tabs, workspaces, session
C-s c n pnew tab, next, previousC-s , Xrename the tab, close itC-s W w Pnew workspace, next, previousC-s $rename the workspaceC-s ddetach — everything keeps runningC-s qquitC-s ?show every binding