denver
Development Environments as code — reproducible, flexible, simple and fast.
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.9and always supportsdenver.ymlconfigs;denver.tomlneeds python>=3.11(uses stdlibtomllib). Stuck below3.11or even below3.9? Grab a prebuilt executable from a release, which bundles python 3.12. Or create a venv with a newer python, for exampleuv venv --python 3.14, and runuv run src/denver.py(alternatively withalias 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.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| denver_tool-1.7.0.tar.gz | 739.3 kB | With provenance | Details for denver_tool-1.7.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| denver_tool-1.7.0-py3-none-any.whl | Python 3 | none | any | Details for denver_tool-1.7.0-py3-none-any.whl |
Total release size: 954.3 kB
Release files / denver_tool-1.7.0.tar.gz
| Download URL | denver_tool-1.7.0.tar.gz |
|---|---|
| Size | 739.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
90504c15fed2d5a35e15dbf304173e99836bc7e4c1a261ce9815948748ca192f
|
|
BLAKE2b-256 checksum How to use checksums |
e261dda4d162fd34a54f7e84d5676c099c22dc90117b4b2942083047f25f9b1c
|
| 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 Oct 4, 2026.
Transparency logRelease files / denver_tool-1.7.0-py3-none-any.whl
| Download URL | denver_tool-1.7.0-py3-none-any.whl |
|---|---|
| Size | 215.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
85517269e5180d096b97a5b7d4d3f4370b94a116184f86071a056eb0470ea112
|
|
BLAKE2b-256 checksum How to use checksums |
e63cd54a54c4cc4e37167456ac21c1b62988eeaf6e87920200c8e4115e83ec67
|
| 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 Oct 4, 2026.
Transparency logSecurity for denver-tool 1.7.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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for denver_tool-1.7.0.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 Oct 4, 2026.
Transparency logA 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.