{"id":51522374,"url":"https://github.com/scottzirkel/roost","last_synced_at":"2026-07-08T17:01:10.251Z","repository":{"id":366986599,"uuid":"1278500861","full_name":"scottzirkel/roost","owner":"scottzirkel","description":"Agent command center for Omarchy/Hyprland, built as an additive soft-fork of Ghostty (GTK4).","archived":false,"fork":false,"pushed_at":"2026-07-01T14:17:18.000Z","size":1070,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-01T16:15:46.970Z","etag":null,"topics":["ai-agents","claude-code","coding-agent","ghostty","git-worktree","gtk4","hyprland","omarchy","terminal","wayland","zig"],"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/scottzirkel.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-23T21:18:06.000Z","updated_at":"2026-07-01T14:18:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/scottzirkel/roost","commit_stats":null,"previous_names":["scottzirkel/roost"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/scottzirkel/roost","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottzirkel%2Froost","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottzirkel%2Froost/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottzirkel%2Froost/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottzirkel%2Froost/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scottzirkel","download_url":"https://codeload.github.com/scottzirkel/roost/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottzirkel%2Froost/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35271852,"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-07-08T02:00:06.796Z","response_time":61,"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-agents","claude-code","coding-agent","ghostty","git-worktree","gtk4","hyprland","omarchy","terminal","wayland","zig"],"created_at":"2026-07-08T17:01:09.397Z","updated_at":"2026-07-08T17:01:10.237Z","avatar_url":"https://github.com/scottzirkel.png","language":"Zig","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"docs/logo-full.svg\" alt=\"Roost\" width=\"520\"\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eAn agent command center for the terminal.\u003c/strong\u003e\u003cbr\u003e\n  A GTK4 workspace that puts your coding agent, git, shell, and notes in one\n  window — built on real \u003ca href=\"https://ghostty.org\"\u003eGhostty\u003c/a\u003e terminals.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"Platform: Linux / Wayland\" src=\"https://img.shields.io/badge/platform-Linux%20%2F%20Wayland-1793D1\"\u003e\n  \u003cimg alt=\"Built on Ghostty\" src=\"https://img.shields.io/badge/built%20on-Ghostty-blueviolet\"\u003e\n  \u003cimg alt=\"License: MIT\" src=\"https://img.shields.io/badge/license-MIT-blue\"\u003e\n  \u003cimg alt=\"Status: early\" src=\"https://img.shields.io/badge/status-early-orange\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/hero.png\" alt=\"Roost workspace — Agent, Git, Shell, and Scratchpad panes\" width=\"760\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003csub\u003eThe default 2×2: Agent (Claude Code) · Git (lazygit) · Shell · Scratchpad\u003c/sub\u003e\u003c/p\u003e\n\n---\n\nRoost is a single window for the way you actually work with AI coding agents: a\n**role-typed, splittable workspace** of real terminal panes — your **agent**\n(Claude Code), **lazygit**, a **shell** — alongside a wired **scratchpad**. It\nremembers a **layout per project**, turns a branch into a **git worktree** in one\nkeystroke, and raises a **native notification** when your agent finishes or needs\nyou.\n\nIt's a Linux-native take on [supacode](https://github.com/supabitapp/supacode),\nbuilt the same way supacode is on macOS: on top of **real Ghostty terminal\nsurfaces** — GPU-accelerated, native, no Electron — rather than a web view or a\n`tmux` reskin. The panes are just the substrate; the point is everything wired\n*around* them.\n\n## Features\n\n- **Role-typed panes** — Agent, Shell, Git, Editor, and an in-app Markdown\n  Scratchpad. The Agent pane runs `claude` (or `$ROOST_AGENT`); the Git pane runs\n  `lazygit`; each falls back to your shell if the tool isn't installed.\n- **Free-form pane tree** — split any pane, add a pane by role, close, or reset\n  to the default 2×2. Not fixed quadrants — arrange it however you like.\n- **Per-project layouts** — your arrangement (including split sizes) is saved and\n  restored *per project directory*. Switch projects and the workspace reshapes to\n  that project's own layout.\n- **Git worktree command center** — `Ctrl+Shift+B` turns a branch name into\n  `git worktree add …` and switches the whole workspace into the new worktree.\n  `Ctrl+O` opens a chooser across recent projects and the current repo's\n  worktrees.\n- **Agent-aware notifications** — wire Roost into Claude Code's hooks and the\n  Agent pane raises a desktop notification + a status badge when the agent\n  finishes (`✓ done`) or needs you (`🔔 needs you`).\n- **Scratchpad ↔ Agent** — select text (or just a line) in the Scratchpad and\n  `Ctrl+Enter` sends it straight to the Agent pane; `Ctrl+Shift+Y` captures the\n  Agent pane's output back into the Scratchpad. The Scratchpad renders Markdown\n  live (Typora-style) as you type and autosaves per project.\n- **Inherits your Ghostty config** — fonts, theme, keybinds, and (on Omarchy)\n  your current theme are read from your existing `~/.config/ghostty`. A built-in\n  **Settings** dialog (`Ctrl+,`) covers the Roost-specific options.\n\n## Requirements\n\n- **Linux with a Wayland compositor.** Developed on\n  [Omarchy](https://omarchy.org) / Hyprland; any GTK4 + Wayland setup should\n  work.\n- **GTK4 + libadwaita** (Ghostty's runtime deps).\n- **[Zig](https://ziglang.org) 0.15.2** to build.\n- Optional but recommended: **[lazygit](https://github.com/jesseduffield/lazygit)**\n  (Git pane) and **[Claude Code](https://claude.com/claude-code)** (`claude`, the\n  Agent pane).\n\n## Install\n\nRoost is an *additive overlay* on Ghostty, so Ghostty comes in as a git\nsubmodule:\n\n```sh\ngit clone --recurse-submodules https://github.com/scottzirkel/roost\ncd roost\n\n# One-time, only on Arch + Zig 0.15.2: work around the SFrame relocation\n# (Zig #31272) by forcing LLVM/LLD. Skips itself if not needed.\nscripts/patch-zig-linker.sh\n\n# Build: overlays our source onto the pinned Ghostty checkout and compiles.\n./build.sh                       # -\u003e vendor/ghostty/zig-out/bin/roost\n```\n\nPut it on your `PATH`:\n\n```sh\nln -s \"$PWD/vendor/ghostty/zig-out/bin/roost\" ~/.local/bin/roost\n```\n\nOptional — install the desktop launcher (edit `Exec=` to point at your clone\nfirst) and the app icon:\n\n```sh\ncp scripts/roost.desktop ~/.local/share/applications/\nscripts/install-icon.sh                 # Roost logo icon → your hicolor theme\n```\n\n## Usage\n\n```sh\ncd ~/code/my-project \u0026\u0026 roost     # open Roost in this project (its own window)\nroost                             # open Roost in the current directory\nROOST_PROJECT=~/code/my-project roost\n```\n\nThe project directory is resolved from `$ROOST_PROJECT`, else the current\ndirectory — every pane (including lazygit) launches there. Launched from the\n**desktop entry**, Roost is single-instance: a second launch forwards to the\nproject chooser instead of opening a stray window. From a **terminal** it's\nalways its own independent window.\n\n### Keybindings\n\n| Key | Action |\n| --- | --- |\n| `Ctrl+O` | Open the project / worktree chooser (recents, worktrees, open folder; **New Worktree…** opens in a new window) |\n| `Ctrl+Shift+B` | Create a git worktree from a branch name and switch the workspace into it |\n| `Ctrl+Enter` | Send the Scratchpad's selection (or current line) to the Agent pane |\n| `Ctrl+Shift+Y` | Capture the Agent pane's output into the Scratchpad |\n| `Alt+1` … `Alt+9` | Focus pane by index |\n| `Ctrl+Alt+←/→/↑/↓` | Focus pane by direction (`hjkl` aliases too) |\n| `Ctrl+Shift+←/→/↑/↓` | Resize the focused pane |\n| `Ctrl+Shift+Alt+←/→/↑/↓` | Swap the focused pane with its neighbor |\n| `Ctrl+Shift+R` / `D` | Split the focused pane right / down |\n| `Ctrl+Shift+A` / `S` / `G` / `E` / `N` | Add an Agent / Shell / Git / Editor / Scratchpad pane |\n| `Ctrl+W` | Close the focused pane |\n| `Ctrl+Alt+R` | Reset to the default 2×2 layout |\n| `Ctrl+,` | Open Settings |\n| `Ctrl+Shift+/` | Show the keyboard cheat-sheet |\n| `Ctrl+Shift+Q` | Reload — restart into the latest build |\n| `Ctrl+Q` | Quit (saves the layout) |\n\n\u003e Note: shifted-digit accelerators don't fire in GTK, which is why splits/roles\n\u003e use letters rather than numbers.\n\n### Agent notifications\n\nThe Agent pane exports `ROOST_SOCK` into every pane. Wiring `scripts/roost-notify`\ninto Claude Code's `Stop` and `Notification` hooks lets the agent ping Roost:\n\n```jsonc\n// ~/.claude/settings.json  (see scripts/claude-hooks.json for the full snippet)\n\"hooks\": {\n  \"Stop\":         [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"/path/to/roost/scripts/roost-notify done\" }] }],\n  \"Notification\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"/path/to/roost/scripts/roost-notify needs-input\" }] }]\n}\n```\n\nFull setup is in [`scripts/README.md`](scripts/README.md). If `ROOST_SOCK` is\nunset (not running under Roost), the helper does nothing and exits 0 — it can\nnever break your agent.\n\n## Configuration\n\n- **Terminal look \u0026 feel** is your existing Ghostty config (`~/.config/ghostty`),\n  including the Omarchy theme — Roost reads it directly.\n- **Roost options** (agent command, focus-follows-mouse, scratchpad, etc.) live\n  in `~/.config/roost/config` and are editable in the **Settings** dialog\n  (`Ctrl+,`).\n- **Layouts \u0026 recents** live in `~/.config/roost/` (one layout file per project,\n  keyed by path).\n- **App id** is `dev.scottzirkel.Roost` (set so Roost never collides with a real\n  Ghostty instance).\n\n## How it works\n\nRoost's code relative-imports Ghostty internals, so it has to live *inside* the\nGhostty source tree to compile — but it never edits Ghostty's own files. So the\nbuild is a clean overlay. `./build.sh`:\n\n1. checks out the pinned Ghostty submodule (vanilla upstream, `v1.3.1`),\n2. symlinks `src/roost/` + `src/main_roost.zig` into `vendor/ghostty/src/`,\n3. applies `patches/build.zig.patch` — the one additive change, which registers\n   the `roost` executable, and\n4. runs `zig build roost`.\n\nThe diff against upstream Ghostty is *only* our own files plus that one build\nstep.\n\n```\nsrc/roost/            the workspace: panes, tree, layout, git, IPC, scratchpad\nsrc/main_roost.zig    thin entry point\npatches/              additive build.zig step\nscripts/              roost-notify (agent hooks), roost.desktop, toolchain patch\nvendor/ghostty/       Ghostty submodule (pinned, vanilla upstream)\nbuild.sh              overlay + build\n```\n\n## Status \u0026 roadmap\n\nRoost is **early but usable** — the core is complete and in daily use:\n\n- ✅ Real Ghostty panes, free-form pane tree, per-project persisted layouts\n- ✅ Git worktree create + switch (and into a new window), project/worktree chooser, recents\n- ✅ Agent command + socket IPC → desktop notifications + status badge\n- ✅ Scratchpad ↔ Agent (send selection, capture output) with live Markdown styling\n- ✅ Settings dialog, focus-follows-mouse (with dwell), keyboard cheat-sheet, app icon\n\nThe original roadmap gaps are now closed: the Roost app **icon**, the Agent-pane\n**`Ctrl+Z`** remap (→ Claude Code's undo), live scratchpad **Markdown styling** and\n**capturing agent output** into it, and **\"New Worktree…\" opening in a new window**\nare all done. No known feature gaps remain — issues and ideas welcome.\n\n## Contributing\n\nIssues and PRs welcome. Keep the **additive gate** intact — Roost adds files and\nnever edits Ghostty's source, so `git -C vendor/ghostty diff --name-only v1.3.1`\nshould only ever show `build.zig`.\n\n## License\n\nRoost's own code is **MIT** (see [LICENSE](LICENSE)). Ghostty is a separate\nproject (also MIT), consumed unmodified as a submodule.\n\n## Acknowledgments\n\n- [Ghostty](https://github.com/ghostty-org/ghostty) — the terminal that makes\n  this possible.\n- [supacode](https://github.com/supabitapp/supacode) — the macOS app that\n  inspired the shape of this one.\n\n## Logo\n\nThe Roost logo and brand marks were designed by **[Scott Zirkel](https://github.com/scottzirkel)**,\nby hand — no AI involved.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscottzirkel%2Froost","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscottzirkel%2Froost","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscottzirkel%2Froost/lists"}