The problem
After every release, someone on the team has to:
- Go through 30+ merged PRs
- Filter out the noise — dependency bumps, CI fixes, internal refactors
- Rewrite technical titles into something a non-engineer can understand
- Format it for GitHub, the changelog, and Slack separately
That "someone" was usually me. And every time it felt like work that shouldn't exist — the information is already in the PRs.
What I built
ReleaseHub is an open source CLI that automates this entire flow.
npm install -g @releasehub/cli
releasehub auth login
releasehub ai add-key
releasehub generate --from v1.0.0 --to v1.1.0
It fetches your merged PRs between two tags via GitHub API, reads the PR titles, bodies, and labels, classifies each one (feature / improvement / bugfix / breaking / internal), filters out the noise, rewrites the rest into plain language using AI, and outputs whichever format you need.
Why not just use GitHub's built-in release notes?
GitHub generates a PR list. That's useful, but it doesn't:
- Understand that "fix token refresh race condition" means "users were getting logged out"
- Hide internal changes from customer-facing notes
- Write a Slack message for the team
- Produce a Keep a Changelog entry
ReleaseHub does all of that from a single command.
How it works under the hood
-
GitHub OAuth device flow —
releasehub auth loginopens a browser, no manual token setup - PR ingestion — fetches all merged PRs between two tags, including body and linked issues
- AI classification — sends PRs in batches of 20, each gets tagged as feature / improvement / bugfix / breaking / internal. For vague PR titles it reads the body and linked issues — when still uncertain, it errs toward "internal" and filters it out
-
Output generation — three formats:
github-release,changelog,slack
No server, no database. Just your terminal, your GitHub token, and your own AI key (Anthropic or OpenAI).
CI/CD integration
There's a --quiet flag for pipeline use and a --publish flag to create the GitHub Release directly:
- name: Generate release notes
run: |
npx @releasehub/cli generate \
--from ${{ steps.prev_tag.outputs.tag }} \
--to ${{ github.ref_name }} \
--format github-release \
--publish \
--quiet
env:
RELEASEHUB_GITHUB_TOKEN: ${{ secrets.RELEASEHUB_GITHUB_TOKEN }}
RELEASEHUB_ANTHROPIC_KEY: ${{ secrets.RELEASEHUB_ANTHROPIC_KEY }}
What's next
The CLI is the foundation. The roadmap includes a cloud version with a UI, shared team history, and webhook support for automatic generation on every tag push.
GitHub: https://github.com/berat/releasehub
Docs: https://berat.app/releasehub/docs
Curious how others handle release communication — do you write notes manually, or do you have something automated?
Top comments (0)