Skip to main content

denver

logo

Development Environments as code — reproducible, flexible, simple and fast.

CI codecov PyPI Python versions License: Apache 2.0

Development Environment Launcher — declares dev environments in a denver.toml: reproducible and layerable to fit your project's needs.

What problem does this solve?

Every project needs some setup before it builds — a fresh clone, a submodule init, a venv, a toolchain install. How much varies wildly, but the pattern is the same: you run a pile of one-off steps to get a working build the first time, then forget which ones to rerun after switching branches. The result is broken builds and "works on my machine" debugging that has nothing to do with your actual code.

denver fixes this by making setup declarative. You describe the steps a project needs in a denver.toml, and denver runs them the same way every time — for you, for teammates, and in CI. It only runs the stages your project actually needs, so it stays fast, and it has no opinion about which tools you use: denver just runs what you declare.

Read the full walkthrough → — the problem built up one step at a time, from that first script to import:-based inheritance across a whole fleet of projects.

Documentation

Built documentation is available on GitHub Pages.

Install

pip install denver-tool   # or: uv tool install denver-tool

Alternatively, call src/denver.py directly, no install needed:

src/denver.py --version

or set up an alias so it behaves like an installed command:

alias denver="$PWD/src/denver.py"
denver --version

For more alternatives how to use or install denver see Install denver →.

Tab Completion

Tab completion works in bash, zsh, and fish.

bash/zsh:

eval "$(denver complete)"

fish:

denver complete | source

See Shell completion → for making it permanent.

Try it

denver run examples/howto-env -- pytest examples/howto-env/tests

A minute or two later (much less on repeat runs), that one command has built a container, a Python venv, a hand-installed tool, and a conan-installed toolchain, applied a team convention, and run tests proving all five actually work — from a single denver.toml, identically on your machine or your colleague's.

Denver in 5 minutes → walks through each stage and explains it, including all the flags and config options you'll actually use. For every flag, see CLI arguments → or run denver --help.

Known limitations

denver has zero runtime dependencies. Its config format is TOML (denver.toml), parsed with the standard library's tomllib — hence the >=3.11 floor. Nothing extra to install, on the host or inside a docker-wrapped image: a Dockerfile only needs python3 itself, since denver re-invoked inside the container needs nothing beyond the interpreter.

Note: stuck on Python < 3.11? Grab the prebuilt executable from a release, or build one yourself with uv run poe pyinstaller, and use that binary instead — see Prebuilt Binary. Alternatively run with uv run src/denver.py, e.g by setting alias denver="uv run $PWD/src/denver.py".

Contributing

Bug reports, feature requests and pull requests are welcome — see doc/contributing/development.md for the workflow (uv run poe all runs lint, format, mypy and the test suite; denver keeps 100% coverage).

License

Apache License 2.0 — 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

denver_tool-1.5.0.tar.gz (486.1 kB view details)

Uploaded Source

Built Distribution

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

denver_tool-1.5.0-py3-none-any.whl (143.3 kB view details)

Uploaded Python 3

File details

Details for the file denver_tool-1.5.0.tar.gz.

File metadata

  • Download URL: denver_tool-1.5.0.tar.gz
  • Upload date:
  • Size: 486.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for denver_tool-1.5.0.tar.gz
Algorithm Hash digest
SHA256 c237cd28dba693c6b32501c9e96972c4c5a1225db9b6c7d73aac5790d4786f2f
MD5 58790a9f75285190b75f12d22bcfd147
BLAKE2b-256 466619d4222d8b73e7c5429bf8b35035fcb17edf8880dc426622d2557ffa5566

See more details on using hashes here.

Provenance

The following attestation bundles were made for denver_tool-1.5.0.tar.gz:

Publisher: publish.yml on thorsten-klein/denver

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file denver_tool-1.5.0-py3-none-any.whl.

File metadata

  • Download URL: denver_tool-1.5.0-py3-none-any.whl
  • Upload date:
  • Size: 143.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for denver_tool-1.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c82e0273265f4f5fba6bc291cc3b99531da9024e7fdc00b0d9a9d09405c65518
MD5 fd9c08297403602ae69f15ff2cfaf78d
BLAKE2b-256 0fe4938d461952bc1ce039817700845979fc8d5ba38e7718126bbf9c3137dc82

See more details on using hashes here.

Provenance

The following attestation bundles were made for denver_tool-1.5.0-py3-none-any.whl:

Publisher: publish.yml on thorsten-klein/denver

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.6.4

2 files

1.6.3

2 files

1.6.2

2 files

1.6.1

2 files

1.6.0

2 files

1.5.3

2 files

1.5.2

2 files

1.5.1

2 files

This release

1.5.0 This release

2 files

1.4.1

2 files

1.4.0

2 files

1.3.0

2 files

1.2.2

2 files

1.2.1

2 files

1.2.0

2 files

1.1.0

2 files

1.0.4

2 files

1.0.3

2 files

1.0.2

2 files

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