Skip to main content

Vommit

Vommit Oversees Making & Managing Installable Things

Vommit automates version bumps, changelogs, Git releases, builds, and publishing for uv-based Python packages using Conventional Commits.

Vommit requires Python 3.13 or newer, uv 0.7 or newer, and a static [project].version in pyproject.toml. Automatic version selection and the default release workflow also expect a Git repository, but this can be disabled via config.

Getting started

Install Vommit into the active environment:

uv pip install vommit

For a global installation, you can use something like uvenv, pipx, or uv tool:

uvenv install vommit
# or: pipx install vommit / uv tool install vommit

From a Python project directory, create or complete the Vommit configuration interactively:

vommit setup

To see all commands and options:

vommit --help

Starting a new project

vommit init --project-name mypkg

Runs uv init --package, configures Vommit in the result, and leaves a project that is ready to release, with a named branch, declared license, changelog, and initial commit.

The version starts at 0.0.0, so the first vommit bump derives the first release from its commits: 0.1.0 for a feature or 0.0.1 for a fix.

Each question it asks has a flag that pre-fills it, so --non-interactive takes the answers as given:

vommit init --project-name mypkg --non-interactive \
    --python 3.13 --license MIT --branch main --venv .venv \
    --remote git@example.com:me/mypkg.git --push
Flag Meaning
--python VERSION Minimum Python version; defaults to the interpreter running Vommit
--description TEXT Omitted from pyproject.toml when empty
--license SPDX Records [project].license; add the LICENSE file yourself
--branch NAME Release branch
--remote URL Add as origin
--message TEXT Initial commit message; empty makes no commit
--push Push that commit and record the upstream
--venv NAME Directory for the project's environment (venv, .venv, or none)
--pin-python Keep uv's .python-version file
--no-workspace Do not join an enclosing uv workspace

The environment is created inside the new project and installed in editable mode. Creating it (and installing) runs last and is never fatal: if it fails, the project is already made, so create it later with uv venv yourself.

Run inside an existing repository, uv init creates no repository of its own. Vommit then leaves that history, branch and remote alone, makes no commit, and writes the .gitignore uv skipped — without it a release would commit its own dist/.

Releasing

vommit release

Vommit bumps the version, runs clean and build, pushes the release commit and tag when Git integration is enabled, then publishes. Nothing is pushed if the build fails; a failed build after a bump can still be taken back with vommit bump --undo.

With Git integration enabled, a release refuses uncommitted changes by default: the build would include them, but the pushed commit would not. Commit or stash your work first, or pass --allow-dirty to publish the working tree as it stands. Build output such as dist/ should be ignored by Git.

Flag Meaning
--major, --minor, --patch Choose the version increment
--prerelease Create or advance a prerelease
--version VERSION Set an explicit version
--allow-dirty Release despite uncommitted changes
--yes Skip confirmations
--noop Preview the version, changelog, and commands without running the release
--no-bump Run the release pipeline for the current version; useful after a failed upload. Cannot be combined with a version-selection flag

If a previous attempt left the version tag on different code from HEAD, Vommit explains the mismatch and asks before publishing.

When no commit warrants a bump, release asks whether to publish the current version; bump simply stops.

For CI, provide UV_PUBLISH_TOKEN and pass --yes. A --noop run does not bump, build, push, publish, or resolve a PyPI credential. It still performs Git preparation checks, which may fetch the remote and, with git.on_wrong_branch = "switch", switch branches.

Commands

[tool.vommit.commands] holds the release commands. clean and build run first; Vommit then pushes the release commit and tag before publish and post_publish run. Leave a command empty to skip it.

[tool.vommit.commands]
clean = "rm -rf ./dist"
build = "uv build"
publish = "uv publish"
post_publish = ""          # runs after the publishing step, even if publish is empty

Environment variables such as $VAR are expanded when the configuration loads.

publish and post_publish run only when pypi.enabled = true.

PyPI credentials

vommit authenticate

Stores a PyPI token in your keyring under vommit/pypi. Vommit checks its format and verifies it against PyPI before storing it. Use --no-verify to skip these checks.

vommit authenticate                   # store or replace a token
vommit authenticate --clear           # remove the stored token, then ask for a new one
vommit authenticate --no-verify       # store without checking the token
vommit ensure-authenticated           # ensure a token is available
vommit ensure-authenticated --show    # show its source and a masked value

When publishing, Vommit looks in three places, in order:

  1. UV_PUBLISH_TOKEN in the environment
  2. the keyring, when pypi.use_keyring = true
  3. an interactive prompt

With keyring use enabled, a token entered at the prompt is stored. Set pypi.use_keyring = false to be asked on every release without storing the answer.

On headless or SSH systems, the default keyring backend may be unavailable. Install vommit[ssh] to add an ssh-agent-backed keyring, or disable keyring use and enter the token for each release.

Bumping versions and changelogs

vommit bump

bump derives the version change from Conventional Commit messages since the last release: breaking changes are major, feat is minor, and fix, perf, and docs are patch by default. A ! in a commit header or a BREAKING CHANGE footer counts as a breaking change; set allow_breaking_bang or allow_breaking_footer to false to ignore either. Use the version-selection, --prerelease, --allow-dirty, --noop, and --yes flags to override or preview the result.

It updates the project version, changelog, and (when Git integration is enabled) creates the configured release commit and tag. vommit bump --undo takes back the latest local bump, but refuses to rewrite a commit or tag that has already been pushed.

Prereleases do not receive separate changelog entries by default; their changes are included when the next stable release is made. Set changelog.include_prereleases = true to list them separately.

Configuration

Run vommit setup to create or complete [tool.vommit] interactively; use vommit setup --mode=all to revisit every setting, or vommit setup --non-interactive for defaults. For a project that does not exist yet, vommit init runs uv init first.

Where the version lives

setup detects a literal version in common package files alongside [project].version and offers to consolidate it, so releases do not leave a second version behind. It offers the same fix for dynamic = ["version"], which must be frozen before Vommit can bump it. Nothing is rewritten without being asked; vommit setup --non-interactive prints the proposed change and stops.

The most useful settings to revisit are:

Setting Purpose
confirm Turn routine release confirmations on or off.
prerelease_token Choose alpha, beta, or rc for --prerelease.
version_bump_map Map Conventional Commit types to version increments.
allow_breaking_bang, allow_breaking_footer Turn either breaking-change marker on or off.
git.enabled Turn off Git integration entirely: no commit, tag, or push.
git.origin Select the remote to push to.
git.branch, git.on_wrong_branch Select the release branch and how to handle a mismatch.
git.tag_format, git.commit_format Format the release tag and commit message. An empty tag format disables tagging; a release needs a commit format when Git is enabled.
git.commit_author Author the release commit as Name <email> instead of as yourself.
changelog.enabled Turn off changelog updates.
changelog.file, changelog.levels Choose the changelog location and displayed commit groups.
changelog.placeholder, changelog.entry_title_format Match the insertion marker and format generated entries.
pypi.enabled, pypi.use_keyring Control publishing and credential storage.
commands.clean, commands.build, commands.publish, commands.post_publish Define the release pipeline commands.

Migrating from python-semantic-release v7

vommit migrate

Reads [tool.semantic_release] from pyproject.toml, reports mapped, lossy, and unsupported settings, then asks whether to review the result, write it, or stop. Nothing is written before that choice. Use --yes to accept the translation, --on-unsupported=error to refuse unsupported settings, or --on-unsupported=skip for a shorter report.

Unsupported configurations are reported rather than silently discarded. Only pyproject.toml is read; setup.cfg is not supported.

If the project has a dynamic version, Hatchling and setuptools projects can be fixed during migration: the current version is frozen into [project].version, the backend hook is removed, and configured version files are changed to read installed metadata:

from importlib.metadata import version

__version__ = version(__package__)

The migration can then remove [tool.semantic_release] and the python-semantic-release dependency.

Download files

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

Source Distribution

vommit-0.1.0.tar.gz (62.0 kB view details)

Uploaded Source

Built Distribution

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

vommit-0.1.0-py3-none-any.whl (71.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: vommit-0.1.0.tar.gz
  • Upload date:
  • Size: 62.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"PikaOS","version":"4","id":"nest","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for vommit-0.1.0.tar.gz
Algorithm Hash digest
SHA256 b69c2e95e33d20160244d77e39d98c235315e358f5a7b40aadfe1770cb2c57e2
MD5 cb300483475eccf3f618d19f59cb1648
BLAKE2b-256 dbf542937e837fd162a1b520f4f6a3d26f6ef4928ee0cf89817a591217153893

See more details on using hashes here.

File details

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

File metadata

  • Download URL: vommit-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 71.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"PikaOS","version":"4","id":"nest","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for vommit-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 40fc99e1a63077235ae951340c93f8fd31ad6f7ee7f1a5388bcbe770173e2d2e
MD5 333d78b0b64293396090cea5bf06d163
BLAKE2b-256 c425b688c4b5a0e728ca3a9e6124e073d47ee495ab1284287475c49bc7591226

See more details on using hashes here.

Supported by

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