Skip to main content

dvt (devtemplate)

Dev-style named devcontainer templates, built and run directly via Docker or Podman.

Templates are fetched from jesserobertson/devcontainers's templates/ directory.

Install

pipx install dvt-cli

For a local checkout instead (e.g. to track main), use pipx install ./dvt from the repo root.

Usage

dvt sync
dvt feature list                 # "Pulls in" column: each feature's transitive dependsOn
dvt feature deps fastapi         # that feature's dependsOn graph (tree | dot | mermaid | --json)
dvt init ./my-project
dvt feature add fastapi            # run from inside a project with .devcontainer/devcontainer.json
dvt feature add agent
dvt up my-project
dvt ssh my-project
dvt run -n my-project pytest -q  # run one command inside the workspace, exit with its status
dvt forward -n my-project 2718   # reach an in-container :2718 server at http://localhost:2718
dvt info                        # from inside my-project - no name needed

dvt feature list's "Pulls in" column and dvt feature deps [name] both read a local cache of feature metadata — run dvt sync once after upgrading to populate it. dvt never writes the implied features into devcontainer.json; its builder already resolves dependsOn at image-build time, and these views just surface it.

Reaching a server inside a workspace

A workspace's own network isn't routable from the host, so a server you start inside one (a dev server, a notebook) isn't reachable at localhost until you forward its port.

Dynamically (no rebuild). dvt forward tunnels one or more ports over the same transport dvt ssh uses, until you Ctrl-C it:

dvt forward -n my-project 2718            # localhost:2718 -> container 127.0.0.1:2718
dvt forward -n my-project 8080:3000       # localhost:8080 -> container 127.0.0.1:3000
dvt forward -n my-project 9000:db:5432    # localhost:9000 -> db:5432 from inside

Or bind the tunnel to the lifetime of a command:

dvt run -n my-project -L 2718 just viz-notebooks   # marimo edit --port 2718, reachable while it runs
dvt ssh my-project -L 8888                          # tunnel stays up for the shell session

The workspace image needs one of socat, ncat, nc, or python3 on PATH (the relay runs inside the container). -L/--forward is repeatable.

Declaratively (at dvt up). appPort and forwardPorts in devcontainer.json are published to the host when the container is created:

{ "image": "...", "appPort": [2718] }

Because published ports are fixed at creation, changing them makes the next dvt up stop and ask for dvt up --rebuild rather than silently recreating the container.

Development

dvt is developed inside the jesserobertson/devcontainers monorepo, at dvt/. Clone that repo and run the commands below from dvt/.

The pixi default environment (what pixi run uses) carries pytest and hypothesis for the dev loop. A separate runtime environment (pixi run -e runtime ...) has none of that test tooling, for anyone who wants to confirm the package installs cleanly without it — actual distribution to end users is via pipx install, not pixi, so this is a verification aid rather than the real install path.

pixi install
pixi run pytest

Tasks

Each task below is a pixi run wrapper script; the ones with sub-commands dispatch on the first extra argument (e.g. pixi run test unit), so pixi run <task> alone isn't a valid invocation for those. pixi <task> (without run) never works — pixi requires the run verb to invoke a task.

Task Sub-commands What it does
pixi run quality check, typecheck, lint, format [--check], fix, coverage [--html] mypy + ruff lint/format, or auto-fix both with fix
pixi run test unit, integration, all, fast, clean pytest by tier — integration needs a real Docker/Podman runtime and isn't included in all/fast
pixi run docs serve [--port], build [--strict], status, clean mkdocs site under docs/ — serve runs a local dev server at localhost:8000
pixi run check-all — test all + quality check, for a full pre-push sanity check
pixi run clean — test clean + docs clean

Metadata

Release files for dvt-cli 0.5.0

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

Source distribution (sdist)

Source distribution for dvt-cli 0.5.0
File Size Uploaded
dvt_cli-0.5.0.tar.gz 221.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dvt-cli 0.5.0
File Interpreter ABI Platform
dvt_cli-0.5.0-py3-none-any.whl Python 3 none any Details

Total release size: 325.1 kB

Release files / dvt_cli-0.5.0.tar.gz

Download URL dvt_cli-0.5.0.tar.gz
Size 221.7 kB
Tags Source
SHA-256 checksum
How to use checksums
463d11885cffe31ebcd2568ab3850e093f4c99a39437d2acb0cb27194ada7d53
BLAKE2b-256 checksum
How to use checksums
f918f2fe1bb6dcb4616cf894c191f54356ea76a925286bc18b485ed7778681c9
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 3, 2026.

Transparency log

Release files / dvt_cli-0.5.0-py3-none-any.whl

Download URL dvt_cli-0.5.0-py3-none-any.whl
Size 103.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f7478bed68511df56323e4d2747e9f5a56d1bf5865305445f0b83e4ab3b4ef8f
BLAKE2b-256 checksum
How to use checksums
b481ac04a0a600ae03772c079ad89a87527632d94d7c89103c625e595f15ab97
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 3, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release 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