BookNest's last tag is v1.1.0, from Git; since then about two dozen pull requests have merged. The generate-notes endpoint drafts the notes for a future tag from the pull requests merged between two tags, without creating anything:
gh api repos/{owner}/{repo}/releases/generate-notes -f tag_name=v1.2.0 \
-f target_commitish=main -f previous_tag_name=v1.1.0 --jq '.name, .body'v1.2.0 ## What's Changed * Filter books by author by @binarybehemoth in https://github.com/binarybehemoth/booknest/pull/7 ... * Add a webhook receiver and a dev container by @binarybehemoth in https://github.com/binarybehemoth/booknest/pull/31 ## New Contributors * @binarybehemoth made their first contribution in https://github.com/binarybehemoth/booknest/pull/7 **Full Changelog**: https://github.com/binarybehemoth/booknest/compare/v1.1.0...v1.2.0
The body is Markdown for a release page. A .github/release.yml shapes it: changelog.categories groups pull requests by label, and exclude drops labels or authors such as dependabot. gh 29 release create v1.2.0 --generate-notes uses the same engine but also creates the tag, triggering publish-image.yml (Pushing to GHCR), so that release is left to BookNest's maintainers. A workflow on push: tags: [v*] with contents: write can create each release this way, so notes are never written by hand.