docs/solutions/developer-experience/2026-04-27-monorepo-release-docs-need-index-and-detail-pages.md
Plate's Changesets output is package-granular and typed by package. Copying a single-product release timeline made the overview look nice, but it forced too much package detail into one page and hid minor and patch changes when the docs only extracted ### Major Changes.
The durable version is to use the Version Packages PR body as the docs source and keep /docs/releases as a generated recent feed. The workflow copies the PR description into checked-in release data, so the docs page renders immediately without fetching GitHub at runtime.
/docs/releases needed one-click access to the full release notes without per-package links./docs/releases made the page scale badly as releases accumulate.date is not part of the Doc schema.v53.0.1...v53.0.2 produced empty changelogs for package-only Changesets releases.Generate release docs from the Version Packages PR body:
.github/workflows/release.yml sets changesets/action createGithubReleases: false.changesets/action creates or updates [Release] Version packages, the workflow checks out that PR and runs tooling/scripts/sync-version-package-releases.mjs --pr <number>.tooling/scripts/sync-version-package-releases.mjs parses the PR description's # Releases section, groups package headings by version, and writes apps/www/src/generated/release-index.json.node tooling/scripts/sync-version-package-releases.mjs --latest <count> --from v49 so the docs include every generated release entry from v49 onward without pulling older history.For detailed changes, see CHANGELOG pointing to the Version Packages PR, and stores a preferred package tag for compare links.platejs@version when that package published, otherwise the first package tag in the release PR body.Full changelog links compare the previous generated release's preferred package tag to the current release's preferred package tag.tooling/scripts/release-notes.mjs reads PUBLISHED_PACKAGES, resolves the matching package directories, extracts each package's exact CHANGELOG.md section, and emits deterministic raw notes grouped by package.[#1234] by @user metadata to the end of the sentence..github/prompts/release-notes-rewrite.md lets Claude polish the raw notes, but validation keeps package headings, change-type headings, PR links, changelog links, entry count, and migration notes intact.vX.Y.Z GitHub Release using the validated AI notes or the raw notes.content/releases/index.mdx renders <ReleaseIndex />; the component imports the generated JSON directly.The release-note generator shape is:
## `@platejs/table`
### Major Changes
- [#4941](https://github.com/udecode/plate/pull/4941) by [@zbeyens](https://github.com/zbeyens) – ...
For detailed changes, see [`CHANGELOG`](https://github.com/udecode/plate/blob/<sha>/packages/table/CHANGELOG.md)
The feed answers "what changed recently?" without inventing summaries. Each release row carries all package changes inline, with Better Auth-style fade/expand behavior for long releases and one CHANGELOG link back to the Version Packages PR.
Package-tag compares solve the one-click diff problem without relying on nonexistent repo tags. When platejs is published, the compare uses platejs@version; otherwise it uses the first published package tag for that version.
Checked-in JSON avoids GitHub API latency and Vercel runtime fetch cost entirely. The client component stays inside the existing MDX component registry but renders static data.
pr-analyzer into Plate. Plate's reliable grouping source is each package's Changesets changelog section.vX.Y.Z comparisons for Changesets package releases. Compare package tags instead.