Skip to main content
nepenthe logo, a greek-style pitcher jar with blue liquid

Forget your environment sorrows

Build Status codecov License PyPI

nepenthe builds, versions, and distributes large shared conda/PyPI environments. It solves a dependency manifest with rattler and records the result in a portable lockfile. Publish that lock to a versioned registry so other machines can install the same packages without re-solving.

  • Manifests describe dependencies and compose environments.
  • Rust solver uses rattler without a Python interpreter.
  • Multi-platform locks store linux-64, osx-arm64, and win-64 environments in one rattler_lock file, solved from one host.
  • Storage backends read and write specs using file://, s3://, and https://; package channels can use servers such as Artifactory.
  • Versioned registry tracks each environment independently and stores immutable, content-addressed locks.
  • Installation links packages into a prefix with rattler; conda, mamba, and micromamba are not required.
  • Conda export converts a lock to an @EXPLICIT spec for conda create --file.
  • Credentials are supplied at use time and never written into artifacts.

The CLI and Python API support building, publishing, and installing environments. Use pack / unpack bundles for air-gapped machines and pyproject.toml integration to check a project's dependencies against its shared environment.

Why nepenthe?

Frozen environments keep package versions consistent across machines and over time. Maintaining every pin by hand makes upgrades difficult and can lead to dependency hell.

With nepenthe, you specify dependencies and the version constraints you need. Each release solves that list and freezes the result. Consumers install those packages without re-solving.


An unpinned list of dependencies is solved once into a fully-pinned environment.

To update an environment, edit its root dependencies and build a new release. Teams can choose when to adopt it.

Editing the root dependency list over time (arrow down the left) produces a new fully-pinned environment at each step (right).

Unlike per-project lockfiles (pixi, uv) and re-solved manifests (environment.yml), nepenthe distributes versioned, immutable environments for multiple repos to share. See Motivation for the full comparison.

Documentation

For Read
Why it exists: the problem and alternatives Motivation
Users: concepts and how-to guides The wiki: Concepts, Manifests, Channels & Artifactory, Registry, Installing, Consuming in a Project, Packing, Python API, Backends
Getting started Installation
Contributors: how it's built Architecture

Quickstart

Create a manifest with the dependencies and version constraints you need:

# environment.yaml
project:
  name: demo
  channels: [conda-forge]
  platforms: [linux-64]
  python: ["3.11"]

dependencies:
  - numpy >=2
  - pip

environments:
  app: []

Build a fully pinned lockfile without a registry or conda:

nepenthe build --manifest environment.yaml --env app --output-dir .
# → app-py3.11.lock      the reproducible artifact: every install gives these exact packages

Export the lock as an @EXPLICIT spec for installation with conda or mamba:

nepenthe export --env app --lock app-py3.11.lock --platform linux-64 -o app.txt
# → app.txt              @EXPLICIT list of package URLs

Install from the spec with conda, or publish the lock and install with nepenthe:

# with conda/mamba, from the spec — nepenthe not needed on this machine
conda create --name app --file app.txt

# …or publish the lock to a versioned registry and install with nepenthe — no conda:
nepenthe build --manifest environment.yaml --env app \
  --registry file:///srv/nepenthe --version 1.0.0
nepenthe create app --registry file:///srv/nepenthe --python 3.11 --prefix ./envs/app
eval "$(nepenthe activate --prefix ./envs/app)"

The CLI is a single multicall binary: np and npb are symlinks to nepenthe (dispatch on the invoked name). np behaves exactly like nepenthe, and npb is a shortcut for nepenthe build (so the build step above is just npb --manifest environment.yaml --env app --output-dir .).

The Python API provides the same operations without requiring conda:

import nepenthe

# producer: solve "app" and publish its lock as v1.0.0
nepenthe.build("environment.yaml", "app", registry="file:///srv/nepenthe", version="1.0.0")

# consumer: install the latest published lock into a prefix
nepenthe.create("app", "file:///srv/nepenthe", "./envs/app")
print(nepenthe.activate("./envs/app"))

A repo can pin its shared environment in pyproject.toml and check that its dependencies are compatible:

[tool.nepenthe]
environment = "app"
registry = "file:///srv/nepenthe"
version = "1.0.0"
nepenthe sync      # install the referenced environment into .venv
nepenthe check     # verify [project.dependencies] are compatible (fails on conflicts)

See Installing Environments for the complete CLI reference, Consuming in a Project for the pyproject.toml workflow, Python API for the bindings, Manifests for the manifest format, and the runnable rust/examples/ for the producer side.

Contributing

Contributions are welcome under the Apache 2.0 license. See Contributing and Build from Source.

License

Apache-2.0. See LICENSE for details.

Metadata

Release files for nepenthe 0.2.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for nepenthe 0.2.2
File Size Uploaded Provenance Actions
nepenthe-0.2.2.tar.gz 273.0 kB Without provenance Details for nepenthe-0.2.2.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for nepenthe 0.2.2
File Actions
nepenthe-0.2.2-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details for nepenthe-0.2.2-cp311-abi3-win_amd64.whl
nepenthe-0.2.2-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details for nepenthe-0.2.2-cp311-abi3-manylinux_2_28_x86_64.whl
nepenthe-0.2.2-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details for nepenthe-0.2.2-cp311-abi3-manylinux_2_28_aarch64.whl
nepenthe-0.2.2-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details for nepenthe-0.2.2-cp311-abi3-macosx_11_0_arm64.whl

Total release size: 87.9 MB

Release files / nepenthe-0.2.2.tar.gz

Download URL nepenthe-0.2.2.tar.gz
Size 273.0 kB
Tags Source
SHA-256 checksum
How to use checksums
5b51edcb1675c4d16881133345be21dc4fe2c84e794e4ea911d539542c190603
BLAKE2b-256 checksum
How to use checksums
df70bd0892b6e3e7e7bef2fc5dfdf53db4f7099183977d3aabb6daf331078436
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.15

Release files / nepenthe-0.2.2-cp311-abi3-win_amd64.whl

Download URL nepenthe-0.2.2-cp311-abi3-win_amd64.whl
Size 19.5 MB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
d02db2c8c2d346abfa4804e2dddc39fcde3c176d65aeee53a7d3b50b1dbe5496
BLAKE2b-256 checksum
How to use checksums
1a81cee3e079317d5903c8c418af26f1a7c493c5485d3782a16275b2a5f35c8d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.15

Release files / nepenthe-0.2.2-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL nepenthe-0.2.2-cp311-abi3-manylinux_2_28_x86_64.whl
Size 23.4 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
c7294dd4995a903a903003c8f00b2f9b2ad5e931acf068ceec344e4bbb9e82ee
BLAKE2b-256 checksum
How to use checksums
25f1967279dbd2d93bbf403d57e3fd7c9aee245134fb6b914cb0abefefac6f2c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.15

Release files / nepenthe-0.2.2-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL nepenthe-0.2.2-cp311-abi3-manylinux_2_28_aarch64.whl
Size 23.8 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
b1d55008585c7b63c630365bac1bf17ef296ce6f224a4bad3a51912fe3cb8370
BLAKE2b-256 checksum
How to use checksums
c5248f2c234bcc17f7b2c55f172fe2d892feff269127cc0e808f88d6e2ac1eca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.15

Release files / nepenthe-0.2.2-cp311-abi3-macosx_11_0_arm64.whl

Download URL nepenthe-0.2.2-cp311-abi3-macosx_11_0_arm64.whl
Size 20.9 MB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9166a1a73ad1e33fcd06b3d7ee132015b715e8d808292abd1c855ccbd1bc5041
BLAKE2b-256 checksum
How to use checksums
8fcb9cdf038203a5a91cade8a970dcc6bfc615601b947583be7f103f4cb34e60
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.15

Security for nepenthe 0.2.2

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