| Mode | Name | Size | |
|---|---|---|---|
| d--------- | .agents / skills / driving-slosh | 33 | logstatsplain |
| -rw-r--r-- | .clang-format | 1993 | logstatsplainblame |
| d--------- | .fastfeedback | 36 | logstatsplain |
| -rw-r--r-- | .git-blame-ignore-revs | 501 | logstatsplainblame |
| d--------- | .githooks | 38 | logstatsplain |
| -rw-r--r-- | .gitignore | 653 | logstatsplainblame |
| -rw-r--r-- | DEMO-VIDEO.md | 7567 | logstatsplainblame |
| -rw-r--r-- | DESIGN.md | 64804 | logstatsplainblame |
| -rw-r--r-- | HANDOVER.md | 23897 | logstatsplainblame |
| -rw-r--r-- | Makefile | 13475 | logstatsplainblame |
| -rw-r--r-- | README.md | 3690 | logstatsplainblame |
| -rw-r--r-- | SEED.md | 1095 | logstatsplainblame |
| d--------- | config | 80 | logstatsplain |
| d--------- | contrib | 519 | logstatsplain |
| d--------- | docs | 406 | logstatsplain |
| d--------- | include | 644 | logstatsplain |
| -rw-r--r-- | logo.txt | 811 | logstatsplainblame |
| -rw-r--r-- | ruff.toml | 2442 | logstatsplainblame |
| d--------- | src | 927 | logstatsplain |
| d--------- | tests | 2990 | logstatsplain |
| d--------- | vendor | 127 | logstatsplain |
| d--------- | web | 262 | logstatsplain |
slosh
A terminal multiplexer — panes, tabs, sessions you can detach from — written in C on top of libghostty-vt.
╭────────── nvim ─────────── ▬ □ ✕ ╮ ╭─────── npm run dev ─────── ▬ □ ✕ ╮
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ ╰──────────────────────────────────╯
│ │
│ │ ╭────────── shell ────────── ▬ □ ✕ ╮
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
╰──────────────────────────────────╯ ╰──────────────────────────────────╯
Install
Needs zig 0.16 and nothing else. The result is one static binary.
make vendor # the vendored terminal core, once
make # about a second
Run
slosh # attach to session "main", creating it if needed
slosh -s work # a named session
slosh ls # what is running
Sessions survive detaching, and your ssh connection dying. Then C-a \ to
split, C-a ? for the keys, C-a p for every command by name.
Docs
docs/ — keys · panes · configuration · shaders · chrome · layouts · scripting · how it works
make docs renders the same pages as a static site into build/docs — no
dependencies, one file of Python and one stylesheet.
What is different about it
- The mouse works properly. Click the middle of a border to split toward it, drag a gap to move a boundary, drag a pane by its title to swap it. Everything drawn registers what it is as it is drawn, so a click and a preview cannot disagree — which is also how the split target can be part of an edge without the highlight and the hit ever drifting apart.
- The layout is recomputed, never stored. Small terminal? The tab becomes a list of headers, and comes back to exactly the arrangement you had.
- A pane told to run something keeps its output when that thing exits, with
[re-run]and[close]in its frame. - Configuration is one KDL file that reloads on save, can be built from
included pieces, and refuses a broken file instead of half-applying it. - Colour passes over cells — dim, tint, rulers, spotlights, and a border that can flash when a pane rings, with strengths written as expressions.
- Scriptable to the same depth it is usable: one JSON object per line over the session's socket, and a pane can draw its own status bar and buttons with an escape sequence.
Design notes and the twenty-one decisions behind it: DESIGN.md.
