7. Deployment View
denver has no server side. It runs once, on the machine that invokes it, and
exits or exec()s into the final command.
7.1 Where denver runs
flowchart TB
subgraph host["Host: workstation or CI runner"]
dv["denver<br/>(checkout, installed, or single-file binary)"]
envdir["env dir<br/>denver.yml, hooks, recipes, compose files"]
state["env dir/.denver/<config stem>/<br/>venv, install trees, fingerprints, logs, lock"]
cache["~/.cache/denver<br/>shared downloads and tool caches"]
tools["uv · conan · west · git · docker"]
subgraph cont["Optional: compose container"]
inner["denver, re-invoked with --skip docker<br/>builds the env in here"]
end
end
dv --> envdir
dv --> state
dv --> cache
dv --> tools
dv -.relocation.-> inner
inner --> state
7.2 How denver itself is shipped
Way |
Command |
Notes |
|---|---|---|
From a checkout |
|
No install step. Used by this repo’s own tasks |
From PyPI |
|
Console script |
Prebuilt binary |
download the release archive |
PyInstaller single file. Built in CI for x64-linux and macOS (x64 + arm64) |
Editable |
|
For working on denver itself |
Vendored |
a |
denver provisions denver |
All four enter the same main(). Version comes from git describe via
setuptools-scm.
7.3 Where state lives
Location |
Owner |
Contents |
Lifetime |
|---|---|---|---|
|
denver |
venvs, conan install tree, fingerprints, logs, |
Per env, per config file. Delete the checkout, delete the state |
|
denver |
downloads and caches worth sharing between envs |
Cross-checkout |
|
version control |
|
Committed source |
Container image |
the project’s own Dockerfile |
whatever it installs |
Rebuilt by the |
State sits with the env, not in a shared name-keyed pool. Two checkouts
never collide. A bind-mounted workspace carries its state into the container
with nothing extra. <config stem> is a level of its own so
denver.debug.yml and denver.release.yml in one folder stay separate.
DENVER_ENV_WORKDIR overrides the location. It is also the way out when the
env dir is read-only — denver dies rather than silently picking another
place.
7.4 CI
Workflow |
Does |
|---|---|
|
lint, types, security, tests, coverage on Linux and macOS |
|
runs bundled examples end to end |
|
PyInstaller binaries for x64-linux and macOS x64 + arm64 |
|
attach binaries to a release, publish to PyPI |
|
builds |
docs.yml builds by running examples/doc-env — denver’s own docs are built
by denver. Two builders run: HTML for people, Markdown for AI tools, the
latter published under markdown/.
7.5 Network
denver opens no connections of its own, except the download provider’s
transfers. Everything else is whatever uv, conan, west or docker do
downstream. Offline modes exist per provider (no-index, conan without
remotes, fingerprint-skipped west update).