A tool for managing virtualenvs via a declarative config file
Project description
venvs is a tool for configuring, in a single file, a set of virtualenvs, which packages to install into each, and any binaries to make globally available from within.
It is a thin layer on top of uv, adding a declarative configuration format.
Installation
uv tool install venvs
uv must be installed and on your PATH.
Configuration
Create a file at ~/.local/share/virtualenvs/virtualenvs.toml (or wherever $WORKON_HOME points). Here’s an example:
[virtualenv.development]
install = [
"pudb",
"twisted",
]
link = ["trial"]
[virtualenv.app]
install = ["flask"]
python = "python3.12"
link = ["flask:flask-app"]
[virtualenv.tools]
install = ["ipython"]
link-module = ["IPython:ipy"]
Running venvs converge will create each virtualenv, install the specified packages, and symlink the named binaries into ~/.local/bin/.
Config Reference
Each [virtualenv.<name>] section supports:
- install
List of packages to install (supports $ENV_VAR and ~/ expansion).
- requirements
List of requirements files to install from.
- python
Python interpreter to use (default: python3).
- install-bundle
List of bundle names to include (see below).
- link
List of binaries to symlink into the link directory. Use "source:target" to rename, e.g. "black:black3.12".
- link-module
List of modules to make available as wrapper scripts that run python -m <module>. Use "module:name" to rename.
- post-commands
List of commands (as arrays) to run after converging, e.g. [["touch", "/tmp/done"]].
Bundles
Bundles are reusable package groups:
[bundle]
dev = ["pytest", "ruff", "mypy"]
[virtualenv.myproject]
install = ["mypackage"]
install-bundle = ["dev"]
Usage
venvs converge
Converge the configured set of virtualenvs:
$ venvs converge
Specific virtualenvs can be targeted:
$ venvs converge myproject tools
Options:
- --fail-fast
Stop on the first failure (default: continue and report errors at the end).
- --link-dir <path>
Directory to symlink binaries into (default: ~/.local/bin).
- --root <path>
Root directory for virtualenvs (default: platform-specific, or $WORKON_HOME).
Converge is idempotent – if the configuration and Python version haven’t changed and the virtualenv is healthy, it is skipped. Virtualenvs that are no longer in the configuration are automatically removed along with their symlinks. Broken virtualenvs (e.g. from a deleted Python installation) are automatically recreated.
Virtualenvs are converged in parallel.
venvs find
Find virtualenv paths:
$ venvs find # print the root directory $ venvs find name myproject # print the virtualenv path $ venvs find name myproject python # print path to a binary
Releasing
Releases are managed via cargo-release:
$ cargo release 2026.5.1
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file venvs-2026.5.1.tar.gz.
File metadata
- Download URL: venvs-2026.5.1.tar.gz
- Upload date:
- Size: 28.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37030b6cbb343598a1b3e9e97ab03c06f53a9216e8ca13edc4996ae5d56bd226
|
|
| MD5 |
a853bd3a550ac4bbf58341c01e1b0aa5
|
|
| BLAKE2b-256 |
8bd2bfb3b2fb563082f3df1201355342b67cc3cee59a29d336910faf63a6af4b
|
Provenance
The following attestation bundles were made for venvs-2026.5.1.tar.gz:
Publisher:
ci.yml on Julian/venvs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
venvs-2026.5.1.tar.gz -
Subject digest:
37030b6cbb343598a1b3e9e97ab03c06f53a9216e8ca13edc4996ae5d56bd226 - Sigstore transparency entry: 1435987536
- Sigstore integration time:
-
Permalink:
Julian/venvs@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Branch / Tag:
refs/tags/v2026.5.1 - Owner: https://github.com/Julian
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Trigger Event:
push
-
Statement type:
File details
Details for the file venvs-2026.5.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: venvs-2026.5.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 833.2 kB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb7b7ec67b655a44097eae58e7a894b223f062ce899273647bc3d043d6b36b01
|
|
| MD5 |
0141140dcb1bce29adf3ebd11e3ca8e0
|
|
| BLAKE2b-256 |
f49c8a1affdc4f471c05a5a17ae75fec2bc7c72580b2a91ebfbf829e10bc1210
|
Provenance
The following attestation bundles were made for venvs-2026.5.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
ci.yml on Julian/venvs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
venvs-2026.5.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
cb7b7ec67b655a44097eae58e7a894b223f062ce899273647bc3d043d6b36b01 - Sigstore transparency entry: 1435987581
- Sigstore integration time:
-
Permalink:
Julian/venvs@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Branch / Tag:
refs/tags/v2026.5.1 - Owner: https://github.com/Julian
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Trigger Event:
push
-
Statement type:
File details
Details for the file venvs-2026.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: venvs-2026.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 839.0 kB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af72b5c395ddae240566d53932370bbd6e8af25584cf764be26ff5b5e2701ba4
|
|
| MD5 |
722fb8d8e83c31d2a5cf86aedc00e0e9
|
|
| BLAKE2b-256 |
b851f89053676216118a9b3ba38eff0216a76fc14627804523b9fbdd48309353
|
Provenance
The following attestation bundles were made for venvs-2026.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
ci.yml on Julian/venvs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
venvs-2026.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
af72b5c395ddae240566d53932370bbd6e8af25584cf764be26ff5b5e2701ba4 - Sigstore transparency entry: 1435987544
- Sigstore integration time:
-
Permalink:
Julian/venvs@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Branch / Tag:
refs/tags/v2026.5.1 - Owner: https://github.com/Julian
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Trigger Event:
push
-
Statement type:
File details
Details for the file venvs-2026.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl.
File metadata
- Download URL: venvs-2026.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl
- Upload date:
- Size: 899.5 kB
- Tags: Python 3, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
861d8052c9ae67d94e5edba3d5a1818be85911f3f6169b6352f73b55d8365b68
|
|
| MD5 |
a8ea9ebcec8e97e7a9cf026e4e3932b7
|
|
| BLAKE2b-256 |
59bfb8024b91215618dceb715a3935f0224dfceadc588b3cc94c91bd3a757e1d
|
Provenance
The following attestation bundles were made for venvs-2026.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl:
Publisher:
ci.yml on Julian/venvs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
venvs-2026.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl -
Subject digest:
861d8052c9ae67d94e5edba3d5a1818be85911f3f6169b6352f73b55d8365b68 - Sigstore transparency entry: 1435987558
- Sigstore integration time:
-
Permalink:
Julian/venvs@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Branch / Tag:
refs/tags/v2026.5.1 - Owner: https://github.com/Julian
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Trigger Event:
push
-
Statement type:
File details
Details for the file venvs-2026.5.1-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: venvs-2026.5.1-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 768.9 kB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
837a62c7a1a48fa4622a933fc39ee9707e4aee2e4a2ec01a027a85b02f912072
|
|
| MD5 |
4e5a2e166626272bbfc5e99d1f02614f
|
|
| BLAKE2b-256 |
54dc867b8c0a38be6c8e8344e012cbc3f42c589c3f5192e9056945e580dd7c1a
|
Provenance
The following attestation bundles were made for venvs-2026.5.1-py3-none-macosx_11_0_arm64.whl:
Publisher:
ci.yml on Julian/venvs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
venvs-2026.5.1-py3-none-macosx_11_0_arm64.whl -
Subject digest:
837a62c7a1a48fa4622a933fc39ee9707e4aee2e4a2ec01a027a85b02f912072 - Sigstore transparency entry: 1435987550
- Sigstore integration time:
-
Permalink:
Julian/venvs@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Branch / Tag:
refs/tags/v2026.5.1 - Owner: https://github.com/Julian
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Trigger Event:
push
-
Statement type:
File details
Details for the file venvs-2026.5.1-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: venvs-2026.5.1-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 799.9 kB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07812bbfa93755db11eacc20d8a59bd99a8ab2f0556876b7e5545aff34dc2737
|
|
| MD5 |
caa9c613eb88c725201b9c3326a3f71b
|
|
| BLAKE2b-256 |
549b953ab42c7e7f199c39906c4df105ebfc543d085fd9cf8eb85d046a09b633
|
Provenance
The following attestation bundles were made for venvs-2026.5.1-py3-none-macosx_10_12_x86_64.whl:
Publisher:
ci.yml on Julian/venvs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
venvs-2026.5.1-py3-none-macosx_10_12_x86_64.whl -
Subject digest:
07812bbfa93755db11eacc20d8a59bd99a8ab2f0556876b7e5545aff34dc2737 - Sigstore transparency entry: 1435987566
- Sigstore integration time:
-
Permalink:
Julian/venvs@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Branch / Tag:
refs/tags/v2026.5.1 - Owner: https://github.com/Julian
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@11aa2d6697a8756e56fdaa6356febe4748142a90 -
Trigger Event:
push
-
Statement type: