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 | Agent mail |
Fan out across worktrees | Tiling |
Layouts | Session rail |
Launcher | Keybindings |
Themes | Spotlight |
Screen saver | Screenshots |
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_*andtuios-web_*are the pure Go builds.tuios-ghostty_*istuioslinked against libghostty-vt, for Linux and Windows on amd64 and arm64. The macOS archives follow in a later release. See the VT backends.checksums.txtlists 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 --checkonly 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 installwires 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 statusandtuios doctor agentsshow 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 iopens it,Ctrl+B ojumps to the oldest item, andtuios list-attentionprints 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]].
- Risky commands, such as
- Review and compare.
Ctrl+B vortuios reviewshows 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).
- You can leave line notes and send them back to the agent (
- 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 verifyandfan keeppick a winner.- Selectors such as
group:fan/retry needs:youaddress a whole group.
- Start and queue.
tuios start-agentopens a helper beside you.--protocol acp|codexruns a helper headless over ACP or the Codex app-server, shown as a transcript.tuios queueleaves 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, andtuios agent-log.- Agent chrome stays hidden until tuios sees an agent.
- Agents talking to agents (docs).
tuios send-agent-message,ask-agentandask-humanlet agents message each other and ask you questions. Your replies are marked verified.tuios stashkeeps files for the session.tuios subscribestreams events.
- Pane grants.
read,write,fan,respondandadminlimit 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.
- Give a helper less with
- MCP server.
tuios mcpserves the same surface as MCP tools. It is read-only and held to the agent's own session unless you pass--writeor--scope all.tuios integration install --mcpregisters it with Claude Code, Codex, Gemini CLI and opencode.
- tmux shim.
tuios tmux-shim -- clauderuns tools that drive tmux, such as Claude Code agent teams, and opens their panes as tuios panes. See TMUX_SHIM.md. - Agent skill.
tuios --skillprints the guide an agent in a pane reads to drive tuios.tuios --skill TOPICprints 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, anddaemon.resume_agentssets whether it asks, resumes on its own, or does neither. - Hooks. A
[hooks]table runs shell commands on ten events, includingafter-agent-state(docs).
Sessions and hosts
- Daemon by default. On a fresh install a bare
tuiosis daemon-backed and tiled.--standaloneorTUIOS_NO_DAEMON=1runs 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(orrestore) andtuios daemon --no-restore. Docs: sessions. - Other machines (docs).
tuios hosts addnames a machine reached over ssh, andtuios hosts tailnetlists a Tailscale tailnet.tuios attach --host,-s HOST:SESSIONandnew-window --hostrun sessions and panes there.tuios new --globalholds panes from several machines.- Agents run on other machines with
fan --hostandstart-agent -s HOST:SESSION. Their Inbox items show here, andtuios worktree pullbrings 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-infoshows it ashost_focus. tuios updatereplaces a binary installed by the script or from an archive, after checking it againstchecksums.txt. It movestuios-webalong withtuios.- A binary installed by Homebrew, the AUR, Nix or
go installis left alone, and the command prints the right upgrade command instead.
- A binary installed by Homebrew, the AUR, Nix or
- Also new:
tuios popup(a floating pane that closes when its command exits),tuios run, andtuios attachstarting 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.backgroundcan paint the cells that have no background of their own, withthemeor a#RRGGBBcolour. 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.motiontakesnone,basicorfull.basickeeps window slides and zoom.fulladds fades, the working shimmer and confetti.--no-animationssetsnonefor one run.
- Modal dim. The screen behind an open panel is dimmed by
appearance.modal_dimpercent (default 30,0is off). - Glyphs.
appearance.glyphspicks the characters the chrome is drawn with. A non-UTF-8 locale gets ASCII on its own, andtuios list-glyphsexplains 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 andscripts/install.shuse it, andtuios --versionnames 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 icatdraws. - 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:
tuiosfor linux/amd64 is now about 25 MB, and about 24 MB for darwin/arm64. scripts/binary-size.shsets 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.
- Size work brought it back down from 26.7 MB:
- Measurements are in docs/perf.md.
Security hardening
tuios sshrequires 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-webneeds--certand--key,--auto-tls, or an explicit--insecureto 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 updateand the install script check every download against the release'schecksums.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-serverThe 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
--themeand--show-keysare refused by commands that draw no interface. Onlytuios,attach,newandsshtake them. For example,tuios config path --theme draculanow fails with "Unknown flag". - Keybindings.
Ctrl+B Escleaves prefix mode instead of detaching;Ctrl+B ddetaches. A config that boundesctoprefix_detachis migrated.Ctrl+B ,opens settings. Rename isCtrl+B r.- Snap to a corner moved to
Ctrl+B L 1to4. - The
nav_*andextend_*actions were removed.
- Integrations. An integration installed by an earlier build is reported as out of date by
tuios integration statusandtuios doctor agentsuntil you runtuios integration install <harness>again. Approvals for Claude Code and Qwen Code need the current version. TUIOS_SOCKET. ATUIOS_SOCKETthat 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, setXDG_RUNTIME_DIRandXDG_STATE_HOME.- Alerts and focus. With
notifications.agent.suppress_focused(on by default), the alert and theafter-agent-statehook 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. -wresolution.-wresolves 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 nameddbcould resolve to another pane whose id started withdb.- 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 --detachfrom a script, CI or an agent, gives its panes a realTERM(xterm-256color) instead ofdumb. tuios updateneeds curl. It downloads withcurl, and without it the command stops and names the releases page. A release withoutchecksums.txtis refused.tuios lsexits 3 when no daemon is running, and lists the sessions saved on disk.- No tmux variables in panes. Panes no longer inherit
TMUXorTMUX_PANE.
Contributors
Thank you to everyone who sent a pull request for this release:
- @SebaWag: zen mode (#121), dock workspace tab labels (#122), the Nix package fix (#131), resolved colours in capture-pane (#136), palette tests (#137), reattach replay (#139), percentage resize (#140, #142), the clipboard fallback (#182), the right-click pane menu (#183), a scrollback lock fix (#184) and session appearance (#190)
- @NotAFlightRisk:
--list-themes(#134), dock docs (#147) and groupedlist-optionsoutput (#192) - @masshirodev: Home and End under DECCKM (#193)
- @ronisbr: theme chrome surfaces (#189)
- @noomz: terminal mode on focus change (#130)
- @actes2: screen size clamping (#128)
- @ethanhawkes-gif: a render panic fix (#125)
- @FaintFlower: the star history chart (#126)
Thanks also to everyone who reported bugs and asked questions.
Full Changelog: v0.7.0...v0.8.0