Add changelog page - #679
dawn-ducky wants to merge 17 commits into
Conversation
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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.
- The copy button called preventDefault, so the "link still works as a fallback" comment was false: a failed clipboard write did nothing. Let the link navigate, and show a brief "copied" state on success. - Open the targeted entry on hashchange too, not just on first load, so a permalink followed from the same page expands its entry. - Search the version, detail bullets, and command, not only the title and summary. - Put the command's pre and code on one line so the template's indentation does not render as a leading space.
|
Reviewed this. The page structure, the filtering, and the sidebar wiring all look good, and the build is clean (0 errors, 0 warnings). I found a few small issues and pushed the fixes as a55b990:
How I checked: ran |
Head.astro gives every page a <link rel="alternate" type="text/markdown"> pointing at <path>.md, but [...slug].md.ts only builds those for content collection pages. The changelog is a standalone .astro page, so its link pointed at a 404 and Accept: text/markdown on /changelog/ fell back to HTML. - Move the entries, areas, and month grouping to src/data/changelog.ts so the page and the Markdown route read the same data. - Add src/pages/changelog.md.ts, which renders /changelog.md from it. The existing middleware then negotiates /changelog/ to it with no changes. - List /changelog.md under Optional in llms.txt.
|
One more fix, pushed as 3cf311f: the changelog wasn't reachable as Markdown for agents.
How I checked:
|
New used the theme accent, which is gray in Nova, so it looked like the area badge beside it. New is now green and Fixed moves to blue, the usual changelog convention. Light-mode text also darkens to reach 4.5:1 on the tinted pill at this size: New #166534 (6.2:1), Fixed #1d4ed8 (5.6:1), Changed #7e22ce (5.7:1, was 4.4:1), and Deprecated #92400e (6.3:1, was 2.8:1). Dark mode already passed and keeps its shades, with Fixed at #93c5fd (8.7:1).
|
Pushed 3d897b3 to fix the type badge colors. New looked like the area badge. It used Light-mode contrast. These are about 11px bold labels, so they need 4.5:1. Measured against the tinted pill on a white page:
Dark mode already passed. New uses How I checked: |
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Second pass on this, covering the code and the design in a local preview (dark and light).
One blocker before merge: the seeded entry describes a feature that doesn't exist. See the inline comment on src/data/changelog.ts. That one needs you, since it's about what we actually shipped.
Everything else is small. I'm pushing a commit right after this review that fixes the comments marked (fixing):
- Accessible name of the entry toggle
- Title and summary text can't be selected
- Result count not announced
- Find-in-page can't reach collapsed details
- Month grouping depends on array order
- Double border on the command block
- Detail panel has no fill in light mode
- Commands and flags render as plain prose
type="search"andwhite-spaceon the command
The comments marked (suggestion) are design ideas I left for you to decide on. Also, the PR description still says to add entries in src/pages/changelog.astro. Since 3cf311f they live in src/data/changelog.ts.
- Name each entry toggle by its title, and announce the result count. - Toggle from the header with a click handler instead of an overlay, so the title and summary text can be selected. - Use hidden="until-found" so find-in-page reaches collapsed details. - Sort entries by date instead of relying on array order. - Render backticked text in summaries and bullets as inline code. - Remove the inline-code border inside the command block, give the detail panel a fill in light mode, and keep newlines in commands.
The seeded entry described a --rollout flag and CLI 1.7.2, neither of which exist. Replace it with six changes from CLI 1.6.120 to 1.6.123, each checked against the release notes and CLI source. - List the month headings under "On this page". - Show each entry's date, and label the version as the CLI release, with a link to its release notes. - Add an RSS feed at /changelog.xml, linked from the page and its head.
|
Pushed 10ce731. It addresses the rest of my review:
Build is clean (0 errors, 0 warnings, all links valid), and cspell and |
- Put each entry's date and CLI version in a left column, joined by a line with a dot in the change type's color. At narrow widths the date moves above the badges and the line stays on the left. - Show live counts on the area chips, dim chips with no matches for the current search, and hide areas that have no entries yet. - Mark the active chip with aria-pressed and a solid fill. - Replace the permalink text and glyph with a "Copy link" button, and shorten the release notes link. - Keep the chips on one scrolling row on phones.
|
Pushed d73ec70, which redesigns the list as a timeline:
How I checked: |
Each entry is now a Markdown file in src/content/changelog/, named for its permalink: frontmatter for the metadata, then a summary paragraph, a bullet list, and an optional sh code block. Copy _template.md to add one; it documents every field. The build fails with a message naming the file and line when: - a field is missing or malformed (date not YYYY-MM-DD, a "v" on the version, an unknown area or type); - a CLI or Flutter entry has no version (Console, API, and server-side Code Push entries may omit it); - docLink points at a page that doesn't exist, or at a missing heading; - the body has anything besides the summary, bullets, and code block. The page, /changelog.md, and /changelog.xml render the same as before.
|
Pushed 6748c86, which moves each entry into its own Markdown file in The build now fails, with a message naming the file and line, when:
How I checked:
|
- Append the changelog to llms-full.txt after the build, since starlight-llms-txt only covers docs collection pages. - List /changelog.md in ai-catalog.json, agent.json, and agent-instructions.txt, and tell agents to compare an entry's CLI release with `shorebird --version` before suggesting a new flag. - Say the same at the top of /changelog.md, and stop repeating the description there, matching the other Markdown twins.
|
Pushed b44cb67, which makes the changelog discoverable to agents. Before this, agents could only reach it through
How I checked: the build is clean (0 errors, 0 warnings, all links valid). The build log shows the strip hook running before the append. |
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Fresh-eyes pass over the whole PR. The structure holds up. I also confirmed that astro dev picks up entry edits, and recovers from a broken entry once it's fixed, without a restart, so the getEntries() cache isn't a problem.
I found five small issues, all about things an author can write that pass the build but render wrong, plus two edge cases. I'm pushing fixes for all five right after this review.
- Fail the build on an unclosed backtick, a Markdown link, bold text, or a bare <placeholder> in a summary or bullet, and on any Markdown in a title. The page renders only backticks, so these showed up as raw syntax on the page but rendered (or vanished) in /changelog.md. - Require docLink.href to start with "/" or "https://"; a relative href passed the check but resolved against /changelog/ on the page. - Order same-day entries by file name instead of collection order. - When a permalink or month link targets something a filter is hiding, clear the filters so the link goes somewhere. - Build RSS links from `site` in astro.config.mjs.
|
Pushed 55bec5e, which fixes all five items from my review above:
How I checked:
|
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
One more independent review pass. I reproduced or confirmed each finding below before posting.
The main one is about content. I seeded the entries from the GitHub release bodies, but those are auto-generated and incomplete. RELEASE_NOTES.md in shorebirdtech/shorebird is the full record, and it shows that 1.6.123 also shipped Flutter 3.47.5 support and an iOS --split-debug-info fix. I'm adding what's missing for 1.6.120 through 1.6.123: every Flutter version bump, plus the dSYM fix. Future entries should be written from RELEASE_NOTES.md.
I'm pushing fixes for all of these right after this review.
Content, checked against RELEASE_NOTES.md in shorebirdtech/shorebird (the GitHub release bodies are auto-generated and incomplete): - Add Flutter 3.47.2, 3.47.3, and 3.47.5 support, and the iOS --split-debug-info dSYM fix from 1.6.123. - The 1.6.122 updater fix ships in Shorebird's Flutter 3.47.4 engine, not the CLI, and a failed patch falls back to the last installed patch, not the base release; say so. - Describe the changelog without listing areas that have no entries. Code: - Keep command lines as written: strip only a "$ " prompt, never a $VARIABLE, and keep indentation and blank lines. - Draw the "$ " prompt with CSS, so copying a command doesn't copy it, and skip it on lines continuing a backslash. - Reject docLinks to unlisted or draft pages, validate absolute docs.shorebird.dev links, and accept standalone pages like /roadmap/. - Also reject italics, HTML entities, backslash escapes, and bare URLs in entry text, which rendered differently on the page and in .md. - Reject entry file names that collide with a month heading's anchor. - Dim empty filter chips with a dashed border instead of opacity, which dropped their text below 4.5:1 contrast. - Don't let a malformed URL hash stop the page script.
|
Pushed f953188, which fixes every item from the review above. Content
Code
How I checked:
|

Status
READY
Description
Adds
/changelog/, a searchable, filterable feed of what shipped to Code Push, the CLI, and the API. It's aStarlightPagenext toroadmap.astro, linked from the sidebar right below it.Entries sit on a timeline. Each has a type badge (New/Fixed/Changed/Deprecated), an area tag, its date, and the CLI release that shipped it, when there is one. It expands in place to show detail bullets, an optional command, a link to the relevant doc page, a link to the GitHub release notes, and a copyable permalink (
/changelog/#entry-id). Opening the page with a matching#entry-idexpands and scrolls to that entry. Search and the area chips filter the list client-side. The month headings appear under "On this page".Seeded with ten real changes from CLI 1.6.120 to 1.6.123, checked against
RELEASE_NOTES.mdand the CLI source. Write future entries fromRELEASE_NOTES.md, not the GitHub release bodies, which are auto-generated and leave things out.Adding an entry: copy
src/content/changelog/_template.mdto a new file in that folder. The file name becomes the permalink. Fill in the frontmatter, then write a summary paragraph, a bullet list, and an optionalshcode block. The template explains each field. The build checks every entry and fails with afile:linemessage if something is wrong, including adocLinkto a page or heading that doesn't exist.versionis required for CLI and Flutter entries and optional otherwise, since Console, API, and server-side changes don't ship in a CLI release.Also served as:
/changelog.md, the Markdown version for agents, also listed under Optional inllms.txt.Accept: text/markdownon/changelog/negotiates to it./changelog.xml, an RSS 2.0 feed, linked from the page and advertised in its<head>.Design source: https://claude.ai/design/p/8d6abb36-5f0f-4da2-86d9-636e825acb58 ("Docs Changelog.dc.html", option 3a).
Test plan
npm run build(astro check && astro build) passes: 0 errors, 0 warnings, all internal links validchangelog.xmlvalidates withxmllint