Publish a changelog entry from every GitHub release
Release notes already get written once, in the GitHub release. A changelog that is a second copy of them goes stale within a month. This makes the release the source and the changelog a consequence of it.
How do I turn GitHub releases into a public changelog automatically?
Add the nordvadev/changelog-action step to a workflow that runs on release: published. Each release's notes become an entry on your hosted changelog at launch.nordva.dev/log/<slug>, in the embeddable widget and in the RSS, Atom and JSON feeds, and subscribers get the email if you ask for it. The release id is the idempotency key, so a re-run never duplicates an entry.
01Create a secret key
Under Dashboard → API keys, create a secret key and add it to the repository as the secret NORDVA_SECRET_KEY. Or run npx nordva@latest init in the repository, which creates the project and keys and writes them to your env file.
02Add the workflow
One step, no checkout needed. Drafts publish nothing, pre-releases are skipped unless you set skip_prereleases to false, and the category is optional.
# .github/workflows/changelog.yml
name: Changelog
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: nordvadev/changelog-action@v1
with:
api_key: ${{ secrets.NORDVA_SECRET_KEY }}
# category: feature # feature, improvement, fix, security, breaking
# notify_subscribers: true # email the changelog subscribers 03Show it somewhere
The hosted page exists already at launch.nordva.dev/log/<your-slug>, with the three feeds advertised in its head. For your own site, the script-tag widget renders the same entries, and the public JSON endpoint needs no key if you would rather render them yourself.
<script src="https://cdn.nordva.dev/v1/changelog.js" data-key="nv_pub_live_…" async></script> 04Let the agent write the notes
With the MCP server connected, the draft_changelog_from_commits prompt has Claude Code or Cursor read the git log since the last published entry and draft the release notes in the tone of the earlier ones. Paste them into the GitHub release, publish, and the action does the rest.
Questions
What if I edit the release afterwards?
The action runs on the published event only. Edit the entry in the dashboard, over PATCH /v1/changelog/entries/<id>, or ask an agent to update_changelog_entry. A future run for the same release is ignored because the idempotency key matches.
Can I schedule the entry instead of publishing at once?
Not from the action; it publishes when the release is published. Schedule from the API or the dashboard by creating the entry with a scheduled_at, and the minute cron publishes it.
Does it work with GitLab or Bitbucket?
The action is GitHub only. Elsewhere, call POST /v1/changelog/entries from CI with an Idempotency-Key of the tag name; the request body is a title and Markdown.