Self-contained bootstrapping/updating of Python applications deployed through shared repositories.
Project description
appenv
appenv pins Python packages to exact versions and exposes their binaries
via symlinks — one file, no installation step. Drop it into a repository,
commit it, and every checkout (local or remote) gets the same tools at the
same versions by running ./http, ./mkdocs, ./batou, or whatever you need.
appenv never modifies your system — all state lives in .appenv/ inside
the project directory. Remove that folder and nothing is left behind.
Using an existing appenv project
Someone gave you a project that already uses appenv? Just run the command:
git clone <project> && cd <project>
./http # First run sets up everything automatically
No uv.lock yet? Generate it:
./appenv update-lockfile
Only needed again after manually editing pyproject.toml — uv add/uv remove
update the lockfile automatically.
Upgrading from requirements.txt
Still using requirements.txt instead of pyproject.toml?
uvx appenv migrate
New Project
appenv is distributed as a standalone script. Just use uvx or download it yourself.
appenv init will ask you some questions and set up the project. The example
assumes that you want to run a binary called http from the httpie package.
uvx (uv)
uvx is part of uv — the easiest way to start:
uvx appenv init
Manual Download
No uv installed? Download appenv directly:
curl -sL https://raw.githubusercontent.com/flyingcircusio/appenv/master/src/appenv.py -o appenv
chmod +x appenv
./appenv init
What just happened?
- appenv installed itself inplace by adding the
./appenvscript. initcreatedpyproject.tomland a symlinkhttp → appenv../httpset up the venv with pinned versions fromuv.lock, then ran thehttpbinary (from the httpie package)
The repository now contains:
myproject/
├── appenv # The appenv script (single file, committed to git)
├── http -> appenv # Runs the `http` binary from installed deps
├── pyproject.toml # Project config and dependency list
└── uv.lock # Exact versions of all dependencies (committed to git)
Development
For dev tooling, uv run works transparently (uses the .venv symlink):
uv run pytest -xvs
Documentation
Full documentation at Readthedocs:
- Installation -- how to get appenv
- Commands Reference -- all commands with options
- Workflows -- common usage patterns
- Locking Behavior -- how uv.lock works
- Developer Guide -- development setup and architecture
Requirements
- Python 3.9+ for the appenv script (environments managed by appenv require 3.10+)
- uv 0.5.0+ (auto-installed if not found)
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 Distribution
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 appenv-2026.5.13a2.tar.gz.
File metadata
- Download URL: appenv-2026.5.13a2.tar.gz
- Upload date:
- Size: 222.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a02b39a4c79db85900f109ea0eb08160693062d81b04bb1a6e12c12618bb75b3
|
|
| MD5 |
0bb849336a88e649494b77ef8a587cdd
|
|
| BLAKE2b-256 |
6dcee554089a8f26fe21c693b84e1be1ea5c072d04a5b689ec87731a38916b6c
|
File details
Details for the file appenv-2026.5.13a2-py3-none-any.whl.
File metadata
- Download URL: appenv-2026.5.13a2-py3-none-any.whl
- Upload date:
- Size: 19.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7ecb8ef84872d860f3ed0eb63624419ec3ac58cf4ec11e5dd4c360514de3b74
|
|
| MD5 |
3534683f1b27fb3f790741ea2dedcefe
|
|
| BLAKE2b-256 |
8f89a89f6b4745441d693596b10dd78c60a8459519a0559873d94b36551461b4
|