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, PyPI release, 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.

Download files

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

Source Distribution

bmk-3.9.1.tar.gz (347.7 kB view details)

Uploaded Source

Built Distribution

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

bmk-3.9.1-py3-none-any.whl (180.9 kB view details)

Uploaded Python 3

File details

Details for the file bmk-3.9.1.tar.gz.

File metadata

  • Download URL: bmk-3.9.1.tar.gz
  • Upload date:
  • Size: 347.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bmk-3.9.1.tar.gz
Algorithm Hash digest
SHA256 cbb849224b5d714178876ce877cd87fb4c506c76b8ed58622eb3f1d5ab59ece1
MD5 e5fbd72fdfb2223c93f39a68da889308
BLAKE2b-256 98b2d8c0efaee59a195b023525e89f0f563ae7c63197e014136df8d07993b60b

See more details on using hashes here.

File details

Details for the file bmk-3.9.1-py3-none-any.whl.

File metadata

  • Download URL: bmk-3.9.1-py3-none-any.whl
  • Upload date:
  • Size: 180.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bmk-3.9.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4468bd831b958aea53f0b6f0ee2e6c94d1fcd44b10d8ec7075058eed13a0f534
MD5 8263ec0750af49db652ddc15c767f2d4
BLAKE2b-256 068ebcb3e8ee1082ee4cc5bcff54f6c7cce7f042d70a847b1ae9953520f9feee

See more details on using hashes here.

Release history Release notifications | RSS feed

3.17.0

2 files

3.16.0

2 files

3.15.0

2 files

3.14.0

2 files

3.13.2

2 files

3.13.1

2 files

3.13.0

2 files

3.12.2

2 files

3.12.0

2 files

3.11.2

2 files

3.11.1

2 files

3.11.0

2 files

3.10.1

2 files

3.10.0

2 files

This release

3.9.1 This release

2 files

3.9.0

2 files

3.8.2

2 files

3.8.1

2 files

3.8.0

2 files

3.7.1

2 files

3.7.0

2 files

3.6.0

2 files

3.5.0

2 files

3.4.0

2 files

3.3.1

2 files

3.3.0

2 files

3.2.0

2 files

3.1.7

2 files

3.1.6

2 files

3.1.5

2 files

3.1.4

2 files

3.1.3

2 files

3.1.2

2 files

3.1.1

2 files

3.1.0

2 files

3.0.1

2 files

3.0.0

2 files

2.9.6

2 files

2.9.5

2 files

2.9.4

2 files

2.9.3

2 files

2.9.2

2 files

2.9.1

2 files

2.9.0

2 files

2.8.2

2 files

2.8.1

2 files

2.8.0

2 files

2.7.1

2 files

2.7.0

2 files

2.6.0

2 files

2.5.1

2 files

2.5.0

2 files

2.4.0

2 files

2.3.3

2 files

2.3.2

2 files

2.3.0

2 files

2.2.1

2 files

2.2.0

2 files

2.1.0

2 files

2.0.16

2 files

2.0.15

2 files

2.0.14

2 files

2.0.13

2 files

2.0.12

2 files

2.0.7

2 files

2.0.6

2 files

2.0.5

2 files

2.0.4

2 files

2.0.3

2 files

2.0.2

2 files

2.0.0

2 files

Supported by

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