Versioning & Changelogs
Semantic versioning communicates breaking changes to consumers. Changelogs document what changed between releases.
Search across all documentation pages
Semantic versioning communicates breaking changes to consumers. Changelogs document what changed between releases.
[project]
version = "1.2.3" # MAJOR.MINOR.PATCH# CHANGELOG.md
## [1.2.3] - 2026-07-09
### Fixed
- Handle empty invoice list in exportWhen to reach for this:
# Dynamic version from git tags (hatchling)
[project]
name = "myapp"
dynamic = ["version"]
[tool.hatch.version]
source = "vcs"
[tool.hatch.build.hooks.vcs]
version-file = "src/myapp/_version.py"# CHANGELOG.md (Keep a Changelog format)
# Changelog
## [Unreleased]
### Added
- Batch invoice export endpoint
## [1.2.0] - 2026-06-15
### Changed
- **BREAKING:** `Invoice.amount` now returns Decimal, not float
### Migration
- Replace `float(invoice.amount)` with `invoice.amount` (already Decimal)git tag v1.2.0
uv build # version read from tagWhat this demonstrates:
| Change | Bump | Example |
|---|---|---|
| Breaking API change | MAJOR | 1.0.0 -> 2.0.0 |
| New feature, backward compatible | MINOR | 1.0.0 -> 1.1.0 |
| Bug fix | PATCH | 1.0.0 -> 1.0.1 |
| Pre-release | suffix | 1.0.0b1, 1.0.0rc1 |
| Alternative | Use When | Don't Use When |
|---|---|---|
| CalVer (2026.07.1) | Date-driven releases | Library with semver expectations |
| git tags only | Internal tools | Public libraries |
| semantic-release (bot) | Automated changelog | Manual release process preferred |
When the public API is stable and you commit to semver semantics.
hatch-vcs, setuptools-scm, or semantic-release from conventional commits.
Both. CHANGELOG in repo; GitHub Releases for distribution and notifications.
Removing public API, changing function signatures, or altering behavior documented as stable.
Warning in N release, remove in N+1 MAJOR. Document in changelog.
1.0.0a1 (alpha), 1.0.0b1 (beta), 1.0.0rc1 (release candidate).
The engineer merging the PR adds an entry under [Unreleased].
Applications can use CalVer or semver. Libraries must use semver.
feat:, fix:, BREAKING CHANGE: prefixes enable automated changelog generation.
PyPI yank (not delete). Consumers already pinned are unaffected; new installs blocked.
Stack versions: This page was written for Python 3.14.0, FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, and uv 0.6+.
Reviewed by Chris St. John·Last updated Jul 19, 2026