Skip to main content

Semversioner

Release automation for AI-native software delivery.

Semversioner makes it easy for developers and AI coding agents to manage semantic versioning, capture changes, and generate CHANGELOG.md files automatically. It provides the tooling to automate releases for libraries, Docker images, microservices, and more.

This project was inspired by the way AWS manages their versioning for AWS-cli.

PyPI Version

Semantic Versioning

The semantic versioning spec involves several possible variations, but to simplify, in Semversioner we are using the three-part version number:

<major>.<minor>.<patch>

Constructed with the following guidelines:

  • Breaking backward compatibility or major features bumps the major (and resets the minor and patch).
  • New additions without breaking backward compatibility bumps the minor (and resets the patch).
  • Bug fixes and misc changes bumps the patch.

An example would be 1.0.0.

How it works

At any given time, the .semversioner/ directory looks like:

.semversioner
├── next-release
│   ├── minor-20181227010225.json
│   └── major-20181228010225.json
├── 1.1.0.json
├── 1.1.1.json
└── 1.1.2.json

The release process takes everything in the next-release directory and aggregates them all together in a single JSON file for that release (e.g., 1.12.0.json). This JSON file is a list of all the individual JSON files from next-release, keeping release intent explicit and reviewable whether changes are authored by people or AI agents.

Install

pip install semversioner

Usage

You can use the --help option on any command to see the available options:

semversioner --help

Adding changesets

In your local environment, you can use the CLI to create the different changeset files that will be committed with your code. This ensures that every pull request or commit contains its own self-contained change description and version bump intention.

semversioner add-change --type patch --description "Fix security vulnerability with authentication."

Allowed --type values are: major, minor, patch.

You can also add custom attributes to the changeset file that will be available later in your release template. Use the --attributes flag in key=value format (you can pass it multiple times):

semversioner add-change --type patch \
    --description "My custom changelog message with attributes." \
    --attributes pr_id=322 \
    --attributes issue_id=123

Checking working directory status

You can check the status of your working directory to see the current version, the computed next version, and any unreleased changes:

semversioner status

Example output:

Version: 1.0.0
Next version: 1.1.0
Unreleased changes:
	minor:	Added new authentication feature
(use "semversioner release" to release the next version)

Enforcing changesets in CI/CD (Check)

In your CI/CD pipeline, it's often useful to enforce that a PR includes a changeset before merging. You can use the check command to verify that there are unreleased changes in the .semversioner/next-release/ directory.

semversioner check

If no changes are found, the command exits with a non-zero status code (-1) and prints an error message.

Releasing a new version

When you are ready to create a release (usually in your CI/CD tool on the main branch), you run the release command. This automatically computes the new version number based on the unreleased changes, generates a new version JSON file, and clears the next-release directory.

semversioner release

Generating the Changelog

As part of your release workflow, you can generate the changelog file with all aggregated changes.

semversioner changelog > CHANGELOG.md

Customizing the changelog template

You can customize the changelog by creating a template and passing it as a parameter to the command. For example:

semversioner changelog --template .semversioner/config/template.j2

The template uses Jinja2, a templating language for Python. A basic example:

# Changelog
{% for release in releases %}

## {{ release.version }}

{% for change in release.changes %}
- {{ change.type }}: {{ change.description }}
{% endfor %}
{% endfor %}

If you included custom attributes (e.g., pr_id, issue_id) using the add-change command, you can reference them in your template. You also have access to current_version:

# Changelog
Note: version releases in the 0.x.y range may introduce breaking changes.

# Current version: {{ current_version }}

{% for release in releases %}

## {{ release.version }}{{ ' (' + release.created_at.strftime('%Y-%m-%d') + ')' if release.created_at }}

{% for change in release.changes %}
- {{ change.type }}: {{ change.description }}{{ ' (#' + change.attributes.pr_id + ')' if change.attributes }}{{ ' (J' + change.attributes.issue_id + ')' if change.attributes }}
{% endfor %}
{% endfor %}

Filtering the changelog

You can filter the changelog by only showing changes for a specific version:

semversioner changelog --version "1.0.0"

Alternatively, you can filter changes for the last released version:

semversioner changelog --version $(semversioner current-version)

Getting the current version

You can retrieve the currently released version of your project:

semversioner current-version

Getting the next version

As part of the CI/CD workflow, sometimes you want to release dev, rc, or other pre-release packages. For this purpose, the next-version command can be issued to compute the upcoming version based on the current changeset. This will not modify any files on disk.

semversioner next-version

Global Options

  • --path: Specify a custom base path for your project. Defaults to the current directory. Example: semversioner --path /path/to/project release

License

Copyright (c) 2026 Raul Gomis. MIT licensed, see LICENSE file.


Made with ♥ by Raul Gomis.

Metadata

Release files for semversioner 3.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for semversioner 3.1.0
File Size Uploaded Provenance Actions
semversioner-3.1.0.tar.gz 13.1 kB With provenance Details for semversioner-3.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for semversioner 3.1.0
File Interpreter ABI Platform Actions
semversioner-3.1.0-py3-none-any.whl Python 3 none any Details for semversioner-3.1.0-py3-none-any.whl

Total release size: 26.2 kB

Release files / semversioner-3.1.0.tar.gz

Download URL semversioner-3.1.0.tar.gz
Size 13.1 kB
Tags Source
SHA-256 checksum
How to use checksums
d3b620609d38967ac9a0a099226623aef4d5c421c513c5e3c189adb426e21ced
BLAKE2b-256 checksum
How to use checksums
226bbbc7290e276aba022d1d383219d87a57854a7551c898fbae34736e013df3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 7, 2026.

Transparency log

Release files / semversioner-3.1.0-py3-none-any.whl

Download URL semversioner-3.1.0-py3-none-any.whl
Size 13.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0bd688fd71c9f2aedca012a15f7f58377618e5f1abd6fc1d1c805af6a1f5064f
BLAKE2b-256 checksum
How to use checksums
19db4b9591e465918c77ff8169b926e3e24085cf69118e8b9b3377bf466f9e73
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 7, 2026.

Transparency log

Security for semversioner 3.1.0

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.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for semversioner-3.1.0.tar.gz

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 Nov 7, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

3.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page