github Gaurav-Gosain/tuios v0.8.0

4 hours ago

tuios 0.8.0 is the largest release so far: about 2,400 commits since v0.7.0. tuios now tracks the coding agents running in your panes and shows you what each one is doing. It also reaches sessions on your other machines, keeps sessions across restarts, and has a reworked look with new defaults.

Before you upgrade, read Breaking changes and migration. The daemon protocol changed, so a running v0.7.0 daemon has to be stopped.

Try it in the browser first at tuios.dev/learn. The full list is at tuios.dev/releases.

tuios-promo-github.mp4

Watch

Thirteen short clips, narrated by Tilly. Click one to play it, or watch them all with captions on the release page.

Agents and the Inbox
Agents and the Inbox
Agent mail
Agent mail
Fan out across worktrees
Fan out across worktrees
Tiling
Tiling
Layouts
Layouts
Session rail
Session rail
Launcher
Launcher
Keybindings
Keybindings
Themes
Themes
Spotlight
Spotlight
Screen saver
Screen saver
Screenshots
Screenshots
Control protocol
Control protocol

Install

brew install tuios                     # Homebrew (macOS, Linux)
yay -S tuios-bin                       # AUR (tuios-web-bin for the web server)
nix run github:Gaurav-Gosain/tuios     # Nix
curl -fsSL https://raw.githubusercontent.com/Gaurav-Gosain/tuios/main/install.sh | bash
go install github.com/Gaurav-Gosain/tuios/cmd/tuios@v0.8.0
docker run -it --rm ghcr.io/gaurav-gosain/tuios:v0.8.0
  • Archives. Each archive holds the binary, README and LICENSE.
    • tuios_* and tuios-web_* are the pure Go builds.
    • tuios-ghostty_* is tuios linked against libghostty-vt, for Linux and Windows on amd64 and arm64. The macOS archives follow in a later release. See the VT backends.
    • checksums.txt lists the sha256 of every archive, and the install script now checks it.
  • Updating. A binary installed by the script or from an archive updates with tuios update. tuios update --check only reports.
  • Building from source needs Go 1.26.6 or newer. v0.7.0 needed Go 1.25.8.

Agents

tuios can now tell which coding agents are running in your panes, whether each is working, waiting for you, done or errored, and it lets you answer them without switching panes. Guide: Agents.

  • Agent state. Each agent pane shows its state in the window title and as a row on the session rail. tuios recognises 23 agent CLIs by their process and screen.
  • Integrations. tuios integration install wires 18 harnesses to report their own state and conversation id. They include Claude Code, Codex, Gemini CLI, opencode, Kilo, Amp, Pi, Copilot, Cursor Agent and Qwen Code.
    • tuios integration status and tuios doctor agents show what is installed and what is out of date.
    • Crush reports state through herdr's pane protocol with no install step ([agents] herdr_protocol).
  • Inbox (docs). Ctrl+B i opens it, Ctrl+B o jumps to the oldest item, and tuios list-attention prints it from a shell.
    • It lists everything waiting for you, in every session and on every machine: approvals, questions, mail, errors and finished turns.
    • You can answer a prompt from the Inbox without attaching (tuios peek-prompt, tuios respond).
  • Approvals and risk rules. With [agents.approvals], permission requests from Claude Code, opencode, Kilo and Qwen Code wait in the Inbox and take one key to answer.
    • Risky commands, such as rm -rf, take two presses to allow. The rules are built in, and you can add your own with [[agents.approvals.risk.rule]].
  • Review and compare. Ctrl+B v or tuios review shows what an agent changed against its base: syntax highlighted, in a unified or split view.
    • You can leave line notes and send them back to the agent (review note, review send).
  • Fleets. tuios fan N "prompt" starts one prompt in several agents, each in its own git worktree, and harnesses can be mixed. Docs: worktrees.
    • fan compare, fan verify and fan keep pick a winner.
    • Selectors such as group:fan/retry needs:you address a whole group.
  • Start and queue.
    • tuios start-agent opens a helper beside you.
    • --protocol acp|codex runs a helper headless over ACP or the Codex app-server, shown as a transcript.
    • tuios queue leaves a prompt that is typed when the agent comes to rest.
  • Rich rail rows. A rail row shows the agent's model, context use and cost from tuios integration install claude-code --statusline, an away recap, and tuios agent-log.
    • Agent chrome stays hidden until tuios sees an agent.
  • Agents talking to agents (docs).
    • tuios send-agent-message, ask-agent and ask-human let agents message each other and ask you questions. Your replies are marked verified.
    • tuios stash keeps files for the session.
    • tuios subscribe streams events.
  • Pane grants. read, write, fan, respond and admin limit what a pane's process may do through tuios.
    • Give a helper less with --grants.
    • Set [agents.permissions] mode = "strict" to limit panes by default.
  • MCP server. tuios mcp serves the same surface as MCP tools. It is read-only and held to the agent's own session unless you pass --write or --scope all.
    • tuios integration install --mcp registers it with Claude Code, Codex, Gemini CLI and opencode.
  • tmux shim. tuios tmux-shim -- claude runs tools that drive tmux, such as Claude Code agent teams, and opens their panes as tuios panes. See TMUX_SHIM.md.
  • Agent skill. tuios --skill prints the guide an agent in a pane reads to drive tuios. tuios --skill TOPIC prints one topic of it.
  • Resume. After a daemon restart, the Inbox offers to resume each agent conversation that was running. The command is tuios resume-agent, and daemon.resume_agents sets whether it asks, resumes on its own, or does neither.
  • Hooks. A [hooks] table runs shell commands on ten events, including after-agent-state (docs).

Sessions and hosts

  • Daemon by default. On a fresh install a bare tuios is daemon-backed and tiled.
    • --standalone or TUIOS_NO_DAEMON=1 runs without the daemon.
    • If the daemon cannot start, tuios falls back to a standalone session.
  • Resurrection. Sessions come back after a daemon restart, a crash or a reboot, with fresh shells in their saved directories. On macOS too, the working directory is now restored. Commands: tuios resurrect (or restore) and tuios daemon --no-restore. Docs: sessions.
  • Other machines (docs).
    • tuios hosts add names a machine reached over ssh, and tuios hosts tailnet lists a Tailscale tailnet.
    • tuios attach --host, -s HOST:SESSION and new-window --host run sessions and panes there. tuios new --global holds panes from several machines.
    • Agents run on other machines with fan --host and start-agent -s HOST:SESSION. Their Inbox items show here, and tuios worktree pull brings their work back.
    • Each machine's [hosts] policy says what the others may do there.
  • Focus. tuios tracks whether each attached terminal has focus, and session-info shows it as host_focus.
  • tuios update replaces a binary installed by the script or from an archive, after checking it against checksums.txt. It moves tuios-web along with tuios.
    • A binary installed by Homebrew, the AUR, Nix or go install is left alone, and the command prints the right upgrade command instead.
  • Also new: tuios popup (a floating pane that closes when its command exits), tuios run, and tuios attach starting the daemon itself.

Look and feel

  • New defaults. The session rail is on, on the right, 24 columns wide. The dock and window titles are on top, zoom takes 95% of the screen, a pane takes typing on a double click, and the scrollbar has a track. See how to get the old looks.
  • Backgrounds. appearance.background can paint the cells that have no background of their own, with theme or a #RRGGBB colour. Per-surface keys cover panes, the desktop, window chrome, the dock and the rail. See configuration.
  • Colour depths. The chrome is designed separately for truecolor, 256 colours and 16 colours. At 16 colours it uses your terminal's own palette. See themes.
  • Light themes. Dialogs, the scrim, the rail and the dock stay readable on a light theme.
    • tuios asks your terminal for its colours, passes them on to programs that ask (OSC 4, 10 and 11), and follows its light and dark switch.
  • Settings search. The settings page (Ctrl+B ,) searches every tab. The command palette also reaches a setting by name.
  • Palette and which-key. The command palette lists commands under category headers. The which-key popup lays out the prefix chords in sections and columns.
  • Motion. appearance.motion takes none, basic or full.
    • basic keeps window slides and zoom.
    • full adds fades, the working shimmer and confetti.
    • --no-animations sets none for one run.
  • Modal dim. The screen behind an open panel is dimmed by appearance.modal_dim percent (default 30, 0 is off).
  • Glyphs. appearance.glyphs picks the characters the chrome is drawn with. A non-UTF-8 locale gets ASCII on its own, and tuios list-glyphs explains the choice. See GLYPHS.md.
  • Window controls are macOS-style dots on the left on a fresh install.

Terminal emulation

  • libghostty-vt backend. tuios can now use libghostty-vt as its terminal emulator. The tuios-ghostty_* archives and scripts/install.sh use it, and tuios --version names the backend.
  • Conformance. A conformance corpus now covers the pure Go emulator. NEL, DECALN, DECOM homing, DECSTR, SCORC, DECRQSS, mode 47, DECSED and DECSEL, HPB and VPB, ED 3 and insert mode were added or fixed.
  • Home and End follow DECCKM like the arrow keys, which fixes them in zsh (#193).
  • Unicode. Grapheme clusters stay whole across writes, REP repeats the whole cluster, and the width tables are tested against the Unicode data files.
  • Kitty graphics.
    • Unicode placeholders and the animation protocol work.
    • Covered images are cropped exactly, and kitten icat draws.
    • Graphics memory per pane is bounded.
  • Fixes. Right-margin wrap, lost accents, OSC 8 links, and 8-bit C1 controls inside strings.

Performance and size

  • Idle. An idle session schedules no timer renders and sends no bytes to its clients.
  • Rehydration. Switching workspace sends only the scrollback rows the client does not have yet, about 95% fewer bytes.
  • Binary size. The binary is about twice the size of v0.7.0, because of everything above.
    • Size work brought it back down from 26.7 MB: tuios for linux/amd64 is now about 25 MB, and about 24 MB for darwin/arm64.
    • scripts/binary-size.sh sets a budget, and CI fails a change that goes over it.
    • To stay small, tailscale is no longer linked in: the tailnet is read through tailscale status --json.
  • Measurements are in docs/perf.md.

Security hardening

  • tuios ssh requires a public key. It reads ~/.config/tuios/authorized_keys, falling back to ~/.ssh/authorized_keys. It refuses a non-loopback bind with no keys unless you pass --no-auth. Before, it accepted every connection.
  • tuios-web needs --cert and --key, --auto-tls, or an explicit --insecure to serve a LAN address. A settings change from the web client applies to that session only and does not rewrite your config file. See web.
  • Daemon socket. The socket directory must be a real directory, owned by you and closed to others. Debug logs are created 0600.
  • The daemon protocol bounds message sizes and nesting before decoding them.
  • Acting as the person. A process inside a pane cannot act as you: it cannot give verified answers or read your mail. Pane grants limit everything else it may do.
  • Downloads are verified. tuios update and the install script check every download against the release's checksums.txt.

Learn tuios

tuios.dev/learn is a guided tour of the real tuios, compiled to WebAssembly, with a practice shell in every pane. Nothing is installed, and no server is involved.

Breaking changes and migration

Stop the old daemon

The client and the daemon speak protocol 3 now, and a v0.7.0 daemon cannot serve a v0.8.0 client. After upgrading, run:

tuios kill-server

The v0.7.0 daemon saves nothing to disk, so its running sessions end. From v0.8.0 on, sessions are saved and come back after a restart.

New appearance defaults

A config file that sets one of these keys keeps its value. A key it does not set takes the new default. The first-run file that v0.7.0 wrote names dockbar_position, so most upgraded installs keep the dock at the bottom.

Option v0.8.0 default For the old look
appearance.sidebar.enabled true false
appearance.sidebar.position right left
appearance.sidebar.width 24 28
appearance.dockbar_position top bottom
appearance.window_title_position top bottom
appearance.zoom_size 95 100
appearance.click_to_type double single
appearance.scrollbar.style track thin

You can set each one in config.toml, in the settings page, or with tuios set-config, for example tuios set-config dockbar_position bottom in a running session.

startup.daemon and startup.tiled are now on for a fresh install. A config file with no [startup] table stays standalone and floating.

animations_enabled is replaced by appearance.motion

animations_enabled = false is read as motion = "none", and true as the default, full. The old key is dropped the next time the config is saved, and set-config still accepts it.

Other changes

  • Interface flags on subcommands. Flags such as --theme and --show-keys are refused by commands that draw no interface. Only tuios, attach, new and ssh take them. For example, tuios config path --theme dracula now fails with "Unknown flag".
  • Keybindings.
    • Ctrl+B Esc leaves prefix mode instead of detaching; Ctrl+B d detaches. A config that bound esc to prefix_detach is migrated.
    • Ctrl+B , opens settings. Rename is Ctrl+B r.
    • Snap to a corner moved to Ctrl+B L 1 to 4.
    • The nav_* and extend_* actions were removed.
  • Integrations. An integration installed by an earlier build is reported as out of date by tuios integration status and tuios doctor agents until you run tuios integration install <harness> again. Approvals for Claude Code and Qwen Code need the current version.
  • TUIOS_SOCKET. A TUIOS_SOCKET that names no live daemon is refused, and the error says what to do. The variable only reports the daemon a pane belongs to; it never chose one. To run a separate daemon, set XDG_RUNTIME_DIR and XDG_STATE_HOME.
  • Alerts and focus. With notifications.agent.suppress_focused (on by default), the alert and the after-agent-state hook for the pane you are looking at are held while any attached terminal has focus, or has not reported focus. When every attached terminal has lost focus, the alert fires.
  • -w resolution. -w resolves a full id first, then a window index, then an exact name, then a unique id prefix. Before, an id prefix won over a name, so a pane named db could resolve to another pane whose id started with db.
  • Home and End send SS3 sequences (ESC O H, ESC O F) when the application turns on cursor key mode (DECCKM), as the arrow keys already did.
  • TERM for detached sessions. A session made by a command without a terminal, such as tuios new --detach from a script, CI or an agent, gives its panes a real TERM (xterm-256color) instead of dumb.
  • tuios update needs curl. It downloads with curl, and without it the command stops and names the releases page. A release without checksums.txt is refused.
  • tuios ls exits 3 when no daemon is running, and lists the sessions saved on disk.
  • No tmux variables in panes. Panes no longer inherit TMUX or TMUX_PANE.

Contributors

Thank you to everyone who sent a pull request for this release:

Thanks also to everyone who reported bugs and asked questions.


Full Changelog: v0.7.0...v0.8.0

Don't miss a new tuios release

NewReleases is sending notifications on new releases.