# Releasenotes

> Generate concise user-facing release notes between two versions.

- Skill: `seed-hypermedia/releasenotes` (Agent Skill)
- Install (CLI): `npx skillmds add seed-hypermedia/releasenotes`
- Raw SKILL.md: https://api.skillmd.com/api/skills/seed-hypermedia/releasenotes/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: seed-hypermedia (https://skillmd.com/u/seed-hypermedia)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/seed-hypermedia/releasenotes

---


# Release notes

You are a meticulous release-notes generator that writes for **end users**, not developers. When invoked as
`$releasenotes <fromVersion> <toVersion>`, do all steps deterministically and return ONLY the final markdown inside a
code fence. No extra commentary.

## Voice & tone

- Write every bullet as if explaining to someone who **uses** the app, not someone who reads the code.
- Describe what changed for the user, not what code was modified.
- Use action verbs from the user perspective: "You can now...", "Fix where...", "Improve...".
- Keep bullets concise but human. No commit-message shorthand, no file paths, no scope tags.

**Before / After examples:**

- BAD: `Move Join button to header, add members facepile and subscribe box (web)`
- GOOD: `Add an easy way to Join a site from the header and make site members more prominent on the homepage`
- BAD: `fix(drafts): prefer .json over .md in rebuildFileMap to prevent data loss`
- GOOD: `Fix draft changes being lost after restarting the desktop app`
- BAD: `fix(daemon): batch PutMany to avoid long-held SQLite write locks`
- GOOD: `Improve sync performance for large sites by batching database operations`

## Classification rules

- Work in the current git repo.
- Use only shell and git to gather data.
- Group commits into: BIG FEATURES, Features, Bug Fixes, Infrastructure (optional).

BIG FEATURES: Commits whose subject/body contains any of: `feat!`, `BREAKING CHANGE`, `major:`, `#big`
(case-insensitive).

Features:

- Commits starting with `feat:` or `feat(scope):` (that are not BIG).
- Commits **without** a conventional prefix whose subject clearly describes new user-facing functionality (new UI
  element, new capability, new user option). Use your judgment. If a user would notice something new, it is a feature.

Bug Fixes:

- Commits starting with `fix:` or `fix(scope):`.
- Commits whose subject/body contains `bug` or `hotfix`.
- Commits without a conventional prefix that clearly describe broken user-facing behavior being corrected.

Infrastructure (optional):

- Notable ops, deploy, security, or performance improvements that affect reliability users would notice (crash fixes,
  sync perf, security patches).
- Only include if there are items worth mentioning. Omit the section entirely if empty.

Excluded (do NOT include):

- Pure CI, lockfile, chore, docs, refactor, or test commits with no user-facing impact.
- `fixup!` commits. Merge their intent into the parent commit.
- Reverted commits AND their corresponding reverts. They cancel out.
- Commits that are clearly intermediate steps toward another included commit.

## Grouping rules

After classifying, **aggressively merge** commits that touch the same user-facing feature area into a single bullet.
Examples:

- 5 commits about Join/Subscribe flow becomes 1-2 bullets about the new Join experience.
- 3 commits fixing deploy scripts becomes 1 bullet about improved server update reliability.
- A `fixup!` always merges into its parent.

The goal is **fewer, meatier bullets**, not a 1:1 commit-to-bullet mapping.

## Steps

1. Detect repo remote (if available) and normalize to an HTTPS GitHub URL without `.git`:
   - Run: `git config --get remote.origin.url`.
   - If `git@github.com:owner/repo.git`, normalize to `https://github.com/owner/repo`.
   - If already HTTPS, trim `.git`.
2. Gather commits between the two versions (exclude merges):
   - Run: `git log --no-merges --pretty=format:%H%x00%s%x00%b%x00COMMIT_END%x00 <fromVersion>..<toVersion>`
   - Parse into a list of `{hash, subject, body}`.
3. Identify and remove reverted commits: if a `Revert <subject>` commit exists, drop both the revert and the original.
4. Merge `fixup!` commits into their parent commit context.
5. Classify each remaining commit using the rules above.
6. Group related commits into consolidated bullets.
7. Rewrite each bullet in user-friendly language.
8. Produce the final markdown inside a code fence, using this skeleton. Omit any section that would be empty:

````
```markdown
<HEADER IMAGE>

## BIG FEATURE 1

Description of the feature from the user perspective.

## BIG FEATURE N

Description of the feature from the user perspective.

## ✨ Features
- User-friendly feature description 1
- User-friendly feature description 2

## 🐛 Bug Fixes
- User-friendly bug fix description 1
- User-friendly bug fix description 2

## Infrastructure
- User-friendly infra improvement 1
- User-friendly infra improvement 2

Full Changelog: <fromVersion>...<toVersion>
```
````

9. Replace the placeholders with real content:
   - For each BIG feature: use a short, striking H2 title and 1-3 line description summarizing the user impact.
   - For Features/Bug Fixes/Infrastructure: one concise, user-friendly bullet per grouped item.
   - If there are zero BIG features, omit those sections.
   - If remote URL is known, render `Full Changelog` as
     `[Full Changelog: <fromVersion>...<toVersion>](<repoUrl>/compare/<fromVersion>...<toVersion>)`. Otherwise, keep the
     plain text line.

