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, ./pytest, ./batou, or whatever you need.
Built on uv for environment management.
appenv never modifies your system — all state lives in .appenv/ inside
the project directory. Remove that folder and nothing is left behind.
Core Concepts¶
Single-file deployment:
appenv.pyis the entire tool — drop it into any repositorySymlink dispatch:
./http(wherehttp → appenv) runs thehttpbinary from the pinned venvReproducible everywhere: commit
appenv,pyproject.toml, anduv.lock— every checkout gets identical versionsMultiple binaries: create additional symlinks to expose more tools from the same venv
Requires Python 3.9+ (managed environments need 3.10+). uv 0.5.0+ is auto-installed if not found. pyproject.toml must sit next to the appenv script.
Getting Started¶
New to appenv? Start with the User Guide for installation, adding dependencies, and CI/CD — or see Common Workflows for practical examples including migrating existing legacy appenv projects.
For reference material, see Commands Reference and Locking Behavior.
Contents
- User Guide
- Developer Guide
- API Reference
- src.appenv
- Attributes
- Exceptions
- Classes
- Functions
- Module Contents
logEXIT_CODE_DATAERREXIT_CODE_NOINPUTEXIT_CODE_UNAVAILABLEEXIT_CODE_USAGEMAX_HELP_TEXT_LENGTHVERSION_PARTS_COUNTGroupedHelpFormatterUsageArgumentParserIndexEntryRequirementsTxtInfoconvert_version_preference()version_satisfies_constraints()remove_path()PyprojectPyproject.pathPyproject.requirements_pathPyproject.contentPyproject.migrate_from_requirements_txt()Pyproject.requires_pythonPyproject.existsPyproject.has_project_sectionPyproject.can_be_created_from_requirements_txtPyproject.requirements_txt_infoPyproject.print_migration_info()Pyproject.with_project_section()
create_pyproject()LockFileUvVersionUvBinNoValidUvErrorCommandErrorAppEnvSettingsInitParamsAppEnvAppEnv.baseAppEnv.original_cwdAppEnv.settingsAppEnv.appenv_dirAppEnv.appenv_scriptAppEnv.log_dirAppEnv.venv_realAppEnv.venv_linkAppEnv.venv_pythonAppEnv.run()AppEnv.meta()AppEnv.prepare()AppEnv.init()AppEnv.migrate()AppEnv.self_update()AppEnv.python()AppEnv.run_script()AppEnv.run_uv()AppEnv.show_version()AppEnv.reset()AppEnv.update_lockfile()
ensure_uv()ensure_pyproject()ensure_lock_file()ensure_gitignore()cmd()ensure_best_python()find_available_pythons()print_colored_diff()appenv_settings_from_env()ColoredConsoleFormattersetup_logging()main()
- src.appenv