releasesmith
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-llmstill 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 andBREAKING 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
Unreleasedsection 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f30c5ebb006156bed44907a6c0dc6bc5c41548b0cb5a7c0535f120ee9be6463
|
|
| MD5 |
cfc2ccceb06e888dc41ab02cd42ae6d2
|
|
| BLAKE2b-256 |
6da930e82287a533ac8e74a8be8acc63d8d2149c981144efc0260419a4208399
|
Provenance
The following attestation bundles were made for releasesmith-0.1.0.tar.gz:
Publisher:
release.yml on JToSound/releasesmith
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
releasesmith-0.1.0.tar.gz -
Subject digest:
6f30c5ebb006156bed44907a6c0dc6bc5c41548b0cb5a7c0535f120ee9be6463 - Sigstore transparency entry: 2580001399
- Sigstore integration time:
-
Permalink:
JToSound/releasesmith@23ee418c517aaddec7c7662dba6c41204c9e3a13 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/JToSound
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@23ee418c517aaddec7c7662dba6c41204c9e3a13 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48c7a932161364a2dd7cd9d2522f7f7ad500395735663583aaa610392a464e56
|
|
| MD5 |
39a2a6a9af13d2257ad89448a9ea9eef
|
|
| BLAKE2b-256 |
c050760f285719d03cbf46398e42cf6d0e090988b48cb6cc357f456fd412b893
|
Provenance
The following attestation bundles were made for releasesmith-0.1.0-py3-none-any.whl:
Publisher:
release.yml on JToSound/releasesmith
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
releasesmith-0.1.0-py3-none-any.whl -
Subject digest:
48c7a932161364a2dd7cd9d2522f7f7ad500395735663583aaa610392a464e56 - Sigstore transparency entry: 2580001404
- Sigstore integration time:
-
Permalink:
JToSound/releasesmith@23ee418c517aaddec7c7662dba6c41204c9e3a13 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/JToSound
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@23ee418c517aaddec7c7662dba6c41204c9e3a13 -
Trigger Event:
push
-
Statement type: