Skip to main content

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. denver is optimized to run only necessary stages, so it stays fast.

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. Stuck below that? Run the script with uv run src/denver.py, e.g by setting alias denver="uv run $PWD/src/denver.py". Alternatively grab a prebuilt executable from a release, or build one yourself with uv run poe pyinstaller. (Between 3.9 and 3.11? Regular installs work fine -- only denver.toml configs need >=3.11, for tomllib; denver.yml/denver.yaml works everywhere denver itself does.)

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 so 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 MYVAR

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. Its 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.

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.6.1.tar.gz (611.4 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.6.1-py3-none-any.whl (185.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: denver_tool-1.6.1.tar.gz
  • Upload date:
  • Size: 611.4 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.6.1.tar.gz
Algorithm Hash digest
SHA256 fd9e026c0a4b272d9a176e9da81ca7082976750feaccb596bddebd827f91e7b3
MD5 c5e1d6b5a336cab7a9018805f8ed4d42
BLAKE2b-256 f8a8d7ec62be61309425a4c1005c169b923a82a7484fb266853fdddca01b572d

See more details on using hashes here.

Provenance

The following attestation bundles were made for denver_tool-1.6.1.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.6.1-py3-none-any.whl.

File metadata

  • Download URL: denver_tool-1.6.1-py3-none-any.whl
  • Upload date:
  • Size: 185.0 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.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3c112dc47b93228c4c5eca5f0eddbf48904b436082e2908e22782c3f9651274c
MD5 b8811202d498d39831b7709f74bec0b6
BLAKE2b-256 1a2f970e5398afd095a0fffe779a28239d469312dbd2544e4c35b5abcec55c3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for denver_tool-1.6.1-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

This release

1.6.1 This release

2 files

1.6.0

2 files

1.5.3

2 files

1.5.2

2 files

1.5.1

2 files

1.5.0

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