Releases: PeterKnego/roost
Release list
v0.5.2
Install roost 0.5.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PeterKnego/roost/releases/download/v0.5.2/roost-installer.sh | shInstall prebuilt binaries via Homebrew
brew install peterknego/tap/roostDownload roost 0.5.2
| File | Platform | Checksum |
|---|---|---|
| roost-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| roost-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| roost-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| roost-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo PeterKnego/roostYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>v0.5.2-rc.3
Install roost 0.5.2-rc.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PeterKnego/roost/releases/download/v0.5.2-rc.3/roost-installer.sh | shInstall prebuilt binaries via Homebrew
brew install peterknego/tap/roostDownload roost 0.5.2-rc.3
| File | Platform | Checksum |
|---|---|---|
| roost-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| roost-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| roost-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| roost-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo PeterKnego/roostYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>v0.5.1
Install roost 0.5.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PeterKnego/roost/releases/download/v0.5.1/roost-installer.sh | shInstall prebuilt binaries via Homebrew
brew install peterknego/tap/roostDownload roost 0.5.1
| File | Platform | Checksum |
|---|---|---|
| roost-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| roost-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| roost-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| roost-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo PeterKnego/roostYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>v0.5.1-rc.1
Install roost 0.5.1-rc.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PeterKnego/roost/releases/download/v0.5.1-rc.1/roost-installer.sh | shInstall prebuilt binaries via Homebrew
brew install peterknego/tap/roostDownload roost 0.5.1-rc.1
| File | Platform | Checksum |
|---|---|---|
| roost-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| roost-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| roost-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| roost-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo PeterKnego/roostYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>roost 0.5.0
Since 0.4.0 — 51 commits.
Settings
A settings dialog behind the gear. Two panes. General edits the display
keys of either config file — hide, show_hidden, autosave, and in Global
scope share_selection and worktree_prompt — with a scope switch between
the project's .roost/config.toml and the global file, a one-sentence
description under every key, and a Clear that removes a key so the inherited
value applies again. allowed_origins, max_upload_bytes, ide and roots
are shown read-only under "Set by hand": no page can write them, and a forged
intent for one is refused by name. Writes go through the project websocket
and toml_edit, so comments and layout in a hand-edited file survive; a file
that does not parse is refused with its error, shown at the top of the pane,
and left byte for byte alone. Save waits for the write to be confirmed and
keeps the dialog open with your values if it was refused. Writing
show_hidden also clears the header toggle's override, so the file value is
what the tree shows next. The write is path-confined: a .roost symlink in a
cloned repository cannot redirect it out of the project.
Theme picker with live preview. The Theme pane shows every theme as a
tile painted in its own colours — roost's five, then daisyUI 5's 35, vendored
as variables only, no components and no Tailwind runtime. Clicking a tile
restyles the page at once, terminals included; Save keeps it and every
browser on the project follows without a reload; Cancel restores what you
opened with. A daisyUI theme is selected by name in theme, roost's own
files win where names collide (dark, light), and a bridge maps daisyUI's
variables onto roost's, including winning back --border, which daisyUI
defines as a width.
default_tab is gone. A v2 setting the four-pane client never read.
Files that still set it load silently.
Dialogs
Every question the workspace asks is an in-page dialog. The ten native
confirm/prompt/alert calls are replaced by shapes on the <dialog>
element — confirm, text, menu, choice — with the browser's own focus
trapping, Escape and backdrop. The file menu is a real context menu; new
file, folder and rename ask in place; closing a dirty tab, ending a session,
Close Project and Remove worktree confirm with the safe choice focused. The
✻ "a Claude is already working here" prompt and the save-conflict box moved
onto the same dialogs, the conflict one with the diff in view and focus on
Cancel because both answers discard someone's work. Dialogs open top-centre;
a stylesheet reset had been pinning them to the top-left corner. A project's
own theme can recolour a dialog but cannot rearrange, hide or relabel one.
Command line
roost --version. It used to parse as a port, fail, default to 8444 and
start a server — or panic at the bind where one already ran. Any other
non-numeric first argument now exits 2 with usage instead of being defaulted
past.
Under the hood
The hub caches the settings block like the hook state, invalidated on
RequestState and on a write, since snapshots go out on every debounced
keystroke. The browser test harness kills its roost child before giving up
on it listening. The gear lost the help cursor it kept from its placeholder
days.
roost 0.4.0
Since 0.3.0 — 76 commits.
Terminals
Close Project now ends the session, not just the dtach master. dtach
setsids the slave side, so the shell leads its own session and the master's
death reaches it only as a hangup — which anything may decline. Claude Code
does, so a Claude routinely survived Close Project, reparented to init, and
became unreachable. Worse, the confirmation asked only whether the socket was
still held, so roost reported a number of ended sessions that was too large.
It now derives the slave-side session before killing the holders, sweeps it
after, and confirms on both. Anything that left the session deliberately —
Claude's daemon run and bg-pty-host — is out of scope by construction.
Claude Code integration
A Claude that outlived a roost restart says so. Alt+K used to answer
"no Claude is connected to this project" while roost could see the Claude in
/proc and even marked its tab. It now distinguishes four cases and names the
terminal and both ports when the Claude predates the running roost.
Each project's IDE port is remembered and rebound. CLAUDE_CODE_SSE_PORT
is baked into a shell at spawn time and dtach sessions outlive roost, so an
ephemeral port could later be handed to a different project — and Claude Code
matches a lock file by port before it matches by path, which would connect a
Claude to the wrong workspace with that workspace's token. The port is now
recorded per project and taken again when it is still free.
Claude Code hooks are configurable from the UI. roost claude-hook turns
Claude's hook JSON into a notification, and the bell menu writes the project's
local .claude/settings.local.json around roost's own entries — never the
committed settings.json, never ~/.claude/settings.json, and never a file
roost could not parse.
Notifications route by project. A notice now goes to the project whose tab
it belongs in.
Markdown preview
Raw HTML is sanitized rather than neutralized. An allowlist of tags, every
attribute value escaped, and every src/href decided by roost's own resolver
rather than copied from the file. The tokenizer bounds its scans at the next
<, which fixes quadratic behaviour that took minutes on a few hundred
kilobytes of unterminated tags.
Editor and chrome
- A prose file's edit bar counts its non-ASCII characters and can mark them.
- New owl mark: the home glyph, the header, and ICO/PNG/touch-icon favicons.
Favicon URLs carry a content hash, so a browser that cached "no icon" looks
again.
Notes
cargo install roost now works — this is the first release published to
crates.io. The binary still binds 127.0.0.1 only; the loopback bind is the
security boundary, since the websocket spawns a shell.
roost 0.3.0
First tagged release, and the first under the name roost (the project was resh until 2026-09-02, and deadlight before 2026-08-18).
roost is a per-project remote workspace in a single Rust binary: a four-pane IDE-style layout in the browser, backed by real terminals that survive you closing the tab, built for working alongside Claude Code. See the README for what it does and the security model before exposing it to a network.
What is in this release
- Terminals backed by
dtach, so a shell outlives the browser tab and a server restart. - Editor, markdown/image preview and a live file tree that follow edits Claude makes on disk.
- Claude Code integration:
/ideconnects to roost's IDE socket, ✻ marks tabs running a Claude, Alt+K mentions route to the right one, and a second Claude can be steered into its own git worktree. - Project search, desktop notifications (
roost notify), multipart uploads and clipboard paste, per-project themes. - An overview page at
/listing projects, worktrees and sessions, rebuilt from sockets and/procso it survives restarts.
Install
cargo install --git https://github.com/PeterKnego/roost --tag v0.3.0or download roost-v0.3.0-x86_64-unknown-linux-gnu.tar.gz below (binary, README, licenses; the .sha256 file alongside it is its checksum). Needs dtach and git on PATH.
Upgrading from resh
Everything named resh became roost: the binary, the ROOST_* environment variables, ~/.config/roost/, ~/.local/state/roost/, and {project}/.roost/. Read the rename note at the top of docs/deploy.md before restarting: do not move the state directory while sessions are live, and update hooks that call resh notify.