A release orchestrator for Python and JavaScript packages
Project description
distlift
distlift is a small command-line helper for people who ship software packages. If your project lives in Git and you use a version number (like 1.2.3) that you bump when you release, distlift can automate the boring steps: update the version in your project files, refresh a changelog from recent commits, create a Git commit and tag, and optionally push to your remote or build and publish installable packages.
You run it from a terminal in your project folder. It is aimed at Python and JavaScript projects out of the box; advanced users can extend it with plugins.
What you need first
- Python 3.11 or newer installed on your computer.
- Your code in a Git repository (distlift talks to Git for tags and history).
- A habit of running terminal commands from the folder that contains your project (the “repo root”).
Install
Open a terminal and run:
pip install distlift
If you use pip only for your user account, that is fine. After install, you
should be able to run:
distlift --help
If that prints help text, the tool is on your path. You can also run it as
python -m distlift if your Python environment prefers that style.
The simplest workflow
From your project’s root directory, with a clean saved state in Git (no half-finished edits you are not ready to commit), run:
distlift
With no extra words, distlift performs a patch release: it bumps the
last part of the version (e.g. 1.0.4 → 1.0.5), updates your manifest
(such as pyproject.toml or package.json), can update CHANGELOG.md when
that is enabled, then commits, tags, and pushes according to your settings.
You can pass one of these on the same command instead: --major,
--minor, --patch, or --version / -v with an exact version (for example
distlift --minor or distlift --version 2.0.0). You cannot combine two of
them on one run.
Practice run (nothing is written to Git):
distlift --dry-run
That only shows what would happen—safe when you are learning.
Skip the changelog for one run:
distlift --no-changelog
Keep the changelog but do not open an editor to tweak the new entry:
distlift --no-changelog-editor
After a successful release, build installable files locally:
distlift --build
Build and upload to a registry (only when you have publish credentials and configuration set up):
distlift --publish
More detail in the log:
distlift -V
or
distlift --verbose
Work on another folder without cd there:
distlift --repo-root "C:\path\to\your\repo"
(Use the path style your operating system expects.)
Choosing how big the version jump is
The bare distlift shortcut (see above) accepts --major, --minor,
--patch, or --version / -v the same way as distlift release simple.
When you prefer the explicit subcommand, use:
distlift release simple --patch
distlift release simple --minor
distlift release simple --major
distlift release simple --version 2.0.0
You must pick exactly one of those version options for release simple.
Add --dry-run anytime to rehearse.
Monorepos (several packages in one repository)
If your repository is configured for multiple packages, each with its own version and tag, use:
distlift release monorepo --all-changed
or release specific names:
distlift release monorepo --package my-lib --package my-app
You can pass --major, --minor, --patch, or --version /
-v on release monorepo as well (at most one per run). If you pass none
of these, --default-bump controls the bump kind (it defaults to patch).
Unified version: --version 2.0.0 sets that same next version on
every package included in that release (still respecting each package’s
version format). On an interactive terminal, distlift asks you to confirm
before continuing. In non-interactive environments (typical CI), no prompt is
shown.
Add --dry-run to preview what would happen without writing to Git.
distlift can maintain a Keep a Changelog-style CHANGELOG.md using your
Git history (and conventional commit messages when enabled).
See what would be added for a version, without saving:
distlift changelog preview --version 1.2.3
Write or update the changelog file for that version:
distlift changelog update --version 1.2.3
By default this may open your text editor so you can polish the entry; add
--no-editor to skip that step.
Create a starter changelog file if you do not have one:
distlift changelog init
In monorepo setups, many changelog commands accept --package <name> so the
right subfolder is used.
Configuration commands
Show the settings distlift is actually using (and where each value came from):
distlift config show
Check that configuration is valid:
distlift config validate
Create or open config files for your user account or the whole machine (these create starter files or open them in your editor):
distlift config init-user
distlift config edit-user
distlift config init-system
distlift config edit-system
System-level files on Windows often live under shared “Program Data” folders and may need administrator rights to edit.
Choosing the text editor
Whenever distlift needs to open a file in an editor (when polishing a
generated changelog entry, or when you run distlift config edit-user or
distlift config edit-system), it looks for a command to launch in this
order:
- The
GIT_EDITORenvironment variable (the same one Git itself uses for commit messages). - The
VISUALenvironment variable (the POSIX convention for a full-screen editor such asvim,nano, orcode --wait). - The
EDITORenvironment variable (the older POSIX fallback, e.g.notepadon Windows). - The
editorsetting from your distlift config file, or theDISTLIFT_EDITORenvironment variable.
So if none of the standard editor environment variables are set on your system, you can still tell distlift which editor to use by writing one line in your user config:
editor = "code --wait"
You can place that in any distlift TOML layer
(distlift.toml / .distlift.toml, [tool.distlift] inside
pyproject.toml, your user config file, or the system one). The values
saved by distlift config init-user already include a commented-out
example.
distlift config show prints the effective editor (or (unset) when no
layer provides one).
Plugins
List extensions distlift loaded (built-ins and any you configured):
distlift plugins list
Getting unstuck
Every command accepts --help, for example:
distlift changelog --help
distlift release simple --help
That lists all flags for that command. If something fails, read the message in the terminal—distlift usually explains whether the problem is configuration, Git state, or a missing file.
distlift is release automation for developers; it performs real Git
operations when not in --dry-run. Always commit or stash unrelated work,
read --help before unfamiliar flags, and use --dry-run until you are
comfortable with the plan.
Project details
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 distlift-0.1.4.tar.gz.
File metadata
- Download URL: distlift-0.1.4.tar.gz
- Upload date:
- Size: 106.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7ec5f0c9828a4b24aa9d448a102afa108e8f9ca51c97db1ba162d4a34dfeb1c
|
|
| MD5 |
24b7827125f55a88d6b3a3789c08c97e
|
|
| BLAKE2b-256 |
01f51b75a5c089f7de4114c749cb9df657a43fcac8ed38d7de6f5f8d59de05bd
|
Provenance
The following attestation bundles were made for distlift-0.1.4.tar.gz:
Publisher:
publish.yml on pyl1b/distlift
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
distlift-0.1.4.tar.gz -
Subject digest:
b7ec5f0c9828a4b24aa9d448a102afa108e8f9ca51c97db1ba162d4a34dfeb1c - Sigstore transparency entry: 1525026238
- Sigstore integration time:
-
Permalink:
pyl1b/distlift@0f9cb1f3a06e561f0c335fb0d0079676de9f98a6 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/pyl1b
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0f9cb1f3a06e561f0c335fb0d0079676de9f98a6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file distlift-0.1.4-py3-none-any.whl.
File metadata
- Download URL: distlift-0.1.4-py3-none-any.whl
- Upload date:
- Size: 102.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f24b48bf9dfbc730f1e596c0b0a3c5dced78dbc067702168b25fd30c671694ac
|
|
| MD5 |
a7c26e13c560d56286296179cca2e05b
|
|
| BLAKE2b-256 |
afe2525c56fc597545087d9590857154c6b246d380af87b45d683491b3c3055e
|
Provenance
The following attestation bundles were made for distlift-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on pyl1b/distlift
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
distlift-0.1.4-py3-none-any.whl -
Subject digest:
f24b48bf9dfbc730f1e596c0b0a3c5dced78dbc067702168b25fd30c671694ac - Sigstore transparency entry: 1525026248
- Sigstore integration time:
-
Permalink:
pyl1b/distlift@0f9cb1f3a06e561f0c335fb0d0079676de9f98a6 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/pyl1b
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0f9cb1f3a06e561f0c335fb0d0079676de9f98a6 -
Trigger Event:
push
-
Statement type: