Generate user-oriented release notes for open-source projects, following best practices that help users understand what changed, why it matters, and how to adopt new features.
Generate user-oriented release notes for open-source projects, following best practices that help users understand what changed, why it matters, and how to adopt new features.
Release notes serve users, not developers. Every entry should answer:
ā Bad: "Refactored MessageHandler to use Strategy pattern" ā Good: "Message processing is now 40% faster and supports custom handlers"
Align your notes with SemVer:
Include ALL user-facing changes. Users rely on release notes to:
Use this template for consistency:
# {version} Release Notes
## Summary
<!-- For MINOR/MAJOR releases: 2-3 sentences highlighting the theme -->
## New Features
### {Feature Name}
<!-- What it does, why it matters -->
#### Why {Feature Name}?
<!-- Use cases and benefits -->
#### Configuration
```yaml
# Example configuration
# Usage example
| Dependency | Version | Notes |
|---|---|---|
| {name} | {ver} | {why} |
{Description of breaking change and migration path}
OR
None.
# Old configuration
# New configuration
Compare: https://github.com/{org}/{repo}/compare/{prev-tag}...{new-tag}
## Section Guidelines
### New Features
**Structure each feature with:**
1. **Name**: Clear, descriptive title (not internal code names)
2. **Description**: What it does in user terms
3. **Why section**: Explains use cases and benefits
4. **Configuration**: Complete, copy-pasteable examples
5. **Architecture notes**: Only if users need to understand (e.g., for deployment)
**Use tables for feature comparisons:**
```markdown
| Feature | Description |
|---------|-------------|
| **SQL-Only Implementation** | Uses Flyway migrations ā no extension required |
| **Message Deduplication** | Unique index prevents duplicate messages |
Format: {Component}: {What was fixed} ā {User impact}
Good examples:
Include:
Distinguish from features ā improvements enhance existing functionality:
ALWAYS include this section. Even "None." tells users they can upgrade safely.
For actual breaking changes:
List changes that users might care about:
Always provide:
# ā
Good example
lemline:
messaging:
type: pgmq
pgmq:
host: localhost
port: 5432
database: lemline
queue: lemline-commands
visibility-timeout: 30 # seconds before message redelivery
# ā Bad example
config:
value: example
**bold** for component/feature names in listsbackticks for code, commands, config keysFor community-contributed features:
### New Feature X
Contributed by @username in #PR_NUMBER
Help users find more context:
- Fix memory leak in worker pool (#123)
- Add WebSocket support (requested in #89)
Warn users before removing features:
## Deprecations
- `legacyMode` configuration is deprecated and will be removed in v2.0
- Migration: Use `compatibilityMode` instead
- Timeline: Removal planned for Q2 2025
Highlight security-relevant changes:
## Security
- **CVE-2024-XXXX**: Fixed XSS vulnerability in dashboard
- Severity: Medium
- Affected versions: 1.2.0 - 1.2.5
- Recommendation: Upgrade immediately
Help users plan upgrades:
## Upgrade Notes
**Difficulty: Easy** ā No configuration changes required
**Difficulty: Moderate** ā Configuration updates needed (see Migration Guide)
**Difficulty: Complex** ā Database migration required, plan maintenance window
# Get commits since last tag
git log v0.5.1..HEAD --oneline --no-merges
# Get commits with full messages
git log v0.5.1..HEAD --pretty=format:"- %s%n%b"
# Using GitHub CLI
gh pr list --state merged --base main --search "merged:>=2024-01-01"
Use conventional commit prefixes to auto-categorize:
feat: ā New Featuresfix: ā Bug Fixesperf: ā Improvementsdocs: ā Documentation (usually not in release notes)chore: ā Dependencies / Internal (selective inclusion)BREAKING CHANGE: ā Breaking ChangesSee real-world examples in the Lemline project:
ā Commit message dumps: Raw git logs are not release notes ā Internal-only changes: "Refactored tests" doesn't help users ā Missing context: "Fixed bug" without explaining what bug ā Jargon overload: "Implemented CQRS with event sourcing" (explain benefits) ā No examples: Features without usage examples ā Hidden breaking changes: Burying them in other sections ā Inconsistent formatting: Mixing styles within a release ā Stale links: Links to old documentation or dead URLs