DEV Community

Cover image for I built an open source CLI that writes release notes from your merged PRs
Berat Bozkurt
Berat Bozkurt

Posted on

I built an open source CLI that writes release notes from your merged PRs

The problem

After every release, someone on the team has to:

  1. Go through 30+ merged PRs
  2. Filter out the noise — dependency bumps, CI fixes, internal refactors
  3. Rewrite technical titles into something a non-engineer can understand
  4. 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
Enter fullscreen mode Exit fullscreen mode

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

  1. GitHub OAuth device flowreleasehub auth login opens a browser, no manual token setup
  2. PR ingestion — fetches all merged PRs between two tags, including body and linked issues
  3. 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
  4. 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 }}
Enter fullscreen mode Exit fullscreen mode

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)