release-please generates the changelog and GitHub release notes as a flat, grouped list of commit subjects (Features / Bug Fixes, each with a commit hash and link). It is an accurate record but dry — a busy release is dozens of raw bullets with no summary or emphasis.
This matters more than usual because the release notes are surfaced in two user-facing places: the GitHub Releases page, and the in-app update dialog. The desktop shell's latest-json job copies the GitHub release body into latest.json's notes field, and the updater dialog renders that markdown. So nicer release notes directly improve the update experience, not just the releases page.
Goal
Produce polished, human-friendly release notes (a short prose summary plus themed highlights) for the GitHub release body, while keeping CHANGELOG.md as the deterministic, commit-derived record. release-please owns CHANGELOG.md and it should stay reproducible — do not AI-rewrite it.
Approach options
- A small inline step in
.github/workflows/release.yml that takes the commit range for the release, calls an LLM (the project already has OpenRouter/Claude access), and sets the polished text as the release body (e.g. gh release edit --notes). Most control, reuses existing model access, runs in a guaranteed order. - An off-the-shelf OSS action such as
AndreaBonn/ai-changelog-generator (Apache-2.0, writes the release body, supports Claude/OpenAI/Gemini/Groq). If used, pin it to a reviewed commit SHA rather than a floating tag — it is currently unproven (single release, no stars). - Non-AI alternative:
git-cliff templates for a prettier deterministic list, with no API cost or variability.
Requirements and gotchas
- Update the release body before the
latest-json job reads it, or the dialog shows the raw list while the releases page shows the polished one. An inline step sequenced ahead of latest-json avoids the race a separate release: published trigger would have. - Needs an LLM API key as an Actions secret.
- Constrain the model to summarize and reorganize the actual commits — it must not invent changes. Consider drafting the notes into the release PR so they can be reviewed before publishing.
- Fail open: if the key is missing or the call errors, fall back to release-please's raw notes so a release is never blocked.
release-please generates the changelog and GitHub release notes as a flat, grouped list of commit subjects (Features / Bug Fixes, each with a commit hash and link). It is an accurate record but dry — a busy release is dozens of raw bullets with no summary or emphasis.
This matters more than usual because the release notes are surfaced in two user-facing places: the GitHub Releases page, and the in-app update dialog. The desktop shell's
latest-jsonjob copies the GitHub release body intolatest.json'snotesfield, and the updater dialog renders that markdown. So nicer release notes directly improve the update experience, not just the releases page.Goal
Produce polished, human-friendly release notes (a short prose summary plus themed highlights) for the GitHub release body, while keeping
CHANGELOG.mdas the deterministic, commit-derived record. release-please ownsCHANGELOG.mdand it should stay reproducible — do not AI-rewrite it.Approach options
.github/workflows/release.ymlthat takes the commit range for the release, calls an LLM (the project already has OpenRouter/Claude access), and sets the polished text as the release body (e.g.gh release edit --notes). Most control, reuses existing model access, runs in a guaranteed order.AndreaBonn/ai-changelog-generator(Apache-2.0, writes the release body, supports Claude/OpenAI/Gemini/Groq). If used, pin it to a reviewed commit SHA rather than a floating tag — it is currently unproven (single release, no stars).git-clifftemplates for a prettier deterministic list, with no API cost or variability.Requirements and gotchas
latest-jsonjob reads it, or the dialog shows the raw list while the releases page shows the polished one. An inline step sequenced ahead oflatest-jsonavoids the race a separaterelease: publishedtrigger would have.