Skip to main content

releasesmith

CI PyPI version Python License: MIT Coverage

releasesmith is an AI-powered changelog and release-notes generator for Git repositories. One command turns commit history into structured, readable release documentation, with deterministic rule-based parsing and optional LLM enhancement.

  • Offline-first: no API key? --no-llm still produces a useful changelog.
  • Deterministic-first: rules classify commits; LLM is only an enhancer.
  • Safe-by-default: read-only on your repository; atomic output writes.

Features

  • Parses Conventional Commits (feat, fix, perf, refactor, docs, build, ci, test, chore), scopes, ! breaking markers and BREAKING CHANGE: footers.
  • Extracts PR numbers, closing issue references, co-authors and trailers.
  • Two-layer classification: offline rules first, batched validated LLM calls only for what rules cannot resolve (with tenacity retries and a safe deterministic fallback).
  • Groups history into per-tag releases plus an Unreleased section with Keep a Changelog-style categories.
  • Conservative deduplication — never merges breaking changes or entries with issue/PR references.
  • Renderers: Markdown, JSON, self-contained HTML (dark mode, no CDN, no JS required), Twitter/X thread drafts.
  • Optional LLM polish rewrites entry wording in batches without touching hashes, refs or technical facts.
  • English (en) and Traditional Chinese (zh-TW) headings and UI strings.
  • Local FastAPI web UI sharing the exact core pipeline with the CLI.
  • Typer CLI with Rich panels: every error explains what, why and how to fix — without leaking secrets.

Supported LLM providers

Provider Models via Credential env var
OpenAI litellm (gpt-4o-mini, …) OPENAI_API_KEY
Anthropic litellm (anthropic/claude-*) ANTHROPIC_API_KEY
Ollama (local) litellm (ollama/llama3, …) none (OLLAMA_API_BASE optional)

No key configured? Everything still works with --no-llm.

Installation

# uv tool
uv tool install releasesmith

# pipx
pipx install releasesmith

# from source
git clone https://github.com/JToSound/releasesmith
cd releasesmith
uv sync --all-groups
uv run releasesmith --help

Quick start

cd your-repo
releasesmith generate --no-llm     # writes CHANGELOG.md, fully offline
releasesmith preview --no-llm      # terminal preview, writes nothing
releasesmith stats                 # category chart, scopes, authors

CLI examples

releasesmith generate --since v1.2.0                    # range-limited
releasesmith generate --format html --output site.html  # self-contained page
releasesmith generate --format json                     # machine-readable
releasesmith generate --lang zh-TW                      # 繁體中文標題
releasesmith generate --provider openai                 # + LLM classification
releasesmith generate --provider ollama --model ollama/llama3
releasesmith generate --polish                          # LLM wording polish
releasesmith generate --paths src tests                 # path-filtered
releasesmith generate --include-merge-commits           # keep merges
releasesmith generate --dry-run                         # never writes files
releasesmith diff v1.0.0 v1.1.0                         # entry-level diff
releasesmith tweet --since v1.4.0                       # X/Twitter draft
releasesmith init                                       # guided config setup
releasesmith serve --host 127.0.0.1 --port 8000         # local web UI

Configuration

Copy .releasesmith.toml.example to your repo root as .releasesmith.toml:

[releasesmith]
llm_provider = "openai"        # openai | anthropic | ollama | "" (offline)
model = "gpt-4o-mini"
language = "en"                # en | zh-TW
format = "markdown"
output_file = "CHANGELOG.md"

[releasesmith.github]
repo = "owner/repo"            # enables commit/PR/issue links

[releasesmith.prompts]
classify_system = ""           # optional prompt overrides (merged per-key)
summarize_system = ""

Precedence: CLI flags > RELEASESMITH_* env vars > .releasesmith.toml > packaged defaults. Full field reference: docs/configuration.md.

GitHub Actions integration

name: Changelog check
on: [pull_request]
permissions:
  contents: read
jobs:
  changelog:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0          # full history for accurate ranges
      - uses: astral-sh/setup-uv@v5
        with:
          python-version: "3.12"
      - run: uv tool install releasesmith
      - run: releasesmith generate --no-llm --dry-run

This repository's own CI runs lint + format + mypy strict + tests with an 80% coverage gate on Python 3.11/3.12 (Linux + Windows); the release workflow builds and validates distributions on v* tags with PyPI trusted publishing scaffolding.

HTML output

--format html emits one self-contained file: system font stack, inline CSS, responsive layout, automatic dark mode via prefers-color-scheme, colour-coded category badges, a version timeline, clickable short hashes when [releasesmith.github] repo is set — all content escaped, no JavaScript and no external resources required.

Local Web UI

releasesmith serve                # http://127.0.0.1:8000

Server-rendered form: enter any local repository path, pick since/until, format and language, then preview or download the generated document. The web UI binds loopback only by default and shares the CLI's validation and pipeline code.

Privacy & security note

Commit text is transmitted to a third party only when you enable an LLM provider (via config or flags, without --no-llm). For sensitive repositories prefer --no-llm or self-hosted Ollama, and review history for embedded secrets first. API keys are read exclusively from environment variables and never written to config files, logs or reports.

Development

git clone https://github.com/JToSound/releasesmith && cd releasesmith
uv sync --all-groups
uv run pre-commit install 2>/dev/null || true   # optional
uv run ruff check .                             # lint
uv run ruff format .                            # format
uv run mypy src                                 # strict types
uv run pytest --cov=releasesmith                # tests + coverage gate ≥80%

Architecture: src/releasesmith/core (models, git parser, classifiers, generator, summarizer) → src/releasesmith/renderers (markdown/json/html/ twitter via packaged Jinja2 templates) → src/releasesmith/cli.py + src/releasesmith/web.py (thin interfaces). Providers live in src/releasesmith/providers; prompt templates in src/releasesmith/templates/prompts.

Contributing

Issues and pull requests are welcome. For non-trivial changes please open an issue first; include tests for behavioural changes (pytest) and make sure the quality gates above pass locally.

License

MIT — © JToSound and contributors.

Download files

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

Source Distribution

releasesmith-0.1.0.tar.gz (267.7 kB view details)

Uploaded Source

Built Distribution

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

releasesmith-0.1.0-py3-none-any.whl (58.9 kB view details)

Uploaded Python 3

File details

Details for the file releasesmith-0.1.0.tar.gz.

File metadata

  • Download URL: releasesmith-0.1.0.tar.gz
  • Upload date:
  • Size: 267.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for releasesmith-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6f30c5ebb006156bed44907a6c0dc6bc5c41548b0cb5a7c0535f120ee9be6463
MD5 cfc2ccceb06e888dc41ab02cd42ae6d2
BLAKE2b-256 6da930e82287a533ac8e74a8be8acc63d8d2149c981144efc0260419a4208399

See more details on using hashes here.

Provenance

The following attestation bundles were made for releasesmith-0.1.0.tar.gz:

Publisher: release.yml on JToSound/releasesmith

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file releasesmith-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: releasesmith-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 58.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for releasesmith-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 48c7a932161364a2dd7cd9d2522f7f7ad500395735663583aaa610392a464e56
MD5 39a2a6a9af13d2257ad89448a9ea9eef
BLAKE2b-256 c050760f285719d03cbf46398e42cf6d0e090988b48cb6cc357f456fd412b893

See more details on using hashes here.

Provenance

The following attestation bundles were made for releasesmith-0.1.0-py3-none-any.whl:

Publisher: release.yml on JToSound/releasesmith

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

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