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.
Metadata
Release files for releasesmith 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| releasesmith-0.1.0.tar.gz | 267.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| releasesmith-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 326.7 kB
Release files / releasesmith-0.1.0.tar.gz
| Download URL | releasesmith-0.1.0.tar.gz |
|---|---|
| Size | 267.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6f30c5ebb006156bed44907a6c0dc6bc5c41548b0cb5a7c0535f120ee9be6463
|
|
BLAKE2b-256 checksum How to use checksums |
6da930e82287a533ac8e74a8be8acc63d8d2149c981144efc0260419a4208399
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 24, 2026.
Transparency logRelease files / releasesmith-0.1.0-py3-none-any.whl
| Download URL | releasesmith-0.1.0-py3-none-any.whl |
|---|---|
| Size | 58.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
48c7a932161364a2dd7cd9d2522f7f7ad500395735663583aaa610392a464e56
|
|
BLAKE2b-256 checksum How to use checksums |
c050760f285719d03cbf46398e42cf6d0e090988b48cb6cc357f456fd412b893
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 24, 2026.
Transparency log