New SelectAll action: selects the entire terminal content, including the scrollback history, so it can be copied. Bound to Command + A on macOS by default, and available on every platform for custom key bindings via action = "SelectAll".
Fixed hint label rendering: keyboard hint labels (hyperlink hints) are now drawn as proper grid overlays using the configured hint foreground/background colors, with the leading character of each label highlighted.
Tab strip refresh: tab island backgrounds are now derived automatically from the window background color. colors.tabs and colors.tabs-active now set the inactive and active tab title colors, and the bar, tab-border, tabs-foreground, tabs-active-foreground and tabs-active-highlight color options were removed.
Updated wgpu to 30.0.0 and the librashader filter chain to 0.12 (the wgpu path used for RetroArch shaders on Windows/WASM and behind the wgpu feature flag elsewhere). librashader 0.12 brings a smarter framebuffer pool that only allocates intermediate framebuffers for the shader passes that actually need them.
Adaptive theme on Linux: Rio now follows the system light/dark preference on Wayland and X11. With adaptive-theme configured, Rio watches the XDG Desktop Portal color-scheme setting (the same one Firefox and GNOME/KDE use) and switches between your light and dark themes live when the system appearance changes, no restart required. This previously worked only on macOS and Windows (#408; based on #1358 by @pinpox).
Tabs can now be reordered by dragging them along the tab strip. Displaced tabs slide into place with a spring animation, and a released tab settles into its new slot.
Font fallback discovery now works on Linux and Windows: glyphs missing from your primary font — Nerd Font icons, CJK, emoji, and box/symbol characters — are discovered from installed system fonts (fontconfig on Linux, font-kit on Windows) and registered on the fly, instead of rendering as tofu (missing-glyph boxes). Previously only macOS did this. (#1630 by @nikicat, #1642 by @pinpox; closes #1015).
A tab's custom background color now follows the tab when tabs are reordered or closed, instead of staying pinned to a slot and painting under the wrong tab. The color picker also closes when its tab is closed.
New tabs show ~ as a placeholder title until the running program sets one.
The smooth (trail) cursor no longer animates between tabs and panels — switching tab or split places the cursor directly instead of sliding a trail across the screen.
Box-drawing and related symbols render again. Box-drawing, block elements, braille, powerline separators, geometric shapes, and legacy computing symbols are now drawn as crisp, pixel-aligned atlas sprites that tile seamlessly at any font size and scale factor — they no longer fall back to the font's (often gappy) glyphs. These had been dropped during the v0.4.x grid rewrite.
Kitty graphics: the X=/Y= sub-cell pixel offset is now applied when placing images (#1645 by @floens) — the parser already understood it, but placements were pinned to the cell boundary. Offsets are clamped to the cell box per the kitty spec, and an offset that spills the image into an extra row/column is now accounted for in cursor movement and row occupation.
Updated wgpu to 29.0.3 and the librashader filter chain to 0.11 (the wgpu path used for RetroArch shaders on Windows/WASM and behind the wgpu feature flag elsewhere).
Tab color picker now also opens on right-click (previously Control + left-click only).
New reset swatch in the tab color picker: a slashed box at the end of the swatch row clears the tab's custom color back to the default.
Fix clicks and cursor overrides being intercepted over the empty band at the top of the window when navigation.hide-if-single hides the tab strip on a single tab. New shared Navigation::island_visible(num_tabs) predicate keeps the renderer, click router, and cursor handler aligned — the empty band now passes through to the grid for selection and double-click maximize.
fix characters disappearing while typing on macOS — e.g. "agg" rendering as "ag", "355" as "35" (#1595). The text-run iterator now breaks the run around the cursor cell so speculative substitutions on later cells can't blank earlier ones.
fix panic on window resize / maximize (#1593, #1596 by @kronberger-droid). Grid dimensions are now sourced from the same snapshot that sized the row buffers, not from a live value that could race ahead.
macOS: text selection at the top of the window now works when navigation.hide-if-single is on with a single tab (#1512, #1516 by @0x0aa). Click routing and the cursor override now share a single gate that matches what the renderer paints.
reduce per-frame allocations in the rioterm renderer: per-cell styles are materialized once per snapshot, per-row dirty bits skip unchanged rows on partial damage, and visible-cell extras live in a per-frame map.
text-run shape cache key is now position-independent, and runs no longer break on space — adjacent words shape in a single call and cache hits stay high as the cursor walks a row.
fix wrong font size and window chrome alignment after connecting/disconnecting an external monitor (#1588 by @tauil).
drop the copa and rio-proc-macros crates — the escape-sequence parser now lives in
rio-backend with hot-path optimizations (bulk ASCII dispatch, inline OSC buffer, flat
codepoint-width table, fused validate+decode).
adopt simdutf for SIMD UTF-8 transcoding, validation, and base64 decoding.