{"slug": "show-hn-boo-screen-style-terminal-multiplexer-built-on-libghostty", "title": "Show HN: Boo – screen-style terminal multiplexer built on libghostty", "summary": "Coder has released Boo, a GNU Screen-style terminal multiplexer built on libghostty that parses every session's output through Ghostty's terminal emulation core to maintain exact screen state. The tool enables sessions to survive disconnects, provides a full-screen session manager, and offers agent-friendly automation primitives including send, peek, wait, and JSON output that work without a TTY.", "body_md": "A GNU `screen`\n\nstyle terminal multiplexer built on\n[libghostty](https://github.com/ghostty-org/ghostty)\n(`libghostty-vt`\n\n), written in Zig.\n\nEvery session's output is parsed through Ghostty's terminal emulation core, so boo always knows the exact screen state of every session: contents, styles, cursor, scrollback, and terminal modes. That state is used to rehydrate your terminal on attach, to answer terminal queries for detached sessions, and to let scripts and AI agents read the screen exactly as a human would see it.\n\n- Sessions that survive disconnects: detach with\n`Ctrl-A d`\n\n, reattach with`boo attach`\n\n. - A full-screen session manager:\n`boo ui`\n\nlists sessions in a sidebar. - Faithful redraws from libghostty terminal state, including SGR styles, cursor position, scrolling regions, window title, and terminal modes.\n- Agent-friendly automation primitives:\n`send`\n\n,`peek`\n\n,`wait`\n\n, and`--json`\n\noutput, all usable without a TTY.\n\n## demo.mp4\n\nFor Linux and macOS:\n\n```\ncurl -fsSL https://raw.githubusercontent.com/coder/boo/main/install.sh | sh\n```\n\nPre-built binaries are published on the [releases page](https://github.com/coder/boo/releases). Set `BOO_VERSION`\n\nto pin a release and `BOO_INSTALL_DIR`\n\nto change the\ninstall location (default: `/usr/local/bin`\n\nwhen writable, otherwise\n`~/.local/bin`\n\n).\n\n```\nboo new                    # new session running $SHELL, attached\nboo new work               # named session\nboo new work -d -- make    # create detached, running a command\nboo ui                     # manage sessions in a full-screen UI (alias: i)\nboo ls                     # list sessions\nboo attach work            # reattach (alias: at, a)\nboo rename work api        # rename a session\nboo kill work              # end a session\nboo kill --all             # end every session\n```\n\nWith no name, `boo new`\n\nnames the session after the current directory,\nfalling back to the process id when that name is taken or unusable.\n\nRun `boo help`\n\nfor the full overview, `boo help <command>`\n\nfor flags\nand examples, and `boo help --all`\n\nto print every help page at once.\n\nBindings follow GNU screen's defaults, including the `C-x`\n\nvariants\n(`C-a C-d`\n\ndetaches just like `C-a d`\n\n).\n\n| Keys | Action |\n|---|---|\n`C-a d` , `C-a C-d` |\ndetach |\n`C-a l` , `C-a C-l` |\nredraw |\n`C-a a` |\nsend a literal `C-a` |\n\n`boo ui`\n\nadds additional keybinds for switching, resizing, creating sessions, and killing them.\n\nEverything except `attach`\n\nworks without a terminal, which makes boo a\nnatural sandbox for scripts and AI agents driving interactive programs.\nThe canonical loop:\n\n```\nboo new build -d -- bash               # 1. headless session\nboo send build --text 'make' --enter   # 2. type into it\nboo wait build --idle                  # 3. let output settle\nboo peek build --scrollback            # 4. read the screen\nboo kill build                         # 5. clean up\n```\n\n**Reading state**:`peek`\n\nprints the rendered screen reconstructed from terminal state, not a raw byte log: ordered, fully redrawn, and stable.`--scrollback`\n\nincludes history;`--json`\n\nadds size, cursor, and title.**Waiting**:`wait --text <text>`\n\nblocks until the screen contains the text;`wait --idle`\n\nuntil output has been quiet for 2 seconds;`--timeout <dur>`\n\nexits 4 instead of hanging forever (durations:`500ms`\n\n,`2s`\n\n,`1m`\n\n,`4h`\n\n,`1d`\n\n). No more sleep-and-poll loops.**Sending input**:`send --text`\n\nis literal: no escape processing, no implicit newline, no quoting layer to fight.`--enter`\n\nsubmits,`--key Enter,C-c,Up`\n\nnames control keys, and stdin mode is binary safe.**Machine-readable output**:`ls --json`\n\nand`peek --json`\n\n.**Exit codes**:`0`\n\nsuccess,`1`\n\nerror,`2`\n\nusage error,`3`\n\nno such session,`4`\n\nwait timed out.\n\nSee `boo help automation`\n\nfor the full page.\n\nRequires [Zig](https://ziglang.org) 0.15.2.\n\n```\nzig build                       # binary in zig-out/bin/boo\nzig build test                  # unit tests\nzig build test-integration     # end-to-end tests on a real PTY\nzig build test-all             # everything\n```\n\nThe libghostty dependency is fetched and built from source\nautomatically (pinned in `build.zig.zon`\n\n).\n\nWith Nix, `nix develop`\n\nopens a shell with the right Zig version, and\n`nix build`\n\nbuilds the package to `./result/bin/boo`\n\n.\n\n``` php\nyour terminal <-(raw tty)-> boo client <-(unix socket)-> session daemon\n                                                         `- PTY + ghostty-vt Terminal\n```\n\n- The\n**client** puts your TTY in raw mode and shuttles bytes over a framed Unix-socket protocol (`src/protocol.zig`\n\n). - The\n**daemon**(forked on session creation) owns the session's command: a PTY-attached child whose output feeds a persistent`ghostty-vt`\n\n`TerminalStream`\n\n(`src/window.zig`\n\n). - While attached, output is passed through to your terminal byte for\nbyte. On attach the daemon sanitizes your terminal and replays the\nscreen from libghostty state using its VT\n`TerminalFormatter`\n\n. - Terminal queries (DSR, DA, XTWINOPS, ...) while detached are answered by libghostty's stream handler; while attached your real terminal answers, avoiding double replies.\n\nThis is a young project, not a drop-in GNU screen replacement:\n\n- One attached client per session (attaching steals); no\n`-x`\n\nsharing. - One window per session: no splits or tabs inside a session. Run one\nsession per task and juggle them with\n`boo ui`\n\n. - The\n`C-a`\n\nprefix is not yet configurable, and pasted bytes containing`0x01`\n\nare interpreted as the prefix (GNU screen has the same quirk;`boo ui`\n\nis immune thanks to bracketed paste). - Sessions run with\n`TERM=xterm-256color`\n\n.\n\nFeel free to [open an issue](https://github.com/coder/boo/issues/new)\nif you have questions, run into bugs, or have a feature request.\n\n[MIT](/coder/boo/blob/main/LICENSE). Ghostty itself is MIT licensed.", "url": "https://wpnews.pro/news/show-hn-boo-screen-style-terminal-multiplexer-built-on-libghostty", "canonical_source": "https://github.com/coder/boo", "published_at": "2026-06-11 20:52:26+00:00", "updated_at": "2026-06-11 21:50:26.232167+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "ai-products", "ai-infrastructure", "ai-startups"], "entities": ["Ghostty", "Zig", "Coder", "libghostty", "Boo", "GitHub", "Linux", "macOS"], "alternates": {"html": "https://wpnews.pro/news/show-hn-boo-screen-style-terminal-multiplexer-built-on-libghostty", "markdown": "https://wpnews.pro/news/show-hn-boo-screen-style-terminal-multiplexer-built-on-libghostty.md", "text": "https://wpnews.pro/news/show-hn-boo-screen-style-terminal-multiplexer-built-on-libghostty.txt", "jsonld": "https://wpnews.pro/news/show-hn-boo-screen-style-terminal-multiplexer-built-on-libghostty.jsonld"}}