Skip to main content
Change of provenance

The repository or configuration that created this release differ from a previous release. View details.

denver

logo

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

CI codecov Quality Gate Status PyPI Python versions License: Apache 2.0

Development Environment Launcher — declares dev environments in a denver.yml (or 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.

denver gives you a declarative way to setup your environment. You describe the steps a project needs in a denver.yml, and denver runs them — the same way every time on any machine — for you, for teammates, and in CI.

Documentation

You can find the full documentation in Markdown here

Additionally it is hosted on GitHub Pages.

Install

You can install denver with pip:

pip install denver-tool

If you prefer, you can also install with uv. Please refer to official uv documentation https://docs.astral.sh/uv/getting-started/installation how to install uv

uv tool install denver-tool

Instead of installing denver, you can also run the script src/denver.py directly:

src/denver.py --version

For easier usage you can also set up an alias so it behaves like an installed command:

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

Note: denver needs Python >=3.9 and always supports denver.yml configs; denver.toml needs python >=3.11 (uses stdlib tomllib). Stuck below 3.11 or even below 3.9? Grab a prebuilt executable from a release, which bundles python 3.12. Or create a venv with a newer python, for example uv venv --python 3.14, and run uv run src/denver.py (alternatively with alias denver="uv run $PWD/src/denver.py").

For more details about how to install or run denver see Install denver →.

Tab Completion

Tab completion works in bash, zsh, and fish.

bash/zsh:

eval "$(denver complete)"

fish:

denver complete | source

For more details see Shell completion →.

Try it out

Have a look at the examples/simple-env/denver.yml:

stages:
- print-vars-before
- set-vars
- print-vars-after

print-vars-before:
  provider: custom
  cmd: 'echo "[print-vars-before] MYVAR=$MYVAR FOO=$FOO BAR=$BAR"'

set-vars:
  provider: custom
  cmd: 'echo "[set-vars] sourcing custom.sh..."'
  source: custom.sh

print-vars-after:
  provider: custom
  cmd: 'echo "[print-vars-after] MYVAR=$MYVAR FOO=$FOO BAR=$BAR"'

As you can see, this environment consists of three stages.

  • First stage prints out the variables and their values how they are currently set (most probably empty)
  • Second stage prints some text, and it sources custom.sh script. In this script each variable is set to a value
  • Third stage prints out the variables and their values again to see if the second stage has worked

You can run an own command (e.g. printenv FOO MYVAR BAR) within this environment as following:

denver run examples/simple-env -- printenv FOO MYVAR BAR

Output:

[print-vars-before] MYVAR= FOO= BAR=
[set-vars] sourcing custom.sh...
[print-vars-after] MYVAR=1 FOO=2 BAR=3
2
1
3

For available flag (e.g. the -q, see CLI arguments → or run denver --help respectively denver run --help.

You want to see some more advanced example? Have a look at denver in 5 minutes →.

You want to see some even more advanced example? Have a look at denver in 30 minutes →

Known limitations

denver has exactly one runtime dependency: PyYAML. denver's default config format is YAML (denver.yml/denver.yaml), parsed with PyYAML — that's what lets the floor be as low as python >=3.9. denver.toml is supported too, but only where tomllib is importable (stdlib only from python >=3.11) — on an older interpreter it's rejected with a clear error instead of a silent misread. See install or run denver.

Contributing

Bug reports, feature requests and pull requests are very welcome — see doc/contributing/development.md for the workflow.

To sum up: uv run poe all should always pass.

License

Apache License 2.0 — see LICENSE.

Metadata

Release files for denver-tool 1.6.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Change of provenance

The repository or configuration that created these release files differ from that of a previous release.

We recommend inspecting the repository and configuration before proceeding. View details.

Source distribution (sdist)

Source distribution for denver-tool 1.6.6
File Size Uploaded Provenance Actions
denver_tool-1.6.6.tar.gz 669.5 kB With provenance Details for denver_tool-1.6.6.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for denver-tool 1.6.6
File Interpreter ABI Platform Actions
denver_tool-1.6.6-py3-none-any.whl Python 3 none any Details for denver_tool-1.6.6-py3-none-any.whl

Total release size: 862.2 kB

Release files / denver_tool-1.6.6.tar.gz

Change of provenance

This file belongs to a release with changed provenance: the repository or configuration that created the release files differ from that of a previous release.

We recommend inspecting the repository and configuration before proceeding. View details.

Download URL denver_tool-1.6.6.tar.gz
Size 669.5 kB
Tags Source
SHA-256 checksum
How to use checksums
6d55204992b21109d885ad4add37d8370b331a07a608194c5eb62aefa2e8e956
BLAKE2b-256 checksum
How to use checksums
c2b6050c1671ce7a8d3e48af69bd4f72b19240e480a6ac998f5f25299591b376
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release files / denver_tool-1.6.6-py3-none-any.whl

Change of provenance

This file belongs to a release with changed provenance: the repository or configuration that created the release files differ from that of a previous release.

We recommend inspecting the repository and configuration before proceeding. View details.

Download URL denver_tool-1.6.6-py3-none-any.whl
Size 192.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bf900b94dd7f481ae12b6bcb4cb17c66cee422d03b4be9dcd28f2d90e2b269c7
BLAKE2b-256 checksum
How to use checksums
11f0ff2aa037a9b6abb9f9132c1dc84337b16144a596c4919121aabc14795bda
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Security for denver-tool 1.6.6

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.

Change of provenance

The repository and configuration that created this release differ from a previous release.

While this could reflect a routine change by the project maintainers, it may also indicate that the release files have been compromised.

Select from 2 files

Attestation for denver_tool-1.6.6.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

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.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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