diff --git a/src/routes/nook/changelog.tsx b/src/routes/nook/changelog.tsx
index 4dd4867..9ee190e 100644
--- a/src/routes/nook/changelog.tsx
+++ b/src/routes/nook/changelog.tsx
@@ -5,8 +5,13 @@
* launch, so this page renders exactly what Sparkle publishes: one source
* of truth, no second place to write release notes. Doubles as the raw
* material for the release-announcement job (marketing/README.md).
+ *
+ * Layout: the version list lives in a fixed-height vertical scroller, so
+ * expanding a release never shifts the page — history is browsed inside
+ * the panel. Rows collapse to their header; notes stay in the DOM
+ * (visibility toggled, not unmounted) so crawlers still see every entry.
*/
-import { For, Show } from "solid-js";
+import { For, Show, createSignal } from "solid-js";
import { query, createAsync } from "@solidjs/router";
import { PageHead } from "~/components/PageHead";
import { EdgeCacheHeaders } from "~/components/EdgeCacheHeaders";
@@ -20,6 +25,11 @@ const getReleases = query(async () => {
export default function NookChangelogPage() {
const releases = createAsync(() => getReleases());
+ // Newest release starts open; every other row starts collapsed.
+ const [openVersion, setOpenVersion] = createSignal