Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Turn merged pull requests since the last release tag into a human changelog grouped by Added / Fixed / Changed / Removed, written in user-facing language, not commit-speak. Use whenever the user says "write the changelog", "release notes", "what changed since last release", "generate CHANGELOG", "notes for this version", or is about to cut a release and needs notes. Reach for it right after a version bump, before publishing a release on GitHub, or when a maintainer wants to tell users what is ne
.claude/skills/whatsuppiyush-changelog-writer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 131% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 75% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 168% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 121% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 39% | 0% |
Points at your merged PRs since the last tag and writes a changelog a human would actually read, grouped, de-jargoned, and ordered by what users care about. SKILL.md, works across 30+ tools.
Claude Code
---
name: changelog-writer
description: >-
Turn merged pull requests since the last release tag into a human changelog grouped by
Added / Fixed / Changed / Removed, written in user-facing language, not commit-speak. Use
whenever the user says "write the changelog", "release notes", "what changed since last
release", "generate CHANGELOG", "notes for this version", or is about to cut a release and
needs notes. Reach for it right after a version bump, before publishing a release on GitHub,
or when a maintainer wants to tell users what is new without hand-reading 40 PR titles.
Produces a ready CHANGELOG.md section with a one-line summary on top.
---
# Changelog Writer
Read the PRs merged since the last tag, translate each into what a user actually gets, and
group them into a clean changelog. The skill has one job that engineers routinely get wrong:
a changelog is for the person using the software, not for the person who wrote it. "Refactor
auth middleware to use async handler" is a commit message. "Sign-in is now noticeably faster"
is a changelog line. Convert every entry.
## When to use this
- Cutting a release and you need notes for the tag or the release page.
- A maintainer asks "what's in this version?" or "summarize what changed".
- Trigger phrases: "changelog", "release notes", "what changed", "notes for vX", "generate
CHANGELOG".
## Workflow
### 1. Find the last release and gather the PRs
Determine the previous tag, then list everything merged since:
git describe --tags --abbrev=0
git log <last-tag>..HEAD --oneline --no-merges
gh pr list --state merged --base main --limit 200 \ --json number,title,labels,mergedAt,author \ --search "merged:>=<date-of-last-tag>"
Prefer `gh pr list` when the repo uses PRs: titles and labels are cleaner signal than raw
commits. Fall back to `git log` for squash-merged or PR-less repos. If there is no prior tag,
use the first commit (`git rev-list --max-parents=0 HEAD`) as the start.
### 2. Classify each PR into one bucket
Sort every PR into exactly one of the four Keep a Changelog buckets:
- **Added** - new features, endpoints, options, or capabilities the user did not have before.
- **Changed** - existing behavior that now works differently (defaults, UI, performance,
renamed things that still exist).
- **Fixed** - bugs that were resolved. What was broken and now works.
- **Removed** - features, options, or endpoints taken away or deprecated-to-gone.
Use labels first (`feature`, `bug`, `enhancement`, `breaking`), the title verb second (add,
fix, remove, update), and the diff as a tiebreaker. Drop pure-internal PRs (test-only, CI,
lint, dependency bumps with no user effect) unless the user asks for a developer changelog.
### 3. Translate each PR title into a user benefit
For every kept PR, rewrite the title as an outcome the user notices. Ask "what can the user
now do, or no longer suffer?" and write that.
- Strip the mechanism, keep the effect. "Add Redis cache to search endpoint" -> "Search
returns results faster".
- Name the user-facing thing, not the internal module. Say "the export button", not
"ExportController".
- Lead with the benefit for fixes. "Fix null deref in date parser" -> "Fixed a crash when
importing files with empty date fields".
- Keep breaking changes loud and specific, with the migration in one clause.
- One line per entry. Reference the PR number in parentheses at the end.
### 4. Order by what users care about
Within each bucket, order by user impact, not merge date: breaking changes and headline
features first, tiny tweaks last. Put the most exciting Added items at the very top of Added.
### 5. Write the one-line summary
Open the section with a single sentence capturing the release's theme, so a reader knows in
five seconds whether to care. Base it on the biggest one or two entries.
## OUTPUT TEMPLATE
<one-line summary of what this release is mostly about>
Omit any bucket that has no entries. Keep verbs in past tense (Added implies "we added").
## Worked example
Last tag is `v2.3.0`. `gh pr list` returns 7 merged PRs. Two are CI-only and get dropped. The
rest translate like this:
- "feat: add CSV export to reports (#210)" -> Added: "Export any report to CSV" (#210)
- "feat: dark mode (#214)" -> Added: "Dark mode, toggled from your profile settings" (#214)
- "perf: memoize dashboard queries (#212)" -> Changed: "The dashboard loads faster on large
accounts" (#212)
- "fix: timezone off-by-one on daily summary (#211)" -> Fixed: "Daily summaries now show the
correct date for users outside UTC" (#211)
- "chore: drop legacy /v1 export endpoint (#215)" -> Removed: "The old /v1 export endpoint is
gone; use /v2/export" (#215)
Assembled:
Reporting gets a CSV export and dark mode, plus a faster dashboard.
From God of Skills: a curated, hand-tested directory of AI skills, prompts, templates and image style guides. Source: https://godofskills.com/skills/changelog-writer?ref=claude-skill
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | pass→pass | 7,403 | 4,626 | -38% | 1 | 1 | 0% | 1,376 | 2,582 | +88% | 0 | 0 | — |
case-21 | pass→pass | 4,152 | 2,101 | -49% | 1 | 1 | 0% | 839 | 2,123 | +153% | 0 | 0 | — |
case-01 | fail→fail | 1,722 | 4,856 | +182% | 1 | 1 | 0% | 335 | 2,097 | +526% | 0 | 0 | — |
case-02 | fail→pass | 7,483 | 9,313 | +24% | 1 | 1 | 0% | 1,431 | 3,307 | +131% | 0 | 0 | — |
case-03 | fail→fail | 4,001 | 3,630 | -9% | 1 | 1 | 0% | 695 | 2,243 | +223% | 0 | 0 | — |
case-04 | fail→pass | 7,447 | 7,196 | -3% | 1 | 1 | 0% | 1,590 | 2,785 | +75% | 0 | 0 | — |
case-05 | fail→pass | 4,845 | 3,283 | -32% | 1 | 1 | 0% | 875 | 2,347 | +168% | 0 | 0 | — |
case-06 | fail→fail | 4,228 | 3,350 | -21% | 1 | 1 | 0% | 753 | 2,323 | +208% | 0 | 0 | — |
case-07 | pass→pass | 5,481 | 3,147 | -43% | 1 | 1 | 0% | 1,080 | 2,293 | +112% | 0 | 0 | — |
case-08 | fail→pass | 5,456 | 3,240 | -41% | 1 | 1 | 0% | 1,047 | 2,317 | +121% | 0 | 0 | — |
case-09 | fail→pass | 8,867 | 3,010 | -66% | 1 | 1 | 0% | 1,652 | 2,293 | +39% | 0 | 0 | — |
case-10 | pass→pass | 6,027 | 3,959 | -34% | 1 | 1 | 0% | 1,197 | 2,492 | +108% | 0 | 0 | — |
case-11 | pass→pass | 7,028 | 5,556 | -21% | 1 | 1 | 0% | 1,329 | 2,711 | +104% | 0 | 0 | — |
case-12 | pass→pass | 10,155 | 4,067 | -60% | 1 | 1 | 0% | 2,146 | 2,557 | +19% | 0 | 0 | — |
case-13 | pass→pass | 4,185 | 1,255 | -70% | 1 | 1 | 0% | 775 | 1,964 | +153% | 0 | 0 | — |
case-14 | pass→pass | 6,238 | 2,402 | -61% | 1 | 1 | 0% | 1,188 | 2,165 | +82% | 0 | 0 | — |
case-15 | pass→pass | 2,847 | 3,569 | +25% | 1 | 1 | 0% | 481 | 2,352 | +389% | 0 | 0 | — |
case-22 | pass→pass | 3,496 | 2,927 | -16% | 1 | 1 | 0% | 637 | 2,308 | +262% | 0 | 0 | — |
case-16 | pass→fail | 4,428 | 3,631 | -18% | 1 | 1 | 0% | 704 | 2,380 | +238% | 0 | 0 | — |
case-17 | fail→fail | 5,316 | 2,173 | -59% | 1 | 1 | 0% | 908 | 2,178 | +140% | 0 | 0 | — |
case-18 | pass→fail | 3,323 | 2,240 | -33% | 1 | 1 | 0% | 633 | 2,157 | +241% | 0 | 0 | — |
case-19 | pass→pass | 6,658 | 4,865 | -27% | 1 | 1 | 0% | 1,267 | 2,614 | +106% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +14 percentage points is the difference between those two pass rates over the 21 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/6/2026 | +32% |
Other measured skills in the registry, with their headline benchmark lift.