AI-generated release notes for people who read release notes.
communique turns your git history, pull requests, and repository context into
polished release notes. It can print notes locally, update CHANGELOG.md, or
publish directly to a GitHub Release.
Install with mise:
mise use communiqueOr install with Cargo:
cargo install communiquePre-built binaries for macOS, Linux, and Windows are available on the GitHub releases page.
communique needs an LLM API key. Claude models use Anthropic; other models use the OpenAI-compatible provider path.
# Default Claude models
export ANTHROPIC_API_KEY="sk-ant-..."
# OpenAI-compatible models
export OPENAI_API_KEY="sk-..."GitHub context and GitHub Release publishing also need a token:
export GITHUB_TOKEN="$(gh auth token)"Initialize a config file in your repository:
communique initThis creates communique.toml, where you can set the default model, repository,
style instructions, and project context.
Generate notes for a tag:
communique generate v1.2.0communique automatically detects the previous tag. You can provide it explicitly when needed:
communique generate v1.2.0 v1.1.0Preview without publishing or verifying links:
communique generate v1.2.0 --dry-runWrite the output to a file:
communique generate v1.2.0 --output RELEASE_NOTES.mdPublish generated notes to an existing GitHub Release:
communique generate v1.2.0 --github-releasecommunique reads commits and pull requests, lets the model inspect relevant files and diffs, verifies links, then replaces the GitHub Release body with the finished notes.
Add or replace the version entry in CHANGELOG.md:
communique generate v1.2.0 --changelogFor release PRs, this keeps the [Unreleased] section in place and inserts the
new version entry immediately below it.
Use concise output when you do not want a full release narrative:
communique generate v1.2.0 --conciseYou can combine concise output with changelog updates:
communique generate v1.2.0 --concise --changelogcommunique.toml supports project-level defaults and writing guidance:
context = """
This is a Rust CLI used by platform engineers.
Call out breaking changes and migration steps clearly.
"""
system_extra = """
Write in a direct, practical tone.
Avoid marketing language.
"""
[defaults]
model = "claude-opus-4-7"
repo = "owner/repo"
max_tokens = 4096CLI flags override config defaults.
Use fetch-depth: 0 so communique can compare tags:
name: Release Notes
on:
push:
tags:
- v[0-9]+.*
permissions:
contents: write
jobs:
release-notes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: jdx/mise-action@v3
- run: mise use communique
- name: Generate release notes
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: communique generate "${{ github.ref_name }}" --github-releaseSee the GitHub Actions guide for release-plz examples and release PR workflows.
communique generate v1.2.0 --repo owner/repo
communique generate v1.2.0 --model claude-opus-4-7
communique generate v1.2.0 --provider openai --base-url https://api.example.com/v1
communique generate v1.2.0 --quiet
communique generate v1.2.0 --verboseIf PR details are missing, confirm GITHUB_TOKEN is set and can read the
repository.
If generation fails because tags cannot be compared, fetch full history and tags:
git fetch --tags --unshallowIf CHANGELOG.md updates fail, make sure the file has an ## [Unreleased] or
## Unreleased section.