Releases: navbytes/roost
Release list
v0.1.11
Two silent data-loss bugs, both worth knowing about
Alt+won the last pane threw that pane away. Its own prompt calls it "quit roost", but it removed the pane and then quit — so the saved workspace named a pane its map no longer had, and the repair minted a blankshellspec on next launch. The session id, cwd, title and note of the pane you quit on were gone.Alt+qon the same pane kept all of them. (#147)- A recycled pane id inherited a dead pane's session-detection clock, so a new pane could scan hours back and resume a stranger's conversation, permanently. (#141)
Desktop notifications changed channel — read this if you use Apple Terminal or Alacritty
roost used to fork osascript, which macOS attributes to Script Editor — there is no flag for that; a CLI cannot post a notification under its own name. roost now asks the terminal instead, with a bell and an OSC 9. Ghostty, iTerm2, WezTerm and kitty raise a real notification from it, attributed to themselves, and it survives ssh.
A terminal that ignores OSC 9 — Apple Terminal, Alacritty — now gets only the bell, not a desktop banner. (#152)
And a pane's notification no longer arrives twice. There were two emitters; that was invisible as a duplicate only while one of them was the osascript fork. The named one won, so: one banner, saying which pane, and silence for the pane you are already looking at. (#153)
Idle cost, measured against v0.1.10 on one machine
| idle CPU | terminal traffic | |
|---|---|---|
| v0.1.10 | 2.20% / 3.48% | ~890 B/s |
| v0.1.11 | 0.36% / 0.28% | ~61 B/s |
Four shell panes at 200×50, no input, alternating runs to cancel drift. Flat in the pane count at every step, because it was all fixed per-frame chrome: the quick-launch picker's $PATH probe running ~1,500 stat(2) a second with no dialog on screen, plus the whole help table, on every frame (#144); an unconditional 30 fps repaint (#146); and 12 fps even with nothing animating (#149).
Under the hood
Three new fuzzers over input surfaces nothing reached before — the mouse router, the key router, and paste (#147, #148). The mouse one found the Alt+w bug on seed 15. rustfmt and clippy are now enforced in CI (#150), tuned to the style the tree already had rather than imposed; that turned up ten unsafe blocks missing the SAFETY: comment every other one in the tree has.
What's Changed
- panes: a recycled pane id inherited the dead pane's session-detection clock by @navbytes in #141
- CLAUDE.md: record main's protection, and that the tap sync is not optional by @navbytes in #145
- perf: the chrome computed the picker and the help table on every idle frame by @navbytes in #144
- perf: roost repainted 30 times a second whether or not anything moved by @navbytes in #146
- workspace: quitting with Alt+w threw away the pane it quit on by @navbytes in #147
- test: the last two unfuzzed input surfaces — the key router, and paste by @navbytes in #148
- perf: a fleet at rest still repainted twelve times a second by @navbytes in #149
- chore: rustfmt + clippy, enforced in CI by @navbytes in #150
- chore: keep the reformat out of git blame by @navbytes in #151
- notify: roost's notifications came from "Script Editor" by @navbytes in #152
- notify: two banners for one event, and neither said which pane by @navbytes in #153
- tests: three gates blamed roost for the machine being out of ptys by @navbytes in #154
- v0.1.11 everywhere: version badge, pin examples, landing page, release request by @navbytes in #155
Full Changelog: v0.1.10...v0.1.11
v0.1.10
What's Changed
- Reliability audit: 20 bugs, a standing fuzzer, and the fixtures that would have caught them by @navbytes in #122
- panes: the session sweep never worked on macOS — Apple's pgrep has no
-sby @navbytes in #123 - perf: observe panes with syscalls, not lsof/ps/pgrep — the 2s UI freeze by @navbytes in #124
- vt100: two wide-glyph panics that killed roost and orphaned the whole fleet by @navbytes in #125
- main: a panic must not orphan the fleet — catch it, tear down, re-raise by @navbytes in #126
- tests: two standing panic sweeps — the renderer, and the pane-output path by @navbytes in #127
- perf: a line of history costs what it holds, not what the window is wide by @navbytes in #128
- extension: fsync before the rename — the user's settings.json deserves it by @navbytes in #129
- notify: a pane's OSC 9 loop forked one osascript per notification by @navbytes in #130
- main: a background thread's panic wrecked the terminal roost was still using by @navbytes in #131
- cli: the client had no deadline — a wedged roost hung
roost listforever by @navbytes in #132 - test(harness):
settleagreed with itself before roost had drawn anything by @navbytes in #133 - chore: take clippy to zero, and assert the thing one warning was pointing at by @navbytes in #134
- panes: the EOF sweep skipped itself whenever roost beat the reap by @navbytes in #135
- perf: quit paid the hangup grace once per pane — 4.0s for eight, budget is 2s by @navbytes in #136
- workspace: two tabs could still share a pane after the repair by @navbytes in #137
- test: the layout fuzzer now walks the whole control plane, not two verbs of it by @navbytes in #138
- C3/C4/C32: the pane's label moves to its border, off the pane's own output by @navbytes in #139
- perf: the pane blit allocated a String for every cell, every frame by @navbytes in #140
- ci: drop paths-ignore — a required check that never triggers never merges by @navbytes in #142
- v0.1.10 everywhere: version badge, pin examples, landing page, release request by @navbytes in #143
Full Changelog: v0.1.9...v0.1.10
v0.1.9
What's Changed
- Comparative UX review vs zellij/lazygit/gh dash + C33: move a pane within its tab by @navbytes in #112
- C34: the help overlay and hint bar read the live keymap by @navbytes in #113
- Make C34's rule mechanical: no chord spelled outside a resolver by @navbytes in #114
- roost keys, and Alt+; goes back (F11 + F6) by @navbytes in #115
- C36: Alt+' broadcasts one composed message to every pane by @navbytes in #116
- C37: Alt+Shift+g reverses the layout cycle by @navbytes in #117
- Simulation pass: three silent-failure bugs, one false alarm, and the gate that was missing by @navbytes in #118
- Close two of the three open §7 questions — neither needed a decision by @navbytes in #119
- C39: the keymap filters (
/) by @navbytes in #120 - v0.1.9 — the dead-pane keys reach the overlay, and the version bump by @navbytes in #121
Full Changelog: v0.1.8...v0.1.9
v0.1.8
What's Changed
- CLAUDE.md: record the PR-mergeable release path and why it exists by @navbytes in #108
- release: warn loudly when the tap sync skips; CLAUDE.md records the unset secret by @navbytes in #109
- panes: one dialog for name + note — Alt+r absorbs the note editor, Alt+Shift+n retires by @navbytes in #110
- v0.1.8 everywhere: version badge, pin examples, landing page, release request by @navbytes in #111
Full Changelog: v0.1.7...v0.1.8
v0.1.7
What's Changed
- panes: parking notes — Alt+Shift+n leaves a note that greets you on the badge by @navbytes in #104
- v0.1.7 everywhere: version badge, pin examples, landing page by @navbytes in #105
- release: make the workflow dispatchable — the tag becomes an output, not only a trigger by @navbytes in #106
- release: a PR-mergeable release trigger — touch .github/release-request by @navbytes in #107
Full Changelog: v0.1.6...v0.1.7
v0.1.6
What's Changed
- v0.1.5 everywhere: formula checksums, README, landing page by @navbytes in #100
- packaging: automate the Homebrew formula bump on release by @navbytes in #98
- ponytail audit: −4,300 lines, −1 dep, no behavior change by @navbytes in #101
- panes: zoomed panes announce themselves — ZOOM · N hidden on the border by @navbytes in #102
- v0.1.6 by @navbytes in #103
Full Changelog: v0.1.5...v0.1.6
v0.1.5
What's Changed
- v0.1.4 everywhere: formula checksums, README, landing page by @navbytes in #93
- infra: promote roost's input threads to macOS interactive QoS by @navbytes in #94
- infra: local perf telemetry for the QoS keep-or-delete decision by @navbytes in #95
- site: perch the bird on the demo terminal, lead installs with brew by @navbytes in #96
- packaging: point everything at navbytes/homebrew-tap by @navbytes in #97
- panes:
yon the exited bar copies a pasteable resume command by @navbytes in #99
Full Changelog: v0.1.4...v0.1.5
v0.1.4
What's Changed
- v0.1.3 everywhere: formula checksums, README, landing page by @navbytes in #86
- CI: skip the matrix on docs-only changes, cancel superseded PR runs by @navbytes in #87
- README: document read's --full and default-screen modes by @navbytes in #88
- docs: refresh ROADMAP + README, archive the shipped promotion-auth-gate change by @navbytes in #89
- ROADMAP: shelve leader-key chords with the reliability verdict recorded by @navbytes in #90
- status: exact turn-ends, ask-question surfacing, and a title-channel signal by @navbytes in #91
- status: recover the two commits stranded by #91's merge, plus review fixes by @navbytes in #92
Full Changelog: v0.1.3...v0.1.4
v0.1.3
What's Changed
- v0.1.2 everywhere: formula checksums, README, landing page by @navbytes in #83
- A config file for exactly one problem: Alt bindings that collide with readline by @navbytes in #84
- Freeze the view while you're dragging a selection, so you copy what you highlighted by @navbytes in #85
Full Changelog: v0.1.2...v0.1.3