# v0.1.0

URL: https://tuios.dev/releases/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.

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.

*[An interactive figure goes here. Open the page to use it.](https://tuios.dev/releases/v0-1-0)*

## 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.
