Skip to main content

bmk

CI CodeQL License: MIT Open in Codespaces PyPI PyPI - Downloads Code Style: Ruff codecov Maintainability security: bandit

Makefiles are great, and every tool that set out to replace them started by asking you to stop using one. That is the tell. make is fifty years old, sits on every machine, and hands a stranger exactly one thing to type. Whatever is wrong here, it is not make.

It is the shell inside it. A recipe is a string handed to bash, so your build logic is stringly-typed and OS-specific, and your prose gets parsed as code. Ours once took a commit message reading fix(cli): tidy up, handed it to bash, and bash did what bash does with a parenthesis. It committed half the sentence and pushed it.

bmk is a build, test and release runner for Python projects. It keeps the Makefile and throws out the bash. You still type make test; bmk reads your pyproject.toml, provisions your venv with uv, and runs the gates. Every command is cross-OS Python with no shell anywhere, so the same make test runs on Linux, macOS and Windows. We deleted all 78 of our own .sh and .ps1 files rather than keep two of everything.

uvx bmk install    # drops the Makefile in; installs nothing permanent
make test          # from here on, just make

Requires uv (there is no pip fallback) and Python 3.10+.

Key features

  • One Makefile, versioned, that updates itself. Every project gets the same template, and it regenerates when bmk updates, so your repos cannot drift apart.
  • No shell, anywhere. Every command is cross-OS Python, and every stage is an argv list rather than a shell string. Nothing gets handed to bash to re-parse, including your own stages and your commit messages.
  • Your dependencies and bmk's never mix. bmk installs once per machine and holds its own toolchain and nothing of yours. Your packages live in the project's .venv, and that is the environment your tests, type-checker and audit all run against - the same one, so they cannot disagree.
  • Staged pipelines, parallel where it is safe. Stages run in order; stages sharing an order run together. Extend any pipeline from your pyproject.toml: add, remove or replace stages in TOML.
  • Quiet until it matters. JSON by default: tool output is captured and shown only when a stage fails, otherwise you get one summary line. Pass --human when you want the noise.
  • Batteries included. Formatting and linting, type-checking, security and vulnerability audits, import-contract checks, tests with coverage, shell and PowerShell linting, version bumping, tagging, GitHub releases (CI publishes to PyPI), and Codecov upload.

Documentation

Page What is in it
Install uv, pipx, pip, Poetry/PDM, from git or from build artifacts
make targets every target and its aliases
CLI reference every command, option and exit code
pyproject reference every pyproject.toml section bmk reads, with defaults
Pipelines and stages what runs when, and how to change it
Email send-email and send-notification
Concept the design
ADRs the decisions, and why
Changelog what changed
Contributing how to work on bmk

License

MIT - see LICENSE.

Metadata

Release files for bmk 3.22.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 bmk 3.22.0
File Size Uploaded Provenance
bmk-3.22.0.tar.gz 707.0 kB Without provenance Details

Built distribution (wheel)

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

Total release size: 975.7 kB

Release files / bmk-3.22.0.tar.gz

Download URL bmk-3.22.0.tar.gz
Size 707.0 kB
Tags Source
SHA-256 checksum
How to use checksums
167bdb8264a8745d571fd8b9d51fead0121140f230227d42a086682652005dc5
BLAKE2b-256 checksum
How to use checksums
2197b3917f5d3a5a6b25e2e9d2ed2d25eb48a27d32aeb29f065349f01fcc1608
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / bmk-3.22.0-py3-none-any.whl

Download URL bmk-3.22.0-py3-none-any.whl
Size 268.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c157b156bff251ecb341e8e80966cde3a5c452c33723a61a5a22333e9bb19f89
BLAKE2b-256 checksum
How to use checksums
24b3a2fff36ee0f8c46ef4724b31bfc5f0666e64b3fa05928a4a71b93e5a6af7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Security for bmk 3.22.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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

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.

Release history Release notifications | RSS feed

This release

3.22.0 This release

2 release files No 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