All releases

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. --ssh became tuios 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, gg and G, count prefixes (10j, 100G), f, F, t and T character search that handles wide characters, / and ? search with highlighted matches, % for bracket matching, and v or V visual selection yanked to the clipboard with y.
  • 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.toml is 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 opt where Linux gets alt.
  • Subcommands. The CLI moved to Cobra, with Fang for help output: tuios runs it, tuios ssh runs the SSH server, and tuios config and tuios keybinds manage 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 restore
  • t: window commands
  • [: scrollback
  • q: 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.

CPU profile of the render hot path before and after the style cache and direct ANSI generation. Same workload, same capture length.
profiledbefore (s)after (s)
renderTerminal4.850.16
CPU profile of the render hot path before and after the style cache and direct ANSI generation. Same workload, same capture length.

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 install works.
  • 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-only draws 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.Color interface 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, exit did 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.