From 151fd00e3708031a1e4b79bb786e8adede88e5f3 Mon Sep 17 00:00:00 2001 From: Dawn Parzych Date: Fri, 18 Sep 2026 11:14:04 -0500 Subject: [PATCH 1/6] Add changelog page A searchable, faceted feed of what shipped to Code Push, the CLI, and the API, with expandable entries carrying detail, a command, and a doc link. Seeded with one example entry; add to the ENTRIES array in src/pages/changelog.astro as things ship. Design: https://claude.ai/design/p/8d6abb36-5f0f-4da2-86d9-636e825acb58 Co-Authored-By: Claude Sonnet 5 --- astro.config.mjs | 1 + src/pages/changelog.astro | 589 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 590 insertions(+) create mode 100644 src/pages/changelog.astro diff --git a/astro.config.mjs b/astro.config.mjs index f40ff033..33e73e44 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -120,6 +120,7 @@ export default defineConfig({ items: [{ autogenerate: { directory: 'flutter-concepts' } }], }, { label: 'Roadmap', link: '/roadmap/' }, + { label: 'Changelog', link: '/changelog/' }, ], plugins: [ starlightThemeNova(), diff --git a/src/pages/changelog.astro b/src/pages/changelog.astro new file mode 100644 index 00000000..fe534ef8 --- /dev/null +++ b/src/pages/changelog.astro @@ -0,0 +1,589 @@ +--- +// cspell:words rollouts +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; + +interface ChangelogEntry { + /** Anchor id and permalink slug for this entry. */ + id: string; + date: string; + version: string; + area: string; + type: 'New' | 'Fixed' | 'Changed' | 'Deprecated'; + title: string; + summary: string; + bullets: string[]; + code?: string; + docLink?: { label: string; href: string }; +} + +// Hand-written, newest first. Add an entry here when something ships that a +// developer integrating Code Push would want to know about. +const ENTRIES: ChangelogEntry[] = [ + { + id: 'staged-rollouts-in-one-command', + date: '2026-09-10', + version: '1.7.2', + area: 'Code Push', + type: 'New', + title: 'Staged rollouts in one command', + summary: + 'shorebird patch --track=beta now takes --rollout, so a staged patch can start at 5% without a second command.', + bullets: [ + '--rollout takes a whole percentage from 1 to 100. Omit it and the patch goes to the entire track, exactly as before.', + 'Raise or halt a rollout from the console, or with shorebird patch rollout set 25.', + 'Rollback still applies to the whole track — halting a rollout leaves the previous patch installed.', + ], + code: 'shorebird patch android --track=beta --rollout=5', + docLink: { + label: 'Percentage-based rollouts', + href: '/code-push/guides/percentage-based-rollouts/', + }, + }, +]; + +const TYPE_LABEL_COLOR: Record = { + New: 'new', + Fixed: 'fixed', + Changed: 'changed', + Deprecated: 'deprecated', +}; + +function formatMonth(iso: string): string { + return new Date(iso).toLocaleDateString('en-US', { + month: 'long', + year: 'numeric', + timeZone: 'UTC', + }); +} + +const areas = [...new Set(ENTRIES.map((e) => e.area))].sort(); + +const groups: { label: string; items: ChangelogEntry[] }[] = []; +for (const e of ENTRIES) { + const label = formatMonth(e.date); + let group = groups.find((g) => g.label === label); + if (!group) groups.push((group = { label, items: [] })); + group.items.push(e); +} +--- + + +

+ Everything we shipped to Code Push, the CLI, and the API. Expand an entry + for the full detail, the command, and the doc it belongs to. +

+ +
+ +
+ + { + areas.map((a) => ( + + )) + } +
+ + {ENTRIES.length} {ENTRIES.length === 1 ? 'entry' : 'entries'} + +
+ +
+ { + groups.map((group) => ( +
+

{group.label}

+ {group.items.map((e) => { + const searchText = `${e.title} ${e.summary} ${e.area} ${e.type}`.toLowerCase(); + return ( +
+ +

{e.title}

+

{e.summary}

+ +
+ ); + })} +
+ )) + } +
+ + +
+ + + + From 68b829a6d924193ec9c492ae538813198417a1dd Mon Sep 17 00:00:00 2001 From: Dawn Parzych Date: Fri, 18 Sep 2026 11:25:09 -0500 Subject: [PATCH 2/6] Fix changelog area to a closed set Area was a free string derived from whichever entries existed; fix it to the five actual areas (Code Push, CLI, Console, API, Flutter) so the filter chips are stable regardless of what's in ENTRIES. Co-Authored-By: Claude Sonnet 5 --- src/pages/changelog.astro | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pages/changelog.astro b/src/pages/changelog.astro index fe534ef8..a2c08b7a 100644 --- a/src/pages/changelog.astro +++ b/src/pages/changelog.astro @@ -2,12 +2,18 @@ // cspell:words rollouts import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; +// The parts of Shorebird a change can be filed under. Fixed on purpose — +// this drives the area filter chips, so it should stay in sync with the +// products we actually ship rather than growing a new value per entry. +const AREAS = ['Code Push', 'CLI', 'Console', 'API', 'Flutter'] as const; +type Area = (typeof AREAS)[number]; + interface ChangelogEntry { /** Anchor id and permalink slug for this entry. */ id: string; date: string; version: string; - area: string; + area: Area; type: 'New' | 'Fixed' | 'Changed' | 'Deprecated'; title: string; summary: string; @@ -56,8 +62,6 @@ function formatMonth(iso: string): string { }); } -const areas = [...new Set(ENTRIES.map((e) => e.area))].sort(); - const groups: { label: string; items: ChangelogEntry[] }[] = []; for (const e of ENTRIES) { const label = formatMonth(e.date); @@ -112,7 +116,7 @@ for (const e of ENTRIES) { >All { - areas.map((a) => ( + AREAS.map((a) => ( From ae97ac86ddff243a58e26fc06125ea85a2a043bd Mon Sep 17 00:00:00 2001 From: Mac Carrithers Date: Fri, 18 Sep 2026 12:00:53 -0600 Subject: [PATCH 3/6] Make changelog entry headers clickable and align the filter chips The toolbar opts out of Starlight's markdown sibling spacing, which was pushing every chip after "All" down by 1rem. The expand toggle keeps its button on the badge row, but a stretched ::after covers the whole header so the title and summary toggle the entry too. Links inside the header sit above the overlay. The "+" text glyph is replaced with an SVG so it centers in a larger bubble, and the vertical stroke hides when the entry is open. --- src/pages/changelog.astro | 137 ++++++++++++++++++++++++++------------ 1 file changed, 95 insertions(+), 42 deletions(-) diff --git a/src/pages/changelog.astro b/src/pages/changelog.astro index a2c08b7a..cf568130 100644 --- a/src/pages/changelog.astro +++ b/src/pages/changelog.astro @@ -1,5 +1,6 @@ --- // cspell:words rollouts +// cspell:ignore data-type white-space import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; // The parts of Shorebird a change can be filed under. Fixed on purpose — @@ -82,7 +83,7 @@ for (const e of ENTRIES) { for the full detail, the command, and the doc it belongs to.

-
+
@@ -134,7 +132,8 @@ for (const e of ENTRIES) {

{group.label}

{group.items.map((e) => { - const searchText = `${e.title} ${e.summary} ${e.area} ${e.type}`.toLowerCase(); + const searchText = + `${e.title} ${e.summary} ${e.area} ${e.type}`.toLowerCase(); return (
- -

{e.title}

-

{e.summary}

+ + {e.type} + + {e.area} + {e.version} + + +

{e.title}

+

{e.summary}

+