Repository navigation
Add changelog page - #679
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.
- Add Flutter 3.47.6 and the DEX dependency report from CLI 1.6.124. - Add Console and API changes since August 28: the account Plan page, free size analysis, protected built-in channels, Change Track on superseded patches, the sidebar and searchable app list, the invite role picker, retired legacy login tokens, API rate limit headers, and idle-based session expiry. - Point the rollback, apps, channels, and dSYM entries at the CLI and Dart symbols sections added by #698 and #702. - Link release notes to RELEASE_NOTES.md at the release tag, since the GitHub release body is generated from PRs and leaves out Flutter bumps.
- Sessions: the 30-day idle limit already existed; only the 90-day cap was removed. - Size analysis: don't promise a breakdown for every release. - App list: search already existed; filtering, sorting, and paging are new. - Invite role: roles come from the plan; drop the copy-link bullet. - Rate limits: they're counted per server instance, so don't imply a global remaining quota. - Add the organization ownership view to the Plan page entry, and an entry for the plan level in shorebird account whoami (1.6.121). - api-keys: say login:ci tokens stopped working on October 1, 2026, matching the server and the changelog entry that links there.
|
Pushed 1911814 and fc0f02e, which bring the changelog up to date through October 6. It now has 22 entries, up from 10. New entries
Console and API entries are dated by the day the change merged to main. Other fixes
Left out
How I checked
|
Write entries from RELEASE_NOTES.md at each tag, checked against the CLI source: release and patch JSON output, OAuth login changes, device-code login, cache pruning, Flutter 3.47.7, the macOS re-signed app fix, and the 1.6.127 and 1.6.128 fixes. Add API entries for personal access token limits and the duplicate app list fix. Update api-keys.mdx: full-access keys can't delete the account, change billing limits, or manage sessions and keys, and login:ci has been replaced by API keys.
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Brought this up to date with main and added what shipped since the entries were seeded (0780a7f).
New CLI entries, written from RELEASE_NOTES.md at each tag and checked against the CLI source at that tag:
- 1.6.125: release and patch
--json, OAuth with PKCE plus logout revocation, the app extension version warning, obfuscated Android patches on Flutter older than 3.41.2, and errors that name the next step. - 1.6.126: Flutter 3.47.7, browser and device-code login, cache pruning with
cache clean --unused, and iOS preview logs. The login entry notes the 1.6.126 crash that 1.6.127 fixed. - 1.6.127: Linux patch checks and build arguments, plus the login, doctor, and set-track crash fixes.
- 1.6.128: the macOS re-signed app fix,
--public-key-cmdfor patches, unknown flavors, clearing the build output,precondition_failed, set-track on the same track,preview --flavor, refusing to delete built-in tracks, hidingpatches promote, and one entry for the remaining fixes.
The macOS fix needed both the CLI diff change in 1.6.126 (#3965) and the engine change in 1.6.128's Flutter pin (flutter#172). It only works on 1.6.128, so it has one entry there and none in 1.6.126. Nothing from shorebird#4055 is included, since no release has it yet.
API entries from _shorebird:
- Personal access tokens can no longer delete the account, change billing limits, or manage sessions and keys (#3361, #3364, #3383).
GET /api/v1/appsno longer lists an app twice (#3332).
api-keys.mdx:
- The Full access bullet said the key "has the same permissions as your account". That stopped being true with the token limits, so it now lists the exceptions, using the Console's wording.
- The
login:cisection now says the command was replaced, since 1.6.125 only prints a pointer to API keys.
npm run build reports 0 errors and valid links. cspell, Vale, and Prettier are clean on the changed files.
Correct claims a re-read found overstated: the server already refused deleting built-in tracks, rollback and rollforward already reported changed, and only deleting the account or changing billing limits returns personal_access_token_forbidden. Clarify the credentials, flavored macOS, Linux patch, and --public-key-cmd bullets.
There was a problem hiding this comment.
Second pass over the new entries from the rendered /changelog.md (97ec40d, wording only):
- Built-in tracks: the server has refused deleting them since September 1, so "which always refused them" is now "which already refuses them".
changedin JSON:rollbackandrollforwardalready reportedchangedbefore 1.6.128. The bullet now saysset-trackgained it.- Token limits: only deleting the account or changing billing limits returns
personal_access_token_forbidden. Session and key management are checked by the auth service, so the bullet no longer claims that code for them. The title now names the two limits. - 1.6.128 fixes: split the credentials bullet. The change is that rate limits and other auth refusals no longer count as logged out. Also noted that the flavored macOS fix applies when
--release-versionisn't passed. - Other clarifications: the Linux patch,
--public-key-cmd(it also runs once perreleasenow),cache clean --unused, and thepromotetitle.
Build, cspell, Vale, and Prettier are clean.
set-track's canonical flags are now --release-version and --patch-number, init takes --org-id, and blank names are rejected everywhere. The old names remain as hidden aliases. This shipped in 1.6.128 but isn't in its RELEASE_NOTES.md section, so it was found in the CLI source (#4045).
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Third pass: checked every 1.6.125 to 1.6.128 release-note bullet against the entries, and checked the older entries against what changed since.
- debbb15: added an entry for the 1.6.128 flag renames from shorebird#4045.
set-tracknow takes--release-versionand--patch-number,inittakes--org-id, and blank names are rejected. The old names still work as hidden aliases. This isn't in the 1.6.128 section ofRELEASE_NOTES.md, so I found it in the source. The PR description now says to skim each release's commits too, and gives the new seed range (46 entries, through October 11). - c47fb3a: the 1.6.127 patch number fix also covers
patches promote, as the release notes say.
The older apps, channels, and rollback entries still match the CLI.
Separately, and not part of this PR: tracks.mdx and initialize.mdx still show the old set-track and init flag names. Those still work, but the pages should move to the new names in a follow-up.
Narrow claims that overstated what shipped (JSON hints, API key limits, blank-name checks, Linux patch checks), move the organization plan badges to their own 2026-09-17 entry, add entries for the 1.6.120 layered icon fix and the 1.6.121 missing libapp.so error, document preview --flavor, point docLinks at pages that match, and remove em-dashes from api-keys.
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Fix round pushed in 19623c4. Each change was checked against the CLI tags, RELEASE_NOTES.md, or _shorebird.
Corrections:
cli-errors-name-next-step: the--jsonhint only applies to thepatch --forceadvice (the unknown-option path in the runner). Other errors in 1.6.125 go throughProcessExit, which writes no hint.personal-access-token-limits: dropped "manage your sessions and API keys". The auth service only ever accepted session tokens for those endpoints, so keys never had that ability. Also capitalized "Console".console-plan-page: moved the "Owned by you / Member of" bullet out. It shipped on 2026-09-17 (_shorebird#3101) and now has its own entry,console-whose-plan.apps-listed-once: addedshorebird account apps, whichshorebird apps listextends.linux-patches-match-releases: Linux has no doctor validators, so this now lists the real checks (logged in, project initialized, Linux host), the same onesshorebird release linuxruns.consistent-flag-names: the blank-name check now names the commands that actually got it (init,channels create, and--trackonpatchandpatches set-track).apps renamealready rejected blank names in 1.6.127, so it's mentioned as prior behavior, not as new.json-precondition-failed: the hint is optional, so the text now says "when there's a known fix". Removed the docLink because the scripting page on main contradicts this entry until #714 lands.patches-promote-hidden: the docLink now goes to/code-push/patch/#set-patch-trackinstead of the tracks page, which starts with the deprecatedpromote.agent-instructions.txt: changelog line no longer says every entry has a CLI release. Console and API entries don't.
Additions:
preview.mdx: added a--flavorrow to the options table, using the help text fromapp_scoped_command.dartat v1.6.128.apple-layered-icons-asset-changes(1.6.120, #3899).AppleArchiveDiffercovers iOS, iOS framework, and macOS patches.android-missing-libapp(1.6.121, #3826): release and patch android now explain a bundle with nolibapp.so, and a patch that skips some of the release's architectures warns about it.cli-fixes-1-6-128: added the INTERNET permission check fix (#4035).- No entry for the 1.6.121
--shorebird-traceitem. It's an internal flag the CLI passes toflutter buildfor build-trace telemetry, so users don't see it.
Cleanup: removed the em-dashes in api-keys.mdx.
Checks: astro check 0 errors, build passes link validation, and cspell, vale, and prettier are clean on the changed files.
Correct the API key, Flutter 3.47.2 to 3.47.4, flag-name, and obfuscation entries; add the remaining CLI 1.6.121 fixes; drop the JSON output doc link; update the whoami example, login section, and API key permission label.
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Fix round pushed in c5dc9e1. Each change was checked against the CLI tags, _shorebird, and the upstream Flutter and Dart changelogs.
release-patch-json: removed the docLink to/code-push/ci/scripting/#json-output, which contradicts this entry until docs#714 lands (same call asjson-precondition-failed).account/cli.mdx: the whoami example now matches v1.6.128whoami_command.dart(addsSubscription:,Plan: pro), with the sentence after it updated. The Login section now describes the browser login, the printed fallback URL, the automatic code login over SSH, in CI, or on Linux without a display, and--device.personal-access-token-limits: retitled "API keys hold exactly their permission level". Keys were already refused account deletion (#1859) and overage changes (#2506), so only the error code is new (#3361). Full access keys gained audit logs and invitations (#3363). The summary also names sessions and API keys, which no key can manage, to match the Console andapi-keys.mdx. The date stays 2026-10-10: the release-and-patch restriction (#3364) reached prod in the Deploy All run on that day, and the template dates API entries by the day they went live.flutter-3-47-4: the Device Support Symbols bullet now describes the Xcode 27 white-screen hang (flutter#189284). The Windows bullet now says blocked binaries give an actionable error instead of a crash (flutter#191899).flutter-3-47-2: hot reload ignored edits made within the same second (flutter#191198).flutter-3-47-3: the Dart 3.13.3 fix covers Windows-to-Linux cross-compilation with build hooks, and the PowerVR fix is Android only (flutter#181315).consistent-flag-names: init, channels create, and set-track already rejected empty names, so only whitespace-only rejection is new for them.patch --trackhad no check before, so it now also rejects an empty, whitespace-only, or over-128-character name (shorebird#4045).android-obfuscated-patches-older-flutter: the release check is iOS only (patchesLinkAgainstRelease), so the bullet now namesrelease iosandrelease ios-framework.- New
cli-fixes-1-6-121: asset catalog toolchain versions (#3915), the legacyflutter.jarhint (#3820), the pubspec comment on init (#3911), signing-flag errors (#3923), and iOS patcher errors (#3926). The signing bullet says the errors now name the flag. They already exited with a usage error, and the both-flags case already named both flags, so the examples are the cases that changed. api-keys.mdx: the label is now "Release and patch only", as in the Console, and the plan line says "Available on paid plans" (apiKeyPermissionsis on Pro, Business, and Enterprise).apps-listed-once: not changed. The MCP server'slist_appsalso callsGET /api/v1/apps, but the MCP server is documented only on the unlisted Zap page, so naming it here would surface it publicly.- The PR description now says 50 entries and that server-side entries are dated by the day they went live.
Build: 0 errors, all internal links valid. cspell, vale, and prettier pass on the changed files.
Reword the 1.6.122 patch check entry: the check moved to after the booted patch loads, which fixes attribution and first-boot retirement; a failed load already got a check on the same launch. Drop the login:ci line from 1.6.125 (unchanged since 1.6.100), count four commands in 1.6.127, scope the 1.6.128 Ctrl-C fix to iOS 16 and earlier, and narrow the old Change Track condition. Date Console and API entries by their first production deploy in US Pacific time, which moves four Console entries and the app list fix, and state that rule in the template. Tell template users to delete all three docLink lines, since a bare docLink fails the schema.
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Fix round in 095a5a1, each item checked against source:
-
failed-patch-checks-for-replacement.md: retitled and reworded as suggested. The 1.6.121 engine (ee0ddce, flutter_release/3.47.3) already started the update thread inConfigureShorebird, before any patch loaded. #164 (65e9873c5) and #166 (caee19377) both land between ee0ddce and 72bc686 (the 1.6.122 pin, head of flutter_release/3.47.4), so no CLI release shipped the suppression. 3.47.5 to 3.47.7 still start the thread fromMaybeStartUpdateThread. Theauto_update: falsesentence holds because the start is still gated onShouldAutoUpdate(). File name and docLink are unchanged. -
login-oauth-pkce.md: dropped thelogin:cibullet.login_ci_command.dartis unchanged between v1.6.124 and v1.6.125 and has pointed to API keys since #3775 (first in v1.6.100).api-keys.mdxdoesn't tie that change to 1.6.125, so I left it alone. -
cli-crash-fixes-1-6-127.md: "Four commands". #3982 touched bothset_track_command.dartandpromote_command.dart. -
Dates now follow the first successful "Deploy All to Prod" run that contains the commit, as a US Pacific day. CLI entries already use Pacific: 1.6.125 was published 10-09T01:55Z and is dated 10-08. Changes:
console-plan-page09-10 (2305b62d3; the whole billing stack, from c08d43716 to 76fde9db5, first shipped there)console-change-track-superseded-patch09-23 (8031a1b49)console-app-listandconsole-invite-role09-24 (468d0fa2a)apps-listed-once10-06 to 10-09. 75c9e96db merged on 10-06, but the next prod deploy after ac2e74c7e was 8d6e3d82e on 10-09.
These already matched: default channels 09-01 (deployed 09-01 22:49 PDT), size analysis 09-02, whose plan 09-17, rate limits 10-04 (19:04 PDT), sessions 10-05 (auth deployed 19:49 PDT), and token limits 10-10 (#3364).
legacy-login-tokens-retiredstays 10-01: the cutoff isDateTime.utc(2026, 10)and that is the announced date. The template now states this rule, and the PR description is updated to match. -
console-change-track-superseded-patch.md: the suggested wording was still a bit off. The oldcanEditPatchwas also true for a rolled-back patch newer than the served one. Changed it to "hidden on any patch with a newer patch on its track that wasn't rolled back", which is exactly whencanEditPatchreturned false. -
cli-fixes-1-6-128.md: applied as suggested. #4034 only changedios_deploy.dart, andpreviewfalls back to ios-deploy only for devices that devicectl doesn't handle (iOS 16 and earlier). -
_template.md: the comment now says to delete all three docLink lines. A scratch entry with a baredocLink:failed the content schema. A copy of the template with all three lines deleted built and published. The scratch entry is removed. The template also now states the US Pacific dating rule.
Build: 0 errors, 0 warnings, all internal links valid. cspell and prettier are clean on the changed files.
Narrow the logout, rate limit, and Android libapp.so claims to what the CLI and server do, note --flutter-version for the macOS re-sign fix, add the resumable Flutter install and ios-framework release prompt fixes, and replace the stale login:ci deprecation note in the CI authentication snippet. Merges origin/main.
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Fix round in 2d1f3aa (merged origin/main first, including #716). Each change was checked against the CLI tags, the private monorepo, and the Flutter fork.
login-oauth-pkce.md: logout has revoked the server session since CLI 1.6.90 (shorebird#3653). 1.6.125 moved it to the standard revocation endpoint and added a warning when the server can't confirm the revocation. The summary now says that, and the title is now "More secure CLI sign-in".api-rate-limits.md: only code_push_server has the rate limit guard. Prod routes/api/v1/patches/*to code_push_updater_server, which has none. Changed "Every API response" to "API responses" and added "Patch checks from your app aren't rate limited."android-missing-libapp.md: in 1.6.120 only the release error pointed at ABI filters. The patch error didn't. The bullet now says so.macos-patches-resigned-apps.md: the fix is only in the engine pinned by 1.6.128 (flutter#172,shorebird/devonly), and the patcher falls back to whole-binary diffs without it. The caveat now mentions an older--flutter-version.ci/_authentication.mdx:login:ciwas replaced by API keys in 1.6.100 (shorebird#3775), and its tokens stopped working on October 1, 2026 (server returnslegacy_auth_retired). The tip now says this, matching/account/api-keys/. Also replaced the two em-dashes in that file.cli-fixes-1-6-121.md: added the resumable Flutter install fix (shorebird#3901, first in v1.6.121).cli-fixes-1-6-128.md: added thepatch ios-frameworkrelease prompt (shorebird#4033, first in v1.6.128). It used to hard-error without--release-version, and now prompts through the same shared path as the other platforms.- PR description: now mentions the
_authentication.mdxchange.
Build passes with 0 errors and all internal links valid. cspell, Prettier, and Vale are clean on the changed files.
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Fifth fresh review at 2d1f3aa found two small issues. Both are fixed in the latest commit:
- Missing entry: the Console's "Copy invitation link" button (
_shorebird#3104) shipped with no entry. Addedconsole-copy-invitation-link.md, dated 2026-09-21: that's the first prod deploy containing it (e33e669a4), counted as a US Pacific day like the other Console entries. The text matchescopy-invitation-link-button.tsx: only the invited address can accept the link, after signing in with it. - PR description: it named only one of the four docs pages this PR edits. It now lists
api-keys.mdx,_authentication.mdx,cli.mdxandpreview.mdx, and the entry count is 51.
Build: 0 errors in astro check, all internal links valid, and the new entry renders on /changelog/, /changelog.md and /changelog.xml.
AbhishekDoshi26
left a comment
There was a problem hiding this comment.
Round 6 fresh review at 484ce84 found no problems in the page, entries, template, agent files or docs edits. Its two findings were in the PR description: the build error format was overstated, and the agent-discovery changes weren't listed. Both are fixed. All 51 entries are checked against the CLI source and RELEASE_NOTES.md at each tag, the engine pins, _shorebird and its prod deploys, and the upstream Flutter and Dart changelogs. Every docLink exists and doesn't contradict its entry. Build: 0 errors in astro check, all internal links valid, and /changelog.md and the RSS feed each have 51 items (feed passes xmllint). CI is green.

Dependencies
Status
READY
Description
Adds
/changelog/, a searchable, filterable feed of what shipped to Code Push, the CLI, the Console, 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 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 51 real changes from August 28 to October 11, 2026: CLI 1.6.120 to 1.6.128, checked against
RELEASE_NOTES.mdand the CLI source, plus Console and API changes from the private monorepo. Write future CLI entries fromRELEASE_NOTES.md, not the GitHub release bodies, which are auto-generated and leave things out. Also skim the release's commits: the 1.6.128 notes don't mention its flag renames (shorebird#4045). For the same reason, each entry's "Release notes" link opensRELEASE_NOTES.mdat that release's tag. Console, API, and server-side entries have no version, and are dated by the first production deploy that included the change (the "Deploy All to Prod" run), which can be days after it merged. All dates, CLI releases included, are in US Pacific time, and a change that took effect on an announced date, like the October 1 legacy token cutoff, uses that date.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 a message naming the entry if something is wrong, including adocLinkto a page or heading that doesn't exist. Problems in the body also give the line, asfile:line.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>.llms-full.txtby a build hook inastro.config.mjs, sincestarlight-llms-txtleaves standalone pages out.public/.well-known/: achangeloglink inagent.json, an entry inai-catalog.json, and item 4 inagent-instructions.txt, which tells agents to compare an entry's CLI release withshorebird --version.public/_headersserves/changelog.xmlasapplication/rss+xml.Also updates the docs pages that changelog entries link to, so they match what shipped:
src/content/docs/account/api-keys.mdx: full access keys can't delete the account, change billing limits, or manage sessions and API keys. The second level is now "Release and patch only", available on paid plans.shorebird login:ciwas replaced by API keys, and its tokens stopped working on October 1, 2026.src/content/docs/code-push/ci/_authentication.mdx, the CI authentication snippet shared by the CI guides, which changelog entries reach through/account/api-keys/. It saidshorebird login:ciwas deprecated and its tokens would work until September 2026. It now matches/account/api-keys/.src/content/docs/account/cli.mdx: the Login section describes the browser login, the printed URL, the code login when no browser can open, and--device. The whoami example matches CLI 1.6.128.src/content/docs/code-push/preview.mdx: adds the--flavoroption.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