Changelog
User-facing changes in each koshi release.
v0.6.0
Floating panes
- A pane can float above the tiled panes, belonging to no tab. Each client places, pins, minimizes, and restores floating panes on its own screen, and moves them by keyboard, mouse, or the move chooser. A drag on a border or corner resizes one. A session holds at most 12.
<C-p> fopens a floating pane,<C-p> ufloats the focused pane or docks it back,<C-p> ipins it, and<C-p> Tab/<C-p> Shift+Tabstep through the floating panes.- The floating pane tray (
<C-p> w, or the⧉button) lists every floating pane and minimizes or restores them. koshi new-pane --floatingandkoshi run --floatingtake--cols,--rows,--x,--y, and--pinned. New commands:undock-pane,dock-pane,pin-pane,unpin-pane,minimize-pane,restore-pane.move-pane --x --ymoves a floating pane,place-pane --stack-ontoputs a pane into a stack, andfocus-pane --next-floating/--previous-floatingstep through floating panes.<C-p> mwith a floating pane shown opens a chooser between tiled and floating moves. In the tiled move preview,sswitches the target between a pane and its stack.
Notifications
- koshi's own messages — a pane killed by a signal, a config warning, a refused
key — show as a toast and stay in the notification center (
Alt+n, or the●button). - The
notificationsblock ofkoshi.kdlsets the toast's corner and time, or turns toasts off.
Commands and keys
koshi actions run <ACTION>runs any bindable action from a shell, andkoshi actions listnames the command that runs each action.which-key-delay-mssets when the hint bar shows the keys that continue a shortcut.koshi keys describeexplains every longer binding that starts with the given keys.koshi keys conflictsexits 2 when a client would refuse the file.- A new pane starts in the current working directory of the pane it splits from.
- Every config problem names its line and column.
Remote access
- A first connection gives the server's certificate fingerprint with
--certificate-fingerprint;koshi share grantand the newkoshi share openprint it in each connect command, with--save-asset to the server's host name.koshi remote newandkoshi remote editask for the fingerprint. Both machines speak TLS 1.3 only. koshi share openopens the port and prints the connect commands without minting a token.remote-link-timeout-mssets how long a remote link may carry no byte before it drops.- Reconnecting restores your floating panes too.
pane-clipboard-writesletsOSC 52copies andpbcopy,xclip,xsel, orwl-copyin a pane reach your terminal's clipboard, also from another machine.
Sessions and updates
- A client comes back after an update as the same client, keeping its tab, focus, scroll positions, lock mode, and floating panes, and keys typed during the restart reach the session.
- The session keeps sending to every client when one client reads slowly.
max-frames-per-secondcaps the frames a session sends each terminal.koshi list-sessionsadds anownercolumn, and another user's session can be named<user id>/<session id>.- List, inspect, and
koshi share listprint times as RFC 3339 UTC text. koshi kill-sessionalso ends processes a session left running.- The router writes its own log file,
koshi-log-router.log, andmax-log-file-size-in-mbcaps each log file. koshi doctoradds therouter log fileandremote listenerrows.- On macOS, install with Homebrew; the release script no longer installs there. The Linux binary needs glibc 2.34 or newer.
allow-other-usersandshared-sessions-dirhave no effect on Windows.
v0.5.0
Moving panes
- Move an existing pane with a keyboard or mouse preview. Choose to swap it with another pane or insert it beside a pane or stack, in this tab or another visible tab. Only the client making the move sees the preview; after it is accepted, every client sees the changed layout.
koshi move-pane --direction <direction>swaps the focused pane with a visible neighbor immediately.koshi place-panemoves an existing pane into another tab's tiled layout.<C-p> sopens a new shell pane in the focused stack.koshi scroll-pane --lines <N>scrolls a pane's view, andcore:scroll-pane-upandcore:scroll-pane-downcan be bound to keys.
Terminal input and display
- The Kitty keyboard protocol carries key presses, repeats, releases, text,
and modifiers from the outer terminal through the session to pane programs.
terminal.extended-keyscontrols whether programs receive enhanced key sequences when requested or always. - Terminal programs can set horizontal margins and origin mode.
Updates and saved data
- Clients that support the session protocol reconnect after their session is updated.
koshi updateverifies the release archive checksum before installing it.koshi restart-serversrestarts every running session and the router into the koshi program on disk without installing anything.- Updates migrate saved sessions, configuration, remote access records, saved servers, certificates, and runtime files while preserving panes, programs, and scrollback.
- Configuration schema version 1 migrates to version 2. Remote stores migrate from format 1 to format 2.
v0.4.0
Terminal images
- Programs in a pane can draw images. koshi decodes Sixel, Kitty graphics
protocol, and iTerm2 inline images, keeps each image at its cell placement
through scrolling, scrollback, resizing, and screen switches, and paints it
in every attached terminal that can show images. A terminal that cannot show
images sees
terminal image unavailablein the cells the image covers. image-supportinkoshi.kdlis read by each terminal for itself.#true, the default, probes the terminal for Kitty, iTerm2, or Sixel output and paints images with the protocol it finds.#falsekeeps the text and the placeholders and sends no image bytes.- A terminal that does not answer the cell-size query still places Sixel and iTerm2 images at the right scale, using its window pixel size instead.
Pane and shell improvements
pane { gap N }inkoshi.kdlleavesNblank cells between two panes that meet along a horizontal or vertical split. Every terminal attached to the same session sees the same gaps. Stacked panes stay contiguous. Dragging a pane border with the mouse still works across a gap.- A shell that prints OSC 133 prompt markers gives koshi the start and end of
every command it runs. koshi keeps the prompt marks on their rows through
scrolling, scrollback, resizing, and reflow, and publishes
PaneCommandStartedandPaneCommandFinishedevents that name the pane and nothing else, never the command line or its output. koshi debug events [--since <LENGTH>] [--filter <NAME>]prints the last 1000 events each running session published, oldest first. A line names when the event was stamped, which event it was, and the ids it named. A keystroke prints asPaneTypedwith its ids, never as the character typed. A session started by an older koshi keeps no such buffer, and the command says so.- A bare
locknode in a profile starts the session's first terminal with input locked, so keys go straight to the program in the focused pane untilkoshi unlock,koshi toggle-lock, or<C-l>releases it. koshi new-tabopens a tab with one shell pane, and--clientnames the terminal that switches onto it.koshi toggle-pane-fullscreen [--client <CLIENT_ID>]zooms or restores the focused pane of one terminal, and leaves every other terminal of the session tiled.
Rendering and reliability
- Each terminal measures the area it draws panes into and reports it. The session sizes the shared programs of a tab from the smallest reported area, so a viewer whose tab bar or shortcut bar is a different height no longer gets a wrong grid. A terminal with no room stays connected, shows the too-small notice, and is left out of the calculation.
- Drawing, cursor placement, and mouse routing use one committed geometry per painted frame, so a click lands on the pane it appears to hit. A frame that fails to paint leaves the previous screen, mode, hints, title, cursor, and selection in place.
Shift+drag selects text in a pane whose program owns the mouse, without entering mouse selection mode.- Remote connections agree on a hybrid post-quantum key exchange,
X25519MLKEM768, in place of classicalX25519alone. An older koshi that offers only classical methods is still accepted. Certificates, pinning, and timeouts are unchanged. - A pane title is cut to 512 bytes and stripped of control characters, right-to-left overrides, invisible tag characters, and other characters that cannot be safely drawn, before it reaches your screen, the other attached terminals, or the terminal title bar.
- The saved-session file this build writes is format 3. A 0.3.0 build refuses
to read it, so
koshi updatefrom 0.3.0 restarts each running session into 0.4.0. A downgrade to 0.3.0 is refused and leaves that session on 0.4.0.
v0.3.0
Remote sessions
koshi attach --remote <server>attaches this terminal to a session on another machine, over TLS.- The first connection to a machine records the certificate it presents and pins it; a later connection presenting a different certificate is refused and names both fingerprints.
remote-listeninkoshi.kdlnames the address the remote listener binds. Writing that line opens no port: the port opens the first timekoshi share grantruns and you answer yes to the offer, and on every start after that.koshi share grant,koshi share revoke, andkoshi share listhand out, stop, and list the access tokens that reach the sessions on this machine. A grant reaches every session or one named session, prints its token once, and stops working after24hunless--expiressays otherwise.koshi remote new,edit,list,forget, andset-secretkeep the servers this machine dials.newandeditask for the name, the address, and the secret in turn, then dial the server to check the secret before saving.- A secret never appears on a command line: koshi reads
KOSHI_REMOTE_SECRET, and with that unset asks for it at the terminal without printing what is typed. koshi list-sessionsalso lists the sessions of every saved server that answers, each row naming its server in a newservercolumn;--remote <server>lists that one server's sessions.- Bare
koshi attachoffers the sessions on the saved servers beside this machine's own, and asks which one to attach to whenever a session on a server is listed. remote-reconnectdials a dropped remote link again — after 1, 2, 4, 8 seconds, and 8 before every dial after that, for up to 120 seconds — while the tab strip counts down to the next dial. Joining again restores the active tab, each tab's focused and fullscreened pane, and each pane's scroll position.- A remote refusal no dial can change stops the dialing at once and names itself: a certificate that is not the pinned one, a token the server does not admit, a token that does not reach the session, or two builds sharing no protocol version.
koshi shareverbs run inside a koshi pane are refused while anyone is attached to that pane's session from another machine, so a token never prints onto a screen someone else reads.
Sharing this machine
allow-other-userslets the other users of this machine list, attach to, and kill your sessions, andshared-sessions-dirnames where those session sockets live.koshi --headless --allow-other-usersopens one session that way for its whole life.- Sessions are advertised in
/tmp/koshi-<your user id>on Linux and macOS, named after your user id alone, so every shell finds the same sessions.KOSHI_RUNTIME_DIRnames another directory when it holds an absolute path.
Updating and checking
koshi updaterestarts the running koshi servers into the new release: each session replaces its own program while keeping its panes, the programs in them, and their scrollback, and the process that tracks sessions restarts after them. A session that refuses the restart is named on standard error and keeps the old build.koshi server-versionprints the build every running koshi server runs, one row per server, so a session still on the old build shows beside the ones that moved.koshi doctorchecks this machine's installation — config, shell, terminal, runtime directory, log directory, plugins directory, router, session directory, remote access, and remote connections — and rates each rowok,warn, orfail.
v0.2.0
- Sessions run in their own process and keep running after the terminal leaves.
koshi attachjoins a running session; without a name it lists the running ones to pick from.koshi detachleaves a session without ending it;--alldetaches every terminal of one session.koshi --headlessstarts a session with no terminal attached and prints its id.koshi attach <session>typed inside a pane moves that terminal to another session.- Several terminals can view one session at once, each with its own focus and view.
- A terminal that missed an event resyncs instead of drawing a stale view.
- The quit shortcut leaves the session running instead of ending it.
auto-close-sessionends a session once its last terminal leaves.- Each terminal reads its own theme, keybindings, and view settings from its own files.
- Sessions and tabs accept their printed id anywhere their name is accepted, and an id is never re-read as a name.
koshi debug dump-stateandkoshi debug dump-layoutprint running state and solved layouts.- A panic writes
crash-<timestamp>.txtto the data directory after restoring the terminal. - Terminal reset and custom tab stops.
- A koshi that cannot speak another koshi's protocol version refuses and names both version ranges.
- The session server starts with no console window on Windows.
- Dragging a pane border moves it the whole drag distance in one step instead of one cell at a time.
- The shortcut hint bar updates without waiting for the next frame.
- A stop request that fails skips the wait and ends the process at once.
allow-beta-featuresruns features still marked beta; this release marks none.- Smaller cell storage, cheaper mouse movement, and lower scrollback memory.
v0.1.0
- Split, stacked, fullscreen, focus, resize, and close operations for panes.
- Tab creation, closing, movement, and switching.
- Per-pane processes, terminal screens, scrollback, and selections.
- True colour, text styles, alternate screens, wide characters, emoji, and box drawing.
- Mouse focus, border resizing, scrolling, text selection, and OSC 52 clipboard copy.
- Multi-key shortcuts, configurable leader keys, shortcut hints, and conflict checks.
- Locked input mode and mouse selection mode.
- KDL files for app settings, themes, keybindings, and saved layouts.
- Twenty-five ready-made themes.
- Saved profiles with tabs, pane layouts, commands, working directories, and environment values.
- Local config path, explanation, validation, and migration commands.
- Session, tab, pane, and client discovery commands.
- External pane, tab, input, focus, lock, and session control commands.
- Per-session text or JSON logging.
- Startup update checks, explicit self-update, and release installers.
- Linux, macOS, and Windows support on x86-64 and ARM64.
- Input aimed at an open shortcut stays in koshi until that shortcut completes or is cancelled.
- Pane input reaches only panes visible to the issuing client.
- New panes inherit the issuing terminal's working directory when no directory is given.
- Config files require an explicit schema version.
- Config migration validates the source and every version step before accepting output.