Skip to main content

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.path so your application loads third-party libraries strictly from vendor/, ignoring global or user site-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 extraPaths in VS Code (.vscode/settings.json) and PYTHONPATH in 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:

  1. vnma.toml: Declarative manifest for your project and dependencies.
  2. vendor/: Directory for vendored packages.
  3. vendor/__bootstrap__.py & vendor/__init__.py: Runtime loader and path sanitizer.
  4. .gitignore entries: Ignores vendored packages in Git.
  5. IDE settings: Preconfigures VS Code (.vscode/settings.json) and PyCharm (.env).
  6. 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:

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

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:


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)

Source distribution for vnma 0.3.0
File Size Uploaded Provenance
vnma-0.3.0.tar.gz 85.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for vnma 0.3.0
File Interpreter ABI Platform
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.

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