Skip to main content

AI-powered changelog generator that reads actual code diffs and works on messy commits

Project description

🌊 ReleaseWave

AI-Powered Changelog Generator That Actually Works

Reads real code diffs. Works on messy commits. Generates 3 audience-targeted changelogs in one command.

PyPI version Python 3.10+ License: MIT GitHub stars

Quick Start · Why ReleaseWave? · GitHub Action · Configuration · Models


⚡ Quick Start

# Install
pip install releasewave

# Generate changelogs (zero config!)
releasewave generate v1.0.0 v1.1.0

# That's it. Three files appear:
# CHANGELOG-developer.md  — Technical changelog
# RELEASE-NOTES.md        — User-facing notes
# TWEET.txt               — Tweet-sized announcement

🤔 Why ReleaseWave?

Every existing changelog tool has the same fatal flaw: they require clean, conventional commit messages.

Real-world repos look like this:

fix
wip
update stuff  
lol this works now
asdfghjkl
merge branch 'main' of github.com/...

ReleaseWave doesn't care. It reads the actual code diffs, not just the commit messages.

Feature git-cliff conventional-changelog release-please ReleaseWave
Works on messy commits
Reads actual code diffs
Multi-audience output
Zero config
Monorepo support ⚠️ ⚠️ ⚠️
GitHub Action

📋 Three Outputs, One Command

ReleaseWave generates three distinct changelogs per run. You can view the actual output files generated for this repository in the examples/ directory:

🚀 GitHub Action

Drop this into your workflow — changelogs generate automatically on every release:

# .github/workflows/release-notes.yml
name: Generate Release Notes
on:
  release:
    types: [published]

jobs:
  changelog:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: Sahaj33-op/releasewave@v1
        with:
          from_ref: ${{ github.event.release.previous_tag }}
          to_ref: ${{ github.event.release.tag_name }}
          api_key: ${{ secrets.GEMINI_API_KEY }}
          update_changelog: 'true'

See .github/workflows/release-notes.yml for a complete example.

🔧 CLI Reference

# Basic usage
releasewave generate <from_ref> <to_ref>

# Specify model
releasewave generate v1.0 v1.1 --model gpt-4o-mini

# Custom output directory
releasewave generate v1.0 v1.1 --output ./docs/releases

# Only developer + tweet (skip user notes)
releasewave generate v1.0 v1.1 --audiences developer,tweet

# Update existing CHANGELOG.md
releasewave generate v1.0 v1.1 --update-changelog

# Export full analysis as JSON
releasewave generate v1.0 v1.1 --json

# Quiet mode (just write files, no stdout)
releasewave generate v1.0 v1.1 --quiet

# Different repo path
releasewave generate v1.0 v1.1 --repo /path/to/repo

# Initialize config file
releasewave init

# Show recommended models
releasewave models

Alias: You can use rwave instead of releasewave:

rwave generate v1.0 v1.1

⚙️ Configuration

ReleaseWave works with zero configuration, but you can customize everything via .rwave.yml:

# Generate a config file
releasewave init
# .rwave.yml
llm:
  model: gemini/gemini-2.5-flash    # Any LiteLLM-supported model
  temperature: 0.3
  max_retries: 3

output:
  audiences: [developer, user, tweet]
  update_changelog: true
  directory: ./docs

filters:
  exclude_patterns:
    - "*.lock"
    - "package-lock.json"
    - "node_modules/*"

# Help the LLM understand your project
project_context: "A React dashboard with a FastAPI backend"
custom_prompt: "Pay special attention to API breaking changes"

Configuration Precedence

  1. CLI flags (highest priority)
  2. Environment variables (RWAVE_MODEL, RWAVE_API_KEY)
  3. Config file (.rwave.yml)
  4. Defaults (lowest priority)

🤖 Models

ReleaseWave supports any model via LiteLLM:

Model Provider Cost Quality
gemini/gemini-2.5-flash Google 💚 Very cheap ⭐⭐⭐⭐
gpt-4o-mini OpenAI 💚 Cheap ⭐⭐⭐⭐
gpt-4o OpenAI 💛 Moderate ⭐⭐⭐⭐⭐
claude-sonnet-4-20250514 Anthropic 💛 Moderate ⭐⭐⭐⭐⭐
ollama/llama3 Local 💚 Free ⭐⭐⭐
openrouter/<model> OpenRouter 💛 Varies ⭐⭐⭐⭐

Set your API key:

# Google Gemini (default, cheapest)
export GEMINI_API_KEY="your-key"

# OpenAI
export OPENAI_API_KEY="your-key"

# Anthropic
export ANTHROPIC_API_KEY="your-key"

# Or use the universal key
export RWAVE_API_KEY="your-key"

# Local Ollama — no key needed!
releasewave generate v1.0 v1.1 --model ollama/llama3

📦 Monorepo Support

ReleaseWave automatically detects monorepo structures and generates per-package changelogs:

my-monorepo/
├── packages/
│   ├── api/          ← Detected as @myapp/api
│   ├── web/          ← Detected as @myapp/web
│   └── shared/       ← Detected as @myapp/shared
├── package.json      ← Workspace config
└── .rwave.yml

Supports: npm/yarn/pnpm workspaces, Python packages, Cargo workspaces, Go modules, and more.

🏗️ How It Works

┌──────────────┐       ┌──────────────┐     ┌─────────────┐
│  Git Refs    │────▶ │  Diff        │────▶│  Chunker    │
│  Resolution  │       │  Extraction  │     │  (Token     │
│              │       │              │     │   Safety)   │
└──────────────┘       └──────────────┘     └──────┬──────┘
                                                 │
┌─────────────┐     ┌──────────────┐       ┌──────▼──────┐
│  3 Audience │◀────│  LLM         │◀──── │  Commit     │
│  Changelogs │     │  Analysis    │       │  Log +      │
│             │     │              │       │  Diffs      │
└─────────────┘     └──────────────┘       └─────────────┘
  1. Ref Resolution — Validates and resolves git tags/branches/SHAs
  2. Diff Extraction — Runs git diff, filters noise (lockfiles, binaries), respects size limits
  3. Chunking — Splits large diffs into token-safe chunks, grouped by directory
  4. LLM Analysis — Sends diffs + commits to LLM, receives categorized changes
  5. Audience Rendering — Three separate prompts for developer, user, and tweet audiences
  6. Output — Writes markdown files, optionally updates CHANGELOG.md

🛡️ Edge Cases Handled

  • Binary files → Noted as "binary file changed", not sent to LLM
  • Massive diffs (1000+ files) → Auto-chunked by directory, merged after analysis
  • LLM API failure → Graceful fallback to commit-message-only mode
  • No commits in range → Clear error with suggested correct syntax
  • Rate limiting → Exponential backoff with configurable retry count
  • Lock files & generated code → Excluded by default via filters

🤝 Contributing

Contributions welcome! Here's how to set up the dev environment:

# Clone
git clone https://github.com/Sahaj33-op/releasewave.git
cd releasewave

# Install in dev mode
pip install -e ".[dev]"

# Run tests
pytest

# Lint
ruff check .

# Type check
mypy releasewave/

📄 License

MIT — do whatever you want with it.


Built with ❤️ by Sahaj

If ReleaseWave saves you time, consider giving it a star ⭐

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

releasewave-1.0.0.tar.gz (39.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

releasewave-1.0.0-py3-none-any.whl (33.5 kB view details)

Uploaded Python 3

File details

Details for the file releasewave-1.0.0.tar.gz.

File metadata

  • Download URL: releasewave-1.0.0.tar.gz
  • Upload date:
  • Size: 39.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for releasewave-1.0.0.tar.gz
Algorithm Hash digest
SHA256 d96248a260212b8b71b9210c24807cc78a0c45c316673abba12e92ceca647904
MD5 f9cf0ef8777429c43cccda42b80eabca
BLAKE2b-256 5bc58944aa0f16a52846f75f06a5a247a0e96148d0263cabb97851aae6a83b1f

See more details on using hashes here.

File details

Details for the file releasewave-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: releasewave-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 33.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for releasewave-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1b2fcc3943d1e69508e108a4866ddaa5e9d3100ce505bc8d49c9861b58143376
MD5 e5ad4acd9a6a813e7fb54fb34c5cc8bb
BLAKE2b-256 53d7cc48ece48b31f02927ba3e2a81dcb01be94e84b8e9412976e872cb8fa3c2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page