← Blog  ·  September 2026

Stop Writing Changelogs by Hand: How to Auto-Generate Release Notes from Git Commits

You shipped the release. CHANGELOG.md still says "v1.3.0 — June." Users are asking what changed. The data was in git the whole time.

Every developer knows they should keep a changelog. Almost nobody does it consistently. It's not laziness — it's priority. Between the actual shipping, the bug fixes, and the customer calls, "update the changelog" is the task that always survives to next sprint. Then the next one. Then users start asking what changed, and you're staring at 90 commits trying to reconstruct two months of features from message subject lines.

This article covers why manual changelogs fail structurally, how AI-assisted commit parsing fixes the problem, and what a minimum viable automation looks like you can implement today.


The real cost of a manual changelog

Most teams underestimate what a stale changelog costs. The obvious cost is time — reconstructing a changelog from scratch takes 30–90 minutes per release, longer for anything over a few weeks. But the indirect costs are larger:

Users assume you stopped shipping

Your changelog is public evidence of momentum. A prospect evaluating your tool checks the changelog before buying. "Last update: 3 months ago" reads as abandoned, even if you merged 40 commits last week. You lose conversions not because the product is bad but because nobody updated a text file.

Support tickets for features you already shipped

Users request things you shipped two sprints ago. They never saw a changelog entry, so they don't know. You spend time in support conversations explaining features rather than building new ones. A maintained changelog eliminates an entire category of support ticket.

Non-technical stakeholders have no visibility

Investors, co-founders, customer success, and sales need to understand what shipped. A wall of git commits is useless to them. A changelog written in plain English is exactly what they need — and writing it falls on the engineering team every time.

The core problem Manual changelogs require a human to translate technical commits into user-facing language after every release. That translation step is the bottleneck — and it's exactly what an LLM is good at.

How AI-assisted commit parsing works

The information in your git history is surprisingly complete. Every commit has a subject, body, author, timestamp, and diff. Pull requests add titles, descriptions, labels, and linked issues. All of that is structured, machine-readable data that already describes what changed.

The missing step is translation: turning fix(auth): handle token refresh race condition into "Fixed an issue where users could be unexpectedly logged out during high-traffic periods." That translation requires understanding context, user impact, and natural language — which is exactly the task LLMs handle well.

The basic pattern:

  1. Extract commits or merged PRs since last release using git log
  2. Send them to an LLM with a prompt describing the desired output format
  3. Get back categorized, human-readable release notes
  4. Review, adjust if needed, publish

Minimum viable changelog automation

If you want to try this yourself before committing to any tooling, here's a working pattern:

# Get commits since last tag
git log $(git describe --tags --abbrev=0)..HEAD \
  --pretty=format:"%h %s" \
  --no-merges

Pipe the output into a prompt like this:

You are writing release notes for a developer tool.
Below are git commit messages from this release.
Categorize them as NEW (new features), FIX (bug fixes), or IMP (improvements).
Write each entry in plain English for a non-technical reader.
Omit internal refactors and dependency bumps unless they affect users.

Commits:
[paste git log output here]

This works. It's manual, but it compresses 45 minutes of "stare at commits and write" into 3 minutes of review. The output quality depends on your commit message discipline — cleaner messages produce better notes.

The limitations of a DIY approach

The manual version still requires someone to run the command, copy-paste into a chat window, review the output, and paste it into wherever your changelog lives. The automation is partial. You've compressed the writing step but not the triggering, formatting, or publishing steps. For a team shipping multiple times per week, the friction accumulates.

A complete automated solution handles the entire pipeline: detects each merge or push automatically, runs the AI generation, formats the output into your changelog structure, and makes it available to publish in one click. That's the difference between a useful one-off script and a process that actually stays current.


What good automated changelog output looks like

The goal is output a non-technical reader can understand immediately. Compare:

Raw commits:

feat: dark mode toggle in settings
fix: csv export truncating on special chars
perf: lazy load dashboard components

Auto-generated release notes:

NEW  Dark mode support across all pages — toggle in Settings → Appearance
FIX  CSV export no longer drops characters in names with accents or special symbols
IMP  Dashboard loads significantly faster on first open

Same information, different audience. The first is useful to the engineer who wrote the commit. The second is useful to the user who doesn't know what lazy loading means but does notice when their dashboard feels slow.


PushLog: the automated version

PushLog does this entire pipeline automatically. Connect your GitHub repo once, and every PR you merge becomes a polished, categorized changelog entry — drafted by AI, ready to publish in one click. No copy-pasting commits, no manual translation, no "I'll update the changelog later" that never happens.

Each entry is categorized (NEW / FIX / IMP), written in plain language, and published to a public changelog page your users can actually read — plus an embeddable in-app widget and RSS feed.

📝 Stop writing release notes manually

PushLog connects to your GitHub repo and auto-drafts changelog entries from every PR and commit. Early access is open — join the waitlist and get 3 months free.

Join the PushLog waitlist →

← All articles  ·  PushLog