What's New in v0.7.0
Video Playback
You can now watch videos inside tuios. mpv --vo=kitty works with both shared memory and base64 modes. For the best experience, use --vo-kitty-use-shm=yes which sends just a file reference instead of streaming megabytes of pixel data through the terminal. youterm also works out of the box.
Kitty Keyboard Protocol
Full support for the kitty progressive enhancement keyboard protocol with push/pop/query. Fish 4.x enables this automatically on startup, and it just works. Capital letters and other shifted printable keys are sent as text directly rather than CSI u encoding, which is what shells actually expect.
Kitty Graphics Improvements
- Static images (icat, yazi) render with proper vertical clipping when they extend past the viewport
- Images hide cleanly when the window goes out of bounds on any edge
- Fixed a bug where raw APC data was double-wrapped, which was silently breaking all direct base64 image transfers
- Shared memory transfers now send the correct shm object name to the host terminal
Pane Zoom
Press z in window management mode or Ctrl+B z in terminal mode to fullscreen any pane. When using shared borders, the zoomed pane renders without individual borders and the separator lines are hidden. The dockbar shows a Z indicator when a pane is zoomed.
Layout Prefix
Ctrl+B L opens a layout submenu where l loads and s saves a layout template. Loading is non-destructive now: existing windows get repositioned to match the template instead of being killed. If you have more windows than the template needs, the extras get minimized.
Copy Mode Drag Auto-Scroll
When you drag a selection above or below the pane in copy mode, scrolling now continues smoothly even if you stop moving the mouse. This uses a timer that fires every 50ms while you hold the mouse outside the content area.
Protocol Support
- OSC 4 palette color queries and sets
- OSC 52 clipboard operations
- Mode 2026 (synchronized output) and mode 2027 (unicode core)
- DA1 response includes sixel capability
- OSC 66 kitty text sizing (experimental, has known scrollback issues)
Quit Confirmation
New --confirm-quit flag and confirm_quit config option to always show the quit dialog, regardless of whether there are active foreground processes.
Bug Fixes
- Fixed crashes from concurrent map access in HasMouseMode (uses atomic bools now)
- Thread-safe KittyKeyboardFlags via atomic cache
- Sixel passthrough improvements with better viewport clipping
- Fixed prefix commands (Ctrl+B z, Ctrl+B L) not working in window management mode
- Fixed Dockerfile Go version to match go.mod
Known Limitations
- Kitty text sizing protocol (OSC 66) has basic passthrough but breaks with scrollback and window repositioning
- Sixel passthrough works but lacks pixel-level clipping
- Kitty animation protocol (a=f, a=a, a=c) is not supported yet
- Video playback without shm can flicker depending on frame rate and terminal performance. Use
--vo-kitty-use-shm=yeswhen possible.
Installation
TUIOS (Terminal Window Manager)
Quick Install (Linux/macOS):
curl -sSL https://raw.githubusercontent.com/Gaurav-Gosain/tuios/main/install.sh | bashHomebrew (macOS/Linux):
brew tap Gaurav-Gosain/tap
brew install tuiosArch Linux (AUR):
# Using yay
yay -S tuios-bin
# Using paru
paru -S tuios-binNix:
# Run directly
nix run github:Gaurav-Gosain/tuios#tuios
# Or add to your configuration
nix-shell -p tuiosGo Install:
go install github.com/Gaurav-Gosain/tuios/cmd/tuios@v0.7.0tuios-web (Web Terminal Server)
Homebrew (macOS/Linux):
brew tap Gaurav-Gosain/tap
brew install tuios-webArch Linux (AUR):
# Using yay
yay -S tuios-web-bin
# Using paru
paru -S tuios-web-binGo Install:
go install github.com/Gaurav-Gosain/tuios/cmd/tuios-web@v0.7.0Manual Download:
Download the appropriate tuios_* or tuios-web_* archive for your platform below, extract it, and run.
Changelog
New Features
- ae0f742: Reapply "feat: grid-based shared borders with proper junction characters" (@Gaurav-Gosain)
- b5ab00f: Reapply "feat: shared borders between tiled windows (simple overlap approach)" (@Gaurav-Gosain)
- e7dd53d: Revert "feat: grid-based shared borders with proper junction characters" (@Gaurav-Gosain)
- 4caa307: Revert "feat: grid-based shared borders with proper junction characters" (@Gaurav-Gosain)
- b26925e: Revert "feat: shared borders between tiled windows (simple overlap approach)" (@Gaurav-Gosain)
- dd246e3: Revert "feat: shared borders with post-compositing junction character fix" (@Gaurav-Gosain)
- cdff775: feat: OSC 66 text sizing passthrough with PostRenderWriter (@Gaurav-Gosain)
- f77543d: feat: add --confirm-quit flag and confirm_quit config option (@Gaurav-Gosain)
- 8308b3b: feat: add command palette (ctrl+p) with fuzzy search (@Gaurav-Gosain)
- 4e9f823: feat: add kitty keyboard protocol, OSC 4/52/66, mode 2026/2027, thread-safe mouse modes (@Gaurav-Gosain)
- adca477: feat: add scrollback browser with OSC 133 parsing, vim navigation, and mouse support (@Gaurav-Gosain)
- 0acc9f0: feat: add session switcher overlay (prefix+S or command palette) (@Gaurav-Gosain)
- 7d086f7: feat: comprehensive layout template v2 with CLI, BSP, CWD, startup commands (@Gaurav-Gosain)
- cc3c86c: feat: grid-based shared borders with proper junction characters (@Gaurav-Gosain)
- 1fa11a6: feat: interactive scrollbar with theme colors, click-to-jump, drag support (@Gaurav-Gosain)
- c26deaa: feat: kitty keyboard protocol input pipeline (CSI u encoding) (@Gaurav-Gosain)
- e8d4db8: feat: layout prefix (Ctrl+B L) with save/load, non-destructive layout loading (@Gaurav-Gosain)
- 3ec872c: feat: mouse wheel scrollback + visibility gating for hidden panes (@Gaurav-Gosain)
- 3e11e2a: feat: pane zoom, scrollback search, layout templates, fast render path (@Gaurav-Gosain)
- 1dab0af: feat: pass through kitty animation/frame/compose commands (@Gaurav-Gosain)
- de22884: feat: ranked fuzzy search in command palette (@Gaurav-Gosain)
- 6000e9f: feat: scrollback position indicator on window border (@Gaurav-Gosain)
- c87bd47: feat: scrollbar click/drag, dark gray colors, hide during manipulation (@Gaurav-Gosain)
- 67de79e: feat: scrollbar in border + selection auto-scroll (@Gaurav-Gosain)
- 114b793: feat: shared borders between tiled windows (@Gaurav-Gosain)
- 42cf5d6: feat: shared borders between tiled windows (simple overlap approach) (@Gaurav-Gosain)
- a32d979: feat: shared borders with post-compositing junction character fix (@Gaurav-Gosain)
- f46f63e: feat: smart split, scrollback indicator, and graphics refresh in render path (@Gaurav-Gosain)
- 97920db: feat: timer-based continuous auto-scroll for copy mode drag selection (@Gaurav-Gosain)
- e9608d6: feat: tmux-style shared borders with separator overlay (@Gaurav-Gosain)
- 626af67: feat: visual scrollbar in copy mode using block characters (@Gaurav-Gosain)
- df56e4c: feat: workspace-aware PTY subscriptions (@Gaurav-Gosain)
Bug Fixes
- b901997: Revert "fix: shared borders resize + remove broken junction fixer" (@Gaurav-Gosain)
- af344cc: fix: Ctrl+B passthrough uses CSI u when kitty keyboard active, thread-safe flags (@Gaurav-Gosain)
- 4fd97b9: fix: add bounds checking for video frame placement (@Gaurav-Gosain)
- 5b8bd71: fix: add q=2 and proper m=1 to streamed kitty graphics continuation chunks (@Gaurav-Gosain)
- 61fa9e7: fix: all tiling toggle paths now use ToggleAutoTiling() (@Gaurav-Gosain)
- 51bf80f: fix: borders appear/disappear immediately when toggling tiling mode (@Gaurav-Gosain)
- b4bdc01: fix: clear cached content when disabling tiling so borders render immediately (@Gaurav-Gosain)
- 54c356b: fix: clear stale image placement when dimensions change on resize (@Gaurav-Gosain)
- d911c17: fix: copy mode dock indicator color from neon yellow (#ffff00) to soft amber (#e0af68) (@Gaurav-Gosain)
- defce9f: fix: ctrl+d window close race + eliminate kitty graphics flicker (@Gaurav-Gosain)
- a0a163b: fix: deduplicate sixel renders + revert to BorderOffset for X position (@Gaurav-Gosain)
- 7768dff: fix: disable shared borders (flag exists but not yet implemented) (@Gaurav-Gosain)
- 819b3b1: fix: distinguish video frames from icat by checking cmd.More (@Gaurav-Gosain)
- 67d9eb2: fix: eliminate screen tearing by batching graphics with render cycle (@Gaurav-Gosain)
- 7feb202: fix: enable Kitty graphics protocol detection in daemon mode (@Gaurav-Gosain)
- d2e824e: fix: enable sixel passthrough when host terminal supports it (@Gaurav-Gosain)
- 8f6cb56: fix: flush video frames immediately to host terminal for shm/file playback (@Gaurav-Gosain)
- 26d674c: fix: force full re-render when disabling tiling — set HasNewOutput + MarkAllDirty (@Gaurav-Gosain)
- 5f6b345: fix: graphics passthrough and window dimension restore in daemon mode (@Gaurav-Gosain)
- bbfac44: fix: handle errcheck lint warning in mouse test (@Gaurav-Gosain)
- 5a78481: fix: handle mpv m=1 on every frame + always use a=T for placement requests (@Gaurav-Gosain)
- dfa682c: fix: hide and re-place kitty images on terminal resize (@Gaurav-Gosain)
- d608590: fix: hide images during overlays, increase daemon subscriber buffer (@Gaurav-Gosain)
- 9995187: fix: hide kitty images during copy mode scrollback (@Gaurav-Gosain)
- 5d5bdf1: fix: hide kitty images near bottom screen edge to prevent scroll feedback loop (@Gaurav-Gosain)
- c10f12c: fix: hide kitty images that extend past window bounds (@Gaurav-Gosain)
- 3503490: fix: icat/static images - only use immediate flush for video frames (@Gaurav-Gosain)
- 728fa6f: fix: idle tick syncs background windows to prevent stale content (@Gaurav-Gosain)
- 6981464: fix: image rendering bugs during window drag and position changes (@Gaurav-Gosain)
- 98012d4: fix: images now actually follow windows during drag (@Gaurav-Gosain)
- dca77df: fix: images now follow windows during drag instead of hiding (@Gaurav-Gosain)
- ddd1584: fix: kitty graphics video playback - accumulate frames, fix APC framing (@Gaurav-Gosain)
- 41854eb: fix: kitty graphics video playback - use a=T for frame updates (@Gaurav-Gosain)
- ebee35e: fix: layout load blank windows + separator drawn above dragged window (@Gaurav-Gosain)
- 1ee84f1: fix: mouse wheel scrolling now enters copy mode instead of scrollback mode (@Gaurav-Gosain)
- 52c3522: fix: only skip sixel images that hit screen bottom, not window edge (@Gaurav-Gosain)
- cdb67a6: fix: pass alt screen kitty graphics raw for animation apps (@Gaurav-Gosain)
- ddec321: fix: preserve ANSI escape sequences when clipping off-screen windows (@Gaurav-Gosain)
- f5e2d0f: fix: prevent double placement for non-video shm images (ytk, icat) (@Gaurav-Gosain)
- 352ffc0: fix: prevent phantom keypresses from mouse motion and fix white terminal colors (@Gaurav-Gosain)
- 38bf234: fix: re-enable sixel passthrough + hide images during copy mode scroll (@Gaurav-Gosain)
- 29bda64: fix: reduce window close timeout from 500ms to 10ms (@Gaurav-Gosain)
- d3d14c7: fix: remove broken scrollback search, fix templates/resize/help sync (@Gaurav-Gosain)
- 483ed8b: fix: remove screen bounds check that was skipping most sixel images (@Gaurav-Gosain)
- 380547f: fix: resolve FakeShell bugs and clean up linter warnings (@Gaurav-Gosain)
- 4188066: fix: resolve gopls hints in tests (@Gaurav-Gosain)
- 316f7b2: fix: resolve light theme rendering issues with ANSI colors (#74, #72, #41) (@Gaurav-Gosain)
- 2ddbdb5: fix: revert default tiling to SchemeSpiral (smart split is opt-in) (@Gaurav-Gosain)
- 7f695fe: fix: screen edge bounds checking for video, store window pos in pending (@Gaurav-Gosain)
- fe01cbc: fix: scrollback mode UX and command palette overlay positioning (@Gaurav-Gosain)
- 788e55d: fix: scrollbar actually renders + copy mode selection auto-scroll (@Gaurav-Gosain)
- 8c4839b: fix: scrollbar as always-fresh layer bypassing window cache entirely (@Gaurav-Gosain)
- a6f5403: fix: scrollbar as overlay layer on right border + race condition fix (@Gaurav-Gosain)
- bac0f9f: fix: scrollbar content sync + window management mode scrolling (@Gaurav-Gosain)
- 649ae7d: fix: scrollbar drag sets o.Dragging to enable motion event delivery (@Gaurav-Gosain)
- e7bf9d3: fix: scrollbar finds border char by rune scan + selection auto-scroll works (@Gaurav-Gosain)
- 60a5b9a: fix: scrollbar uses darker border color + debug notification for drag testing (@Gaurav-Gosain)
- cee9671: fix: scrollbar uses theme color, terminal mode indicator less harsh (@Gaurav-Gosain)
- 8afb3e7: fix: send original shm name to host terminal, not /dev/shm/ prefixed path (@Gaurav-Gosain)
- ea6d66a: fix: separator lines follow resize continuously in shared borders mode (@Gaurav-Gosain)
- 6cc010b: fix: separator overlay no longer paints spaces over window content (@Gaurav-Gosain)
- 00753cf: fix: shared borders disabled by default, enabled via --shared-borders flag (@Gaurav-Gosain)
- 2829b02: fix: shared borders resize + remove broken junction fixer (@Gaurav-Gosain)
- 5d76451: fix: shared borders — dragged windows above separators, no double borders (@Gaurav-Gosain)
- 9689a7b: fix: shared borders — live separator redraw, no space occlusion, border on drag (@Gaurav-Gosain)
- 01f6f7c: fix: shared borders — resize keeps separator lines, only drag shows borders (@Gaurav-Gosain)
- 3ca3768: fix: shared borders — show borders during drag/resize, retile after release (@Gaurav-Gosain)
- c0fe42a: fix: shared borders — windows stay borderless during resize, correct Tiled state (@Gaurav-Gosain)
- c35f458: fix: shifted printable keys send text directly, not CSI u (@Gaurav-Gosain)
- 72de5ad: fix: sixel X position off by 1 + remove debug logging (@Gaurav-Gosain)
- 059d679: fix: sixel passthrough writes directly at correct host position (@Gaurav-Gosain)
- 6c519eb: fix: sixel position hardcode +1 border offset instead of BorderOffset() (@Gaurav-Gosain)
- d96c05f: fix: sixel positioning uses BorderOffset + screen bottom bounds check (@Gaurav-Gosain)
- 68008da: fix: sixel writes directly to /dev/tty to avoid buffer fragmentation (@Gaurav-Gosain)
- 6c17009: fix: skip sixel images that extend past window or screen bounds (@Gaurav-Gosain)
- b9b89e7: fix: stale content in unfocused windows and focus switch latency (@Gaurav-Gosain)
- 13c611f: fix: staticcheck SA4006 unused value in tick rate selection (@Gaurav-Gosain)
- 19e3ecf: fix: stream kitty graphics chunks directly to host for video playback (@Gaurav-Gosain)
- 6e8df0a: fix: sync daemon PTY dimensions on session reattach (@Gaurav-Gosain)
- f186c63: fix: tape script Enter command send CRLF instead of LF in Windows (@dodorz)
- 6e1eee4: fix: text sizing dedup includes cursorX and scrollback to prevent silent drops (@Gaurav-Gosain)
- ae1bf20: fix: tiled window content rendering — use content directly without lipgloss size wrapper (@Gaurav-Gosain)
- 81e9183: fix: update Dockerfile to Go 1.25 (matches go.mod) (@Gaurav-Gosain)
- c85ab47: fix: use Compositor for layer Z-ordering in lipgloss v2 (@Gaurav-Gosain)
- ab78b76: fix: use actual screen dimensions to clip kitty images at terminal edges (@Gaurav-Gosain)
- a5e0241: fix: use index-based loop to ensure Tiled flag is cleared on actual window pointers (@Gaurav-Gosain)
- e6d1ee4: fix: use stored imageID from first chunk for final chunk placement (@Gaurav-Gosain)
- 5820539: fix: video bounds checking uses stored position, remove cursor save/restore (@Gaurav-Gosain)
- 09b514b: fix: visual line mode (shift+V) not highlighting immediately (@Gaurav-Gosain)
- dbf28f5: fix: wrap kitty graphics output in synchronized updates + fix shm/mpv (@Gaurav-Gosain)
- 3a5998f: fix: zoom mode with shared borders, window management keybinding, dockbar indicator (@Gaurav-Gosain)
Performance Improvements
- c85467c: perf: eliminate decode→re-encode cycle in kitty graphics passthrough (@Gaurav-Gosain)
- 54a716a: perf: flush kitty graphics immediately instead of waiting for render (@Gaurav-Gosain)
- 65c77e2: perf: forward file-based kitty images by path instead of reading+encoding (@Gaurav-Gosain)
- a4ab888: perf: remove defer/recover in hot render path and fix builder leak (@Gaurav-Gosain)
Other Changes
- 443583c: Reapply "revert: remove broken shared borders implementation for clean reimplementation" (@Gaurav-Gosain)
- c4cd3bf: Revert "revert: remove broken shared borders implementation for clean reimplementation" (@Gaurav-Gosain)
- 71bb2e1: debug: add notification in update.go to verify motion events reach the switch (@Gaurav-Gosain)
- 174c85d: debug: add notification to verify mouse motion events during scrollbar drag (@Gaurav-Gosain)
- c960755: debug: add sixel callback entry logging (@Gaurav-Gosain)
- ed7b0ff: debug: add sixel position logging to diagnose placement offset (@Gaurav-Gosain)
- 33fcb09: deps: upgrade bubbletea and lipgloss to v2.0.0 stable (@Gaurav-Gosain)
- a1ab611: deps: upgrade bubbletea, lipgloss, wish, log to stable v2 releases (@Gaurav-Gosain)
- 36a2167: disable sixel passthrough - images bleed past window borders (@Gaurav-Gosain)
- 5cba583: disable sixel passthrough - positioning and clipping not working correctly (@Gaurav-Gosain)
- 504418c: disable sixel passthrough until pixel-level clipping is implemented (@Gaurav-Gosain)
- eb799bc: drop kitty animation protocol support (a=f, a=a, a=c) (@Gaurav-Gosain)
- 71014e6: refactor(vt): sync upstream fix and apply scrollback review feedback (@Gaurav-Gosain)
- 83de042: refactor: PTY-driven rendering and hide dock stats by default (@Gaurav-Gosain)
- f468410: refactor: apply go fix modernizations (min/max, strings.Builder) (@Gaurav-Gosain)
- eacc6b3: refactor: clean up scrollback search (go fix) (@Gaurav-Gosain)
- b550f73: refactor: deduplicate initialization code across entry points (@Gaurav-Gosain)
- 69424a0: refactor: modernize Go code based on gopls hints (@Gaurav-Gosain)
- 6aa099f: refactor: optimize code and fix race conditions (@Gaurav-Gosain)
- 9c99f82: refactor: simplify code across app, session, and terminal packages (@Gaurav-Gosain)
- 357fb3b: refactor: simplify input handlers and deduplicate mouse/log viewer code (@Gaurav-Gosain)
- 414c25a: refactor: sixel passthrough improvements and codec (@Gaurav-Gosain)
- a7f8984: refactor: use OS factory in SSH server and deduplicate daemon socket check (@Gaurav-Gosain)
- ad2142f: revert: remove broken scrollbar overlay — use border position indicator instead (@Gaurav-Gosain)
- 17ef635: revert: remove broken shared borders implementation for clean reimplementation (@Gaurav-Gosain)
- 52857dd: style: apply gofmt struct field alignment (@Gaurav-Gosain)
Full Changelog: v0.6.0...v0.7.0