4 min read
v0.1.0
The first tagged release. A floating and tiling terminal window manager with a vim-style copy mode, scrollback, a TOML config with rebindable keys, and packaging for most platforms.
GGGaurav Gosain
The first release with a minor version number. The first commit, on 6 September 2025, was already a working prototype: floating windows, tiling, workspaces, an SSH server and window animations, all in one flat Go package. The 70 commits after it went through 26 v0.0.x tags in under two months and added what you need to install tuios, configure it, and copy text out of it.
Breaking changes
- The CLI moved from flat flags to subcommands.
--sshbecametuios ssh, and the other flags moved the same way.
Scrollback and copy mode
Before this release, text that scrolled off screen was gone, and text on screen could not be copied. Both are fixed.
- Scrollback. Each window keeps 10,000 lines. Enter it with
Ctrl+B [or by scrolling the mouse wheel up, and move with the arrows or vim keys. The upstream VT library had no scrollback, so tuios runs on a fork, and the change was sent upstream as a pull request to charmbracelet/x. - Copy mode. Vim-style motions:
hjkl, word motions,ggandG, count prefixes (10j,100G),f,F,tandTcharacter search that handles wide characters,/and?search with highlighted matches,%for bracket matching, andvorVvisual selection yanked to the clipboard withy. - Mouse selection. Click and drag, double-click for a word, triple-click for a line.
Copy mode started as one 2,137-line file and was split into six modules before the tag.
Configuration and the CLI
- A config file.
~/.config/tuios/config.tomlis created on first run with comments that document it, and follows XDG. Every keybinding in every mode can be rebound. - Actions, not code. A key maps to an action name and an action name maps to a handler, so rebinding needs no code change. The help overlay is built from the config, so it shows the keys you actually have.
- Platform defaults. macOS gets
optwhere Linux getsalt. - Subcommands. The CLI moved to Cobra, with Fang for help output:
tuiosruns it,tuios sshruns the SSH server, andtuios configandtuios keybindsmanage the two above. Shell completions and man pages are generated.
The prefix key
Everything hangs off a tmux-style Ctrl+B prefix, which now has submenus:
w: workspaces (switch to one, or move a window to one)m: minimize and restoret: window commands[: scrollbackq: quit
A which-key overlay appears after half a second and shows what each submenu offers.
On macOS, Option plus a number types a character such as ¡ or ™ instead of
sending a modifier. tuios recognises those characters as workspace switches,
and the help text says "Opt" on a Mac and "Alt" elsewhere.
Rendering is 30 times faster
The prototype rendered every cell of every window through a new lipgloss
style on every frame. A 13.45-second CPU profile spent 4.85 seconds in
renderTerminal. Two changes fixed it:
- A style cache keyed on cell attributes. A hit costs about 99 nanoseconds and no allocations.
- Terminal content is written as ANSI escape codes directly, skipping a style pipeline built for UI boxes. Neighbouring cells with the same style are batched, which cut style renders per frame from about 2,000 to about 50.
After both, renderTerminal took 0.16 seconds in the same profile, and total
CPU use fell from 53% to 24%. The input path also stopped clearing the render
cache on every keystroke.
| profiled | before (s) | after (s) |
|---|---|---|
| renderTerminal | 4.85 | 0.16 |
Terminal behaviour
- Mouse events reach programs on the alternate screen, so drag-to-select works in vim, scrolling in less, and clicking in htop.
- Paste works through OSC 52 and bracketed paste, including
Cmd+V. - The alternate screen is detected through VT callbacks instead of guessed.
- nushell no longer clears its own output. The VT library answered cursor position queries with stale coordinates, so tuios now corrects those replies.
- The PTY layer changed twice and ended on charmbracelet/x/xpty, for Windows
ConPTY support. The forked VT package is vendored, so plain
go installworks. - In tiling mode, swapping, minimizing and retiling only touch windows in the current workspace.
Installing
- GoReleaser builds for Linux, macOS, Windows, FreeBSD and OpenBSD.
- Releases publish to a Homebrew tap and the AUR (
tuios-bin), and there is a one-line curl installer. - The Nix package and devshell were the project's first outside contribution.
- The binary is statically linked, so there is no glibc version to match.
--ascii-onlydraws without Nerd Font icons, for machines that do not have one. It was added four days before the tag.
Fixed
- Notifications stayed up for about 17 days instead of 1.5 seconds. A duration
already in milliseconds was multiplied by
time.Millisecond. - Comparing cell colours could panic on a nil pointer: a non-nil
color.Colorinterface can hold a nil value. This was the last fix before the tag. - Typing over SSH did nothing after the restructure, because the input handler was registered for local mode only.
- On macOS,
exitdid not close the window when the exit message was missed. The tick loop now checks the process directly. - Visual selection highlighted the empty cells past the end of each line. It now stops at the text.
- Mouse selection in copy mode was off by one row.
- Dragging a window a few pixels no longer corrupts the tiled layout.
- The Windows build compiles again, after resize signalling was split into platform-specific files. Nobody had reported running it there.