Files
freno-dev/src/routes/nook/changelog-archive.ts
Michael Freno 9ff095a82c nook: fill release notes the appcast lost from the archive
0.8.0 and 0.7.0 rendered as a version header over an empty row on
/changelog and in releases.json, the feed the macOS app's Changelog pane
renders. Older still, 0.6.0/0.6.2/0.6.3 were gone from the page outright.

Both come from one gap. The appcast is the only live source and it is not a
store: it holds just the DMGs the release machine keeps, and
generate_appcast drops the description of any rebuilt item whose DMG ships
no notes file of its own — so a release it still lists can arrive with
nothing to show, and one it has aged out of vanishes. The checked-in
archive was meant to cover that, but it stopped at 0.5.0, and mergeReleases
skipped an archived version whenever the appcast mentioned it, so it could
never heal a row that existed and was blank.

The archive now carries every release that shipped notes, 0.9.0 down to
0.2.0, and withArchivedNotes fills an item only where the feed has nothing,
leaving a published description alone. /changelog and releases.json run the
same rule rather than two copies, so the page and the feed cannot disagree
about what a release said. 0.6.1 and 0.3.1 stay absent by design — they
shipped with no notes written.

Tests: bun test src/routes/api/the-nook/ (51 pass; the 4 new cases fail on
this branch's parent); bun test unchanged at 49 failures, all in
src/server/security, which needs an .env a worktree does not carry.
Proved end to end against the live appcast as published by the 0.9.0
release: 11 releases, all with sections.

NOOK-305

Co-Authored-By: qwen3.8-flash <noreply@freno.me>
2026-10-13 00:19:05 -04:00

81 lines
18 KiB
TypeScript

// Every release of The Nook, newest first, checked in as the durable copy of
// what each one said.
//
// The appcast is the live feed — it carries the build numbers — but it is not
// a store: it holds only the DMGs the release machine still has, and
// generate_appcast drops the description of any rebuilt item whose DMG ships
// no notes file of its own. So a release the appcast lists can arrive with
// nothing to show, and one it has aged out of vanishes outright. Both are
// covered from here: /changelog and releases.json fill an item that has no
// notes from these (NOOK-304).
//
// Append the release being folded at each release cut, or the next release
// ages out into a blank row exactly as 0.6.0-0.8.0 did. The source text is
// `CHANGELOG.md` in the-nook, which keeps every release for this reason, and
// these notesHtml bodies are rendered by its own embed_release_notes.py rules.
//
// 0.3.1 and 0.6.1 shipped without written notes and are absent by design.
export interface ArchivedRelease {
version: string;
date: string;
notesHtml: string;
}
export const ARCHIVED_RELEASES: ArchivedRelease[] = [
{
"version": "0.9.0",
"date": "2026-10-12",
"notesHtml": "<p><b>Added</b></p><ul><li>Replies from iPhone, watch or island reach agents directly in iTerm2, Terminal or kitty</li><li>kitty needs remote control enabled in kitty.conf; the app says so if it&#x27;s missing</li><li>Remove a module from its tile&#x27;s own config popup, named with the panel it sits in</li></ul><p><b>Changed</b></p><ul><li>Island bottom corners match the physical notch on every display</li></ul><p><b>Fixed</b></p><ul><li>Hitting a usage or session limit ends with an error, including when the limit resets</li><li>OpenClaw sessions now end turns properly instead of looking unfinished forever</li><li>Right-click anywhere on a tile removes it in the layout editor</li><li>The island opens promptly and smoothly, even while the app is busy with layout</li><li>Island readings shrink to fit instead of being cut off on non-notch displays</li></ul>"
},
{
"version": "0.8.0",
"date": "2026-10-12",
"notesHtml": "<p><b>Added</b></p><ul><li>Island stays visible on the Lock Screen showing agent working and waiting counts; on by default</li><li>Any of the six Nook chiptunes can be assigned to any agent event in Sounds settings</li><li>Volume mixer tile height is now user-controllable with grips in the layout editor</li></ul><p><b>Changed</b></p><ul><li>Density picker now reshapes stat rows: compact drops labels, mini flows values inline</li><li>Timer countdown uses a travelling tick crest instead of a plain progress bar</li><li>Question chiptune swapped to call audio; unused incoming-call sound kind removed</li><li>Layout editor uses an \u2715 button in place of the old drop target</li></ul><p><b>Fixed</b></p><ul><li>Notification sounds no longer overlap; one clip at a time, latest event wins</li><li>Mirrored notifications stay silent where a chiptune already sounds</li><li>Idle sweep completions no longer chirp with nothing surfaced</li><li>Pi agent connection errors now surface as errors instead of reading as idle</li><li>Memory tile fills tall tiles with more process rows instead of stopping at five</li><li>Editor auto-fits agents and mixer tile heights to their content</li></ul>"
},
{
"version": "0.7.0",
"date": "2026-10-11",
"notesHtml": "<p><b>Security</b></p><ul><li>iPhone relay pairing and messages are end-to-end encrypted.</li><li>Weather lookups round locations and keep Apple credentials off Macs.</li><li>Pairing codes and device tokens are stored hashed on the relay.</li><li>Relay registration prevents anonymous takeover of existing paired installs.</li></ul><p><b>Added</b></p><ul><li>iPhone companion pairing, approvals, questions, replies, history, and push notifications.</li><li>Relay, Tailscale, and LAN connection paths for the companion.</li><li>Timed and activity-based iPhone notification mutes in Phone settings.</li><li>Phone settings card for requesting iPhone TestFlight beta access.</li><li>Watch replies, multi-part questions, completion details, and notification actions.</li><li>Home, Lock Screen, and watch-face widgets for agent fleet status.</li><li>Weather module with saved locations and relay-backed forecasts.</li><li>Countdown timer module, compact slot item, and floating action.</li><li>Configurable floating action buttons around the expanded island.</li><li>One-click remote host setup from ssh config or Tailscale.</li><li>Remote hosts mirror this Mac\u2019s installed integrations automatically.</li><li>Custom agents can register identity, capabilities, and install wiring.</li><li>Changelog tab under About with live, cached, and bundled notes.</li><li>Onboarding now teaches the island, agents, panels, iPhone pairing, and extras.</li><li>Module tiles declare features, density, overflow, and per-tile configuration.</li><li>Layout editor supports gap removal, seam dragging, and drag auto-scroll.</li><li>Panel modules can include Weather and Timer tiles.</li><li>Floating actions can launch apps, shortcuts, URLs, commands, and power controls.</li><li>Onboarding can send an optional trial reminder email.</li></ul><p><b>Changed</b></p><ul><li>Agents panel rows resurface on turn completion, questions, and errors.</li><li>Expanded agent rows stay stable except when important events surface.</li><li>Questions now render inside their session rows.</li><li>Approvals surface the island, and Allow can cover one session.</li><li>Agent rows show integration capabilities and limitations.</li><li>Remote session rows name their machine when hooks are current.</li><li>Remote session rows no longer repeat \u201cremote\u201d twice.</li><li>Remote hosts show live step progress without blocking local agent rows.</li><li>Remote host removal deletes Nook entries while preserving user hooks.</li><li>Agent slot squares fill three rows before showing +N.</li><li>Phone settings now guide relay, Tailscale, and LAN pairing.</li><li>iPhone connection status moved into Settings.</li><li>iPhone conversations can optionally group by project.</li><li>First iPhone launch explains the companion before asking for notifications.</li><li>Power tile leads with draw and flow, shedding app lists first.</li><li>Temperature tile pairs each die\u2019s usage trace with its temperature.</li><li>Keep Awake and other tiles shrink to their actual content.</li><li>Only modules affected by density show the density picker.</li><li>Module options open from each tile\u2019s gear.</li><li>Disk headlines and volume chips match Finder-style storage numbers.</li><li>Battery slot now shows watts under the glyph.</li><li>Session detail opens wider and renders Markdown tables, code, and lists.</li><li>Island transitions now share one quicker, bouncier motion style.</li><li>Floating action buttons ride the island\u2019s expansion and collapse.</li><li>Call interception now defaults off because it remains alpha.</li><li>Nook Privileged Helper now covers all root-powered features.</li><li>Chiptune sounds are quieter, and calls no longer ring on Mac.</li><li>Phone and watch widget wording now says what the numbers count.</li><li>Plugin installs now keep one canonical copy and link hosts to it.</li><li>Custom agent installs link declared plugin bodies instead of copying them.</li><li>Remote host setup reports skipped missing agents instead of writing unused configs.</li></ul><p><b>Fixed</b></p><ul><li>Replies to remote sessions target the local ssh pane, not colliding panes.</li><li>Jumping to remote sessions focuses the local ssh window.</li><li>Remote sessions vanish promptly when their machine disappears.</li><li>Codex sessions report again after updating the installed hook.</li><li>Remote setup writes only agents present on that machine.</li><li>Repeated remote source values now accumulate correctly.</li><li>Re-pointing a host replaces old Mac entries instead of duplicating them.</li><li>Remote probes no longer prefer stale socket files.</li><li>Remote hosts with URL-form addresses report again.</li><li>Remote command checks now time out instead of hanging forever.</li><li>SSH masters and media adapters stop spinning at EOF.</li><li>Remote rows prune after silent killed sessions, including pending approvals.</li><li>Codex native approvals and questions now appear and answer correctly.</li><li>Codex native requests no longer disappear after unrelated tool activity.</li><li>Session-end cleanup dismisses stale cards and resets session Allow grants.</li><li>Released bridge requests no longer answer decisions nobody made.</li><li>Hook timeouts clear abandoned approval cards.</li><li>Liveness pings no longer erase completions, approvals, or prompts.</li><li>Content-less session noise no longer keeps dead rows alive.</li><li>Notification events no longer replace an agent\u2019s actual reply.</li><li>Injected task notifications no longer become user prompts or titles.</li><li>Hermes clarify calls now render as questions.</li><li>Hermes turns complete at post-LLM events, not process exit.</li><li>Opencode 2.x plugins now report sessions again.</li><li>Repaired opencode plugins take effect after the service restarts.</li><li>Terminal-only questions are read-only on phone and watch.</li><li>Phone and watch notifications use consistent titles, subtitles, and bodies.</li><li>Paired iPhones no longer crash on launch.</li><li>Notification taps no longer crash the iPhone app.</li><li>Revoked phones return to pairing instead of staying stuck.</li><li>Valid session updates no longer get rejected as replays.</li><li>Some long iPhone notifications now deliver reliably.</li><li>Foreground phone notifications match push notification wording.</li><li>Widget data refreshes independently while the app is closed.</li><li>Phone widgets show actionable counts and sessions more clearly.</li><li>Hourly Weather starts at the hour in progress.</li><li>Dragging tiles no longer drops about half a band low.</li><li>Moving tiles no longer resizes the tile or its neighbor.</li><li>Dragged tiles reflow neighboring tiles live before release.</li><li>Resizing into a neighbor moves it instead of blocking.</li><li>Module cards clip to their assigned box instead of overlapping neighbors.</li><li>Chrome-less agent lists no longer reserve phantom padding.</li><li>Session detail now hugs short replies instead of growing to maximum height.</li><li>Expanded panels now reserve the real tab strip height.</li><li>Floating buttons close only after the island has collapsed.</li><li>Campfire animation no longer causes compact idle CPU churn.</li><li>Waveform drawing no longer relayouts the whole island repeatedly.</li><li>Audio capture lifecycle no longer freezes the UI thread.</li><li>Connected-to-power Keep Awake now follows plug and unplug events.</li><li>Lid-closed Keep Awake now survives clamshell sleep through the helper.</li><li>Lid-awake toggles now reflect helper replies correctly.</li><li>Power-source teardown no longer leaves crash-prone stale callbacks.</li><li>Battery flow and power ribbon watts now add up correctly.</li><li>Battery charge-limit calibration pauses are identified correctly.</li><li>Draining-to-limit labels were removed to avoid misleading states.</li><li>Battery condition now shows macOS\u2019s real service state.</li><li>Battery capacity and temperature read correctly on newer macOS.</li><li>Charge gates no longer release gates owned by other software.</li><li>Disk activity rates now measure bytes per second correctly.</li><li>Disk graphs no longer start with a fake zero sample.</li><li>Disk sampling stays owned by the active panel, not Settings previews.</li><li>Volume chips show real fill and skip Finder-hidden mounts.</li><li>Power and Disk panes avoid several stale, misleading, or clipped readings.</li></ul>"
},
{
"version": "0.6.3",
"date": "2026-10-02",
"notesHtml": "<p><b>Added</b></p><ul><li>Session rows show project and branch identity with a live state line.</li><li>A rolling session topic built from substantive prompts.</li><li>Per-turn reply cards in each session row.</li><li>A call banner that appears while a call is ringing.</li></ul><p><b>Changed</b></p><ul><li>Call banner wording distinguishes an active ring and keeps missed calls out.</li><li>Call action labels stay on one line, stacking when the row runs out of width.</li><li>Grouped session rows drop the redundant title.</li><li>Idle sessions no longer show leading padding.</li></ul><p><b>Fixed</b></p><ul><li>Call actions press only their own button; &quot;End Call&quot; no longer matches &quot;Send&quot;.</li><li>The last tool stays visible after it finishes.</li><li>Fan spin animation display.</li></ul>"
},
{
"version": "0.6.2",
"date": "2026-09-24",
"notesHtml": "<p><b>Added</b></p><ul><li>Extra brightness in Additional Options spends an XDR panel&#x27;s HDR headroom past the usual maximum, with an intensity slider.</li><li>Mosaic editor for rearranging your panel layout.</li><li>Waveform slot appears for sources without artwork, like Zen and Firefox.</li></ul><p><b>Changed</b></p><ul><li>Call detection wakes on accessibility events instead of polling the window list four times a second.</li><li>Mosaic layout improvements.</li></ul><p><b>Fixed</b></p><ul><li>Monitor speaker controls are verified once and the probe restores the level, so route changes stop stepping a display&#x27;s own volume.</li><li>Call detection keys on bundle ids and call banners, so localized window names no longer hide or fake a ring.</li><li>Battery charging band shows as soon as wall input exceeds draw.</li><li>Volume mixer lists audio players that are no app, like mpv and podcast CLIs.</li><li>Route pickers no longer list the mixer&#x27;s own private devices, so an app&#x27;s output target stops flickering.</li><li>Waveform audio tap follows slot changes during browser playback.</li><li>Charge limits hold exact percents, like 87%, natively on macOS 27.</li><li>Dragging a charge limit under the OS floor asks for the helper; the adapter gate holds the cap otherwise.</li></ul>"
},
{
"version": "0.6.0",
"date": "2026-09-07",
"notesHtml": "<p><b>Added</b></p><ul><li>Volume mixer: per-app volume, mute, and independent output routing.</li><li>Master output, system sounds, and microphone pickers in one panel.</li><li>Network module shows public IP, ISP, ASN, location, gateway, and DNS \u2014 each copyable.</li><li>Network module lists active interfaces, flags VPN as default route, totals bytes since boot.</li><li>Disk panel monitors live read/write throughput, capacity, and SMART health.</li><li>Speed test run button always available; failures report a reason.</li><li>Keep-awake timed and power-based modes with lid-awake pin.</li><li>Now-playing track and source details in the music module.</li></ul><p><b>Changed</b></p><ul><li>Network identity and interface monitoring expanded into a dedicated section.</li><li>Keep-awake improvements for power and timer behavior.</li></ul><p><b>Fixed</b></p><ul><li>Audio route CFString lifetime bug.</li></ul>"
},
{
"version": "0.5.0",
"date": "2026-09-07",
"notesHtml": "<p><b>Added</b></p><ul><li>Agent plugins detected as drifted, with reason and a Repair button.</li><li>Keep Mac awake during agent runs while sessions are active (Advanced settings).</li><li>Release notes card in General settings, plus changelog in update descriptions.</li></ul><p><b>Changed</b></p><ul><li>Charge-limit and fan controls wait until a matching helper build is installed.</li><li>Fans and OS notifications show an Enable-helper option where needed.</li><li>Code was reorganized into clearer folders, with no behavior change.</li></ul><p><b>Fixed</b></p><ul><li>Keep Mac awake during agent runs: Advanced settings holds off idle sleep while any agent is working or waiting on you.</li><li>Settings open reliably from the island gear menu.</li><li>Privileged operations use one installer path with consistent signing; fan control and charge limiting work correctly again.</li><li>Temperature sensor selection sources readings reliably.</li><li>opencode sessions keep the model identity through Stop envelopes.</li></ul>"
},
{
"version": "0.4.1",
"date": "2026-09-06",
"notesHtml": "<p><b>Fixed</b></p><ul><li>Settings not opening from the island gear menu.</li></ul>"
},
{
"version": "0.4.0",
"date": "2026-09-06",
"notesHtml": "<p><b>Added</b></p><ul><li>First-run onboarding: interests, panel shaping, slot choices; replayable from Settings.</li><li>Day modules: tap-to-edit events, calendar-color dots, access gates.</li><li>Power flow and significant-energy sections, charge limit top-up mode.</li><li>Ship DMG installer with appcast; drop the zip.</li><li>Report a bug from the About pane; Sentry crash reporting.</li></ul><p><b>Changed</b></p><ul><li>Agent approvals terminology; island &quot;Collapsed&quot; renamed to &quot;Compact&quot;.</li><li>Bridge endpoint baked into `~/.nook/endpoint` for plugins.</li><li>Plug/charge state read from IOPS (registry keys lag ~30 s).</li><li>License check timeout improved.</li></ul><p><b>Fixed</b></p><ul><li>Call-detection scrim faked rings; nil panel ids crashed Settings unwraps; media-key tap teardown leaked run-loop sources; empty sessions read in-flight; interrupted pi turn sent no last assistant message.</li></ul>"
},
{
"version": "0.3.0",
"date": "2026-09-05",
"notesHtml": "<p><b>Added</b></p><ul><li>Call band: caller photo, live waveform, route pickers, banner suppression.</li><li>Music interception service and battery thermal service.</li><li>Power panel: wall-input wattage, charge limit policy, top-up mode.</li><li>External brightness controls; keyboard system; global slot ordering.</li><li>Report-a-bug About entry; Sentry crash and performance reporting.</li></ul><p><b>Changed</b></p><ul><li>Island sequencing deepened behind IslandSurface; settings unified behind PaneShell.</li><li>Media-key handling: peek stacks for call and media bands.</li></ul><p><b>Fixed</b></p><ul><li>NowPlaying auto-pause for browser sources; battery module; sizing and expansion bugs.</li></ul>"
},
{
"version": "0.2.0",
"date": "2026-08-26",
"notesHtml": "<p><b>Added</b></p><ul><li>Agent session cards: status verbs, slot config sheet, approvals.</li><li>Media, call, power, Day modules; Settings with per-pane cards.</li></ul><p><b>Fixed</b></p><ul><li>Initial public reliability pass.</li></ul>"
}
];