{"id":51093516,"url":"https://github.com/coder/boo","last_synced_at":"2026-06-24T06:00:50.415Z","repository":{"id":364149833,"uuid":"1264560911","full_name":"coder/boo","owner":"coder","description":"A GNU screen style terminal multiplexer built on libghostty.","archived":false,"fork":false,"pushed_at":"2026-06-23T02:32:42.000Z","size":233,"stargazers_count":695,"open_issues_count":5,"forks_count":20,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-06-23T03:09:54.579Z","etag":null,"topics":["ai","coding","ghostty","multiplexer","screen","terminal"],"latest_commit_sha":null,"homepage":"","language":"Zig","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/coder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-10T01:53:01.000Z","updated_at":"2026-06-23T02:32:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/coder/boo","commit_stats":null,"previous_names":["coder/boo"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/coder/boo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder%2Fboo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder%2Fboo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder%2Fboo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder%2Fboo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coder","download_url":"https://codeload.github.com/coder/boo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder%2Fboo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34719307,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","coding","ghostty","multiplexer","screen","terminal"],"created_at":"2026-06-24T04:00:42.102Z","updated_at":"2026-06-24T06:00:50.402Z","avatar_url":"https://github.com/coder.png","language":"Zig","funding_links":[],"categories":["Zig"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cpre\u003e\n _                     .-.\n | |__   ___   ___     (o o)\n | '_ \\ / _ \\ / _ \\    | O \\\n  | |_) | (_) | (_) |    \\   \\\n   |_.__/ \\___/ \\___/      `~~~'\n\u003c/pre\u003e\n\nSessions that haunt your terminal.\n\n[Install](#install) | [Usage](#usage) | [Automation](#automation) | [Why](#why-boo) | [Architecture](#architecture)\n\n[![ci](https://github.com/coder/boo/actions/workflows/ci.yml/badge.svg)](https://github.com/coder/boo/actions/workflows/ci.yml)\n[![release](https://img.shields.io/github/v/release/coder/boo)](https://github.com/coder/boo/releases/latest)\n[![license](https://img.shields.io/github/license/coder/boo)](./LICENSE)\n[![discord](https://img.shields.io/discord/747933592273027093?label=discord)](https://discord.gg/coder)\n\n\u003c/div\u003e\n\nA GNU `screen` style terminal multiplexer built on\n[libghostty](https://github.com/ghostty-org/ghostty)\n(`libghostty-vt`), written in Zig.\n\nEvery session's output is parsed through Ghostty's terminal emulation\ncore, so boo always knows the exact screen state of every session:\ncontents, styles, cursor, scrollback, and terminal modes. That state is\nused to rehydrate your terminal on attach, to answer terminal queries\nfor detached sessions, and to let scripts and AI agents read the screen\nexactly as a human would see it.\n\n## Features\n\n- Sessions that survive disconnects: detach with `Ctrl-A d`, reattach with `boo attach`.\n- A full-screen session manager: `boo ui` lists sessions in a sidebar.\n- Faithful redraws from libghostty terminal state, including SGR styles, cursor position, scrolling regions, window title, and terminal modes.\n- Agent-friendly automation primitives: `send`, `peek`, `wait`, and `--json` output, all usable without a TTY.\n\n\u003cvideo src=\"https://github.com/user-attachments/assets/d9310edd-68e8-4bc2-aac5-80f1da431dae\" autoplay=\"autoplay\" loop muted playsinline\u003e\u003c/video\u003e\n\n## Install\n\nFor Linux and macOS:\n\n```sh\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` to pin a release and `BOO_INSTALL_DIR` to change the\ninstall location (default: `/usr/local/bin` when writable, otherwise\n`~/.local/bin`).\n\n## Usage\n\n```sh\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` names the session after the current directory,\nfalling back to the process id when that name is taken or unusable.\n\nRun `boo help` for the full overview, `boo help \u003ccommand\u003e` for flags\nand examples, and `boo help --all` to print every help page at once.\n\n### Key bindings (prefix `Ctrl-a`)\n\nBindings follow GNU screen's defaults, including the `C-x` variants\n(`C-a C-d` detaches just like `C-a d`).\n\n| Keys      | Action                              |\n|-----------|-------------------------------------|\n| `C-a d`, `C-a C-d` | detach                     |\n| `C-a l`, `C-a C-l` | redraw                     |\n| `C-a a`   | send a literal `C-a`                |\n\n`boo ui` adds additional keybinds for switching, resizing and hiding the sidebar, creating sessions, and killing them.\n\n### Automation\n\nEverything except `attach` works without a terminal, which makes boo a\nnatural sandbox for scripts and AI agents driving interactive programs.\nThe canonical loop:\n\n```sh\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` prints the rendered screen reconstructed\n  from terminal state, not a raw byte log: ordered, fully redrawn, and\n  stable. `--scrollback` includes history; `--json` adds size, cursor,\n  and title.\n- **Waiting**: `wait --text \u003ctext\u003e` blocks until the screen contains\n  the text; `wait --idle` until output has been quiet for 2 seconds;\n  `--timeout \u003cdur\u003e` exits 4 instead of hanging forever (durations:\n  `500ms`, `2s`, `1m`, `4h`, `1d`). No more sleep-and-poll loops.\n- **Sending input**: `send --text` is literal: no escape processing, no\n  implicit newline, no quoting layer to fight. `--enter` submits,\n  `--key Enter,C-c,Up` names control keys, and stdin mode is binary\n  safe.\n- **Machine-readable output**: `ls --json` and `peek --json`.\n- **Exit codes**: `0` success, `1` error, `2` usage error, `3` no such\n  session, `4` wait timed out.\n\nSee `boo help automation` for the full page.\n\n## Why boo?\n\nGNU screen works the same way boo does, architecturally: it parses all\noutput through its own built-in terminal emulator and redraws from\nthat state on reattach. But that emulator is decades old and lags far\nbehind what modern programs emit. Whatever it doesn't understand gets\ndropped or mangled on redraw. boo swaps that layer for `libghostty-vt`,\nGhostty's VT core, so the saved state matches what your terminal would\nactually display, and terminal queries are answered while detached so\nTUIs don't hang unattended.\n\nScripting is the other win: `send`, `peek --json`, and\n`wait --text`/`--idle` instead of `-X stuff`, hardcopy files, and\nsleep loops.\n\ntmux is great, it just solves a different problem. boo keeps screen's\nmodel by design: sessions, a prefix key, and nothing else to learn.\nOne session per task, with `boo ui` to juggle them.\n\n## Contributing\n\nRequires [Zig](https://ziglang.org) 0.15.2.\n\n```sh\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\nWith Nix, `nix develop` opens a shell with the right Zig version, and\n`nix build` builds the package to `./result/bin/boo`.\n\n## Architecture\n\n```\nyour terminal \u003c-(raw tty)-\u003e boo client \u003c-(unix socket)-\u003e session daemon\n                                                         `- PTY + ghostty-vt Terminal\n```\n\n- The **client** puts your TTY in raw mode and shuttles bytes over a\n  framed Unix-socket protocol (`src/protocol.zig`).\n- The **daemon** (forked on session creation) owns the session's\n  command: a PTY-attached child whose output feeds a persistent\n  `ghostty-vt` `TerminalStream` (`src/window.zig`).\n- While attached, output is passed through to your terminal byte for\n  byte. On attach the daemon sanitizes your terminal and replays the\n  screen from libghostty state using its VT `TerminalFormatter`.\n- Terminal queries (DSR, DA, XTWINOPS, ...) while detached are answered\n  by libghostty's stream handler; while attached your real terminal\n  answers, avoiding double replies.\n\n## Caveats\n\nThis is a young project, not a drop-in GNU screen replacement:\n\n- One attached client per session (attaching steals); no `-x` sharing.\n- One window per session: no splits or tabs inside a session. Run one\n  session per task and juggle them with `boo ui`.\n- The `C-a` prefix is not yet configurable, and pasted bytes containing\n  `0x01` are interpreted as the prefix (GNU screen has the same quirk;\n  `boo ui` is immune thanks to bracketed paste).\n- Sessions run with `TERM=xterm-256color`.\n\n## Support\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## License\n\n[MIT](LICENSE). Ghostty itself is MIT licensed.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoder%2Fboo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoder%2Fboo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoder%2Fboo/lists"}