Acknowledgements

Molt is an independent open-source project. It is built on standards, libraries, and ideas that other people designed and maintain, and this page names them.

changesets

Molt's workflow comes from changesets, the release tool for JavaScript monorepos. The shape of a changeset file, the split between recording intent and consuming it, the max-bump flattening rule, and the fixpoint pass that propagates a version bump to dependents are all ideas molt learned there.

Reading the changesets source is what made molt's engine possible. The three-pass release plan in particular is a subtle piece of work, and having a reference implementation to study and to test against removed most of the risk from building the Python equivalent. Molt's engine is validated against test fixtures derived from that project.

Molt is a separate tool for a separate ecosystem. It targets PEP 440 versions, PEP 508 requirements, and PyPI, so many of its rules resolve differently. Molt and changesets sets the two side by side. Where molt keeps a changesets behavior, it keeps it because it is right, not because it is inherited.

changesets is MIT-licensed, and thanks are due to its maintainers and contributors.

Python packaging standards

Molt implements behavior specified by the Python packaging community:

StandardWhat molt uses it for
PEP 440Version identifiers, ordering, prerelease and development spellings
PEP 508Dependency specifiers and the constraints molt rewrites
PEP 503Distribution name normalization
PEP 517 / PEP 621Build backends and [project] metadata
PEP 592Yanking a released version
PEP 621 and PEP 639Manifest and license metadata molt reads and writes

The Python Packaging Authority writes and maintains these, along with packaging, the reference implementation molt does all of its version and specifier math with. Molt hand-rolls none of it, which is what makes its answer to "does this version satisfy this constraint?" the same answer pip and uv give.

Libraries

LibraryRole in molt
packagingPEP 440 and PEP 508 versions, specifiers, and ordering
uvThe workspace model molt discovers, and the lockfile it refreshes
Typer and ClickThe command surface and the external-editor primitive
RichTerminal rendering
questionaryInteractive prompts
PydanticConfiguration validation and the published JSON schema
tomlkitComment- and format-preserving pyproject.toml edits
ruamel.yamlChangeset front matter, on YAML 1.2
Jinja2Changelog templating
httpxThe forge and PyPI HTTP client

The documentation site runs on Rspress.

Prior work in Python

the-roaring/pychangeset brought the changeset model to Python before molt did, and reading it was useful. It is a clear statement of the problem, and the questions its issue tracker raised shaped two of molt's early decisions: keeping the supported Python floor low, and putting the forge behind a seam from the first commit.

changepacks takes a polyglot approach to the same model from Rust, and is worth a look if you release across more than one language ecosystem.

Molt is one answer to Python release automation. These are others, and one of them may fit your project better:

  • hatch and uv version -- set and bump a single package's version directly.
  • setuptools-scm and hatch-vcs -- derive a version from git tags.
  • python-semantic-release -- derive versions and changelogs from conventional commit messages.
  • towncrier -- news fragments assembled into a changelog, a model close to molt's for the changelog half of the problem.

Trademarks

Molt is not affiliated with, endorsed by, or sponsored by the changesets project, the Python Packaging Authority, Astral, PyPI, GitHub, or any other project named on this page. Product names belong to their respective owners.