VNMA (Vendor Manager)
Status: Beta (v0.3.0)
Platform Support: CPython 3.11, 3.12, 3.13, 3.14 (Tested on Windows and Linux)
vnma is a dependency and vendoring manager for Python projects. It installs and manages dependencies inside a local project directory (vendor/ or vendor_vnma/) instead of creating full Python virtual environments (venv).
What VNMA Does (and What It Doesn't)
What it does:
- Installs packages locally: Downloads, verifies, and unpacks wheels directly into
vendor/. - Runtime path isolation: Cleans
sys.pathso your application loads third-party libraries strictly fromvendor/, ignoring global or usersite-packages. - Automatic DLL registration (Windows): Automatically calls
os.add_dll_directory()for folders containing native binaries (e.g., SDL2, C extensions), preventing import errors. - Transactional operations: Installations and updates are staged in a private directory and committed atomically; if an install fails or crashes, previous state is restored via a recovery journal.
- Transitive dependency resolution: Resolves dependencies and version constraints with bounded backtracking and PEP 508 marker evaluation.
- Live development links (
vnma link): Connects local libraries in development without copying files, keeping dependencies synchronized. - IDE configuration: Configures
extraPathsin VS Code (.vscode/settings.json) andPYTHONPATHin PyCharm (.env,.idea/*.iml).
What it doesn't do:
- It does not virtualize the Python executable: It uses your installed Python interpreter and standard library directly.
- It cannot load multiple incompatible versions of the same library simultaneously: Python's runtime has a single global
sys.modules. Conflicting version requirements are rejected at resolution time.
Step-by-Step Guide
Step 1: Install VNMA
Install vnma using pip:
pip install vnma
Or install in editable mode from source:
git clone https://github.com/GrandKenzy/vnma.git
cd vnma
pip install -e .
Verify the installation:
vnma --help
Step 2: Initialize Your Project
Navigate to your project folder and run:
cd my_project
vnma init
This command creates:
vnma.toml: Declarative manifest for your project and dependencies.vendor/: Directory for vendored packages.vendor/__bootstrap__.py&vendor/__init__.py: Runtime loader and path sanitizer..gitignoreentries: Ignores vendored packages in Git.- IDE settings: Preconfigures VS Code (
.vscode/settings.json) and PyCharm (.env). vnma.lock: Lockfile for reproducible installs.
Step 3: Install Packages
From PyPI:
# Latest compatible version:
vnma install requests
# Pinned version:
vnma install colorama==0.4.6
# Multiple packages:
vnma install flask pytest
From a local directory:
vnma install ../shared-library
From a Git repository:
vnma install git+https://github.com/psf/requests.git@main
Step 4: Run Your Code
You have two ways to execute your code with vendored packages:
Option A: Using the CLI (Recommended)
vnma run main.py
vnma run sets PYTHONPATH to your vendor directory and disables user-site packages automatically.
Option B: Direct Python execution
Add this import at the very top of your entry script (main.py):
import vendor.__bootstrap__
import requests
response = requests.get("https://httpbin.org/get")
print(response.status_code)
Then run normally with your system Python:
python main.py
Step 5: Link Local Libraries for Development (vnma link)
When actively developing an internal library alongside an app, avoid re-installing wheels after every change:
vnma link ../my-library
- Zero-copy: Does not copy files; imports live directly from the library's source directory.
- Auto-dependency resolution: Reads the library's dependencies and installs them into
vendor/. - To unlink:
vnma unlink my-library
- To check and synchronize linked libraries:
vnma reload
Step 6: Maintain and Clean Your Project
List installed packages:
vnma list
Update dependencies:
# Update all unpinned dependencies:
vnma update
# Update only PyPI packages:
vnma update --pip
# Update only Git repositories:
vnma update --git
Remove orphaned packages (packages no longer required):
# Preview what would be removed:
vnma prune --dry-run
# Remove unused packages:
vnma prune --yes
Uninstall a package:
# Remove from vendor directory:
vnma uninstall requests
# Remove from vendor directory AND delete from vnma.toml:
vnma uninstall requests -d
Restore dependencies on another machine or in CI:
vnma install
Configuration Reference
vnma.toml (Project Level)
[project]
name = "my-app"
version = "1.0.0"
[dependencies]
requests = ">=2.31.0"
colorama = "==0.4.6"
local-tool = { path = "../local-tool" }
[tool.vnma]
vendor_dir = "vendor"
ide_integration = ["vscode", "pycharm"]
vnma_config.toml (Optional Library Manifest)
If developing a library with native DLLs or specific exports, place a vnma_config.toml in its root:
[package]
name = "my-library"
package = "my_library" # Python import name (import my_library)
version = "0.1.0"
[runtime]
dll_directories = ["my_library/libs"]
hermetic = true
[exports]
modules = ["my_library"]
entry_points = { my-tool = "my_library.cli:main" }
Command Summary
| Command | Description |
|---|---|
vnma init |
Initialize VNMA in the current project. |
vnma install <pkg> |
Install package(s) from PyPI, local path, or Git. |
vnma install |
Restore all dependencies declared in vnma.toml. |
vnma run <script> |
Run a Python script using the vendored runtime. |
vnma link <path> |
Link a local library in development (zero-copy live edits). |
vnma unlink <name> |
Unlink a previously linked local library. |
vnma reload |
Verify links, update dependencies, and auto-prune obsolete packages. |
vnma list |
Show all installed packages and their versions. |
vnma update |
Update unpinned dependencies to their latest compatible versions. |
vnma prune |
Remove unused packages that are no longer referenced in vnma.toml. |
vnma uninstall <pkg> |
Remove a package from vendor/ (add -d to remove from vnma.toml). |
vnma sync-ide |
Reapply VS Code and PyCharm configuration files. |
vnma clean |
Safely remove vendor folders and lockfiles. |
Documentation
Full documentation is available in the docs/ directory:
- Getting Started: docs/en/01-Use/01-getting-started.md
- Dependency Management: docs/en/01-Use/02-dependency-management.md
- Configuration Specifications: docs/en/01-Use/03-configuration-specs.md
- Runtime Execution Model: docs/en/01-Use/04-runtime-execution.md
- IDE Integration: docs/en/01-Use/05-ide-integration.md
- Beta Status & Limitations: docs/en/02-Advice/01-beta-status.md
- Changelog: CHANGELOG.md
License
This software is released under a modified permissive license. See LICENSE for terms.
Metadata
Release files for vnma 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| vnma-0.3.0.tar.gz | 85.2 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vnma-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 152.9 kB
Release files / vnma-0.3.0.tar.gz
| Download URL | vnma-0.3.0.tar.gz |
|---|---|
| Size | 85.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5f2cef40a6d2977daa644f442bb161ac025584ce8eceb5ab8a9c9a271717c866
|
|
BLAKE2b-256 checksum How to use checksums |
1e58d00df8a30334ea075f238f87472c5006bc86c1addda00873f1039587f3e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Release files / vnma-0.3.0-py3-none-any.whl
| Download URL | vnma-0.3.0-py3-none-any.whl |
|---|---|
| Size | 67.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1e954e695080165bd13e4167673d6fa734213abefbc9c3c4a05accd9e1b6efb2
|
|
BLAKE2b-256 checksum How to use checksums |
3f38d3bf30b6a935493bab99e2b344d61e6ab2d746979cc2ca64bcf07bde0fe0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Security for vnma 0.3.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.