Skip to main content

A lightweight, single-binary conda bootstrapper

Project description

conda-express (cx)

CI Docs License PyPI

A single-binary bootstrapper for conda, powered by rattler. The cx binary is short for conda express.

conda-express is the distribution project for the cx and cxz binaries. It is not an official conda distribution.

cx offers an alternative to the Anaconda Distribution, Miniconda, and Miniforge constructor-style installer pattern: a 7-11 MB native binary that bootstraps a managed conda base environment from a locked package set.

Quick start

Bootstrap conda, create an environment, and activate it

# Bootstrap a conda installation (first run only)
cx bootstrap

# Run conda commands through cx
cx install -n myenv numpy pandas
cx create -n science python=3.12 scipy

# Activate environments using conda-spawn, without conda init
cx shell myenv

On first use, cx automatically installs conda and its plugins into ~/.conda/express from the built-in runtime lock. Subsequent invocations hand off to the installed conda binary.

What gets installed

cx installs a managed conda stack from conda-forge:

Package Role
python >= 3.12 Runtime
conda == 26.5.2 Package manager
conda-rattler-solver Rust-based solver without libmamba's native dependency chain
conda-spawn >= 0.1.0 Subprocess-based environment activation
conda-completion >= 0.2.0 Shell completion support
conda-pypi PyPI interoperability
conda-self Base environment self-management
conda-global Global tool installation and PATH management
conda-workspaces >= 0.5.0 Multi-environment workspace and task management

See the included plugins reference for the commands and workflows these packages add.

Shell completion is available through the included conda-completion plugin:

cx completion status
cx completion install --dry-run

The conda-libmamba-solver and its 27 exclusive native dependencies (libsolv, libarchive, libcurl, spdlog, etc.) are excluded by default because cx configures conda-rattler-solver.

Versioning

conda-express versions follow the conda version in the runtime lock. For example, conda-express 26.5.2 bootstraps conda 26.5.2. If conda-express needs a packaging-only rebuild without changing the bundled conda version, it uses a post-release version such as 26.5.2.post1.

Installation

Homebrew (recommended)

Homebrew is the recommended install path on macOS and Linux:

brew tap jezdez/conda-express https://github.com/jezdez/conda-express
brew install jezdez/conda-express/cx

Update later with brew upgrade cx.

Shell script

macOS / Linux:

curl -fsSL https://jezdez.github.io/conda-express/get-cx.sh | sh

Windows (PowerShell):

powershell -ExecutionPolicy ByPass -c "irm https://jezdez.github.io/conda-express/get-cx.ps1 | iex"

The script detects your platform, downloads the right binary, verifies the checksum, updates your shell profile / PATH, and runs cx bootstrap. Customize with environment variables:

  • CX_INSTALL_DIR — where to place the binary (default: ~/.local/bin or %USERPROFILE%\.local\bin)
  • CX_VERSION — specific version to install without a v prefix (default: latest)
  • CX_NO_PATH_UPDATE — set to skip shell profile / PATH modification
  • CX_NO_BOOTSTRAP — set to skip running cx bootstrap
  • CX_SKIP_VERIFY — set to skip checksum verification
  • CX_BUNDLE — bundle directory used by cx bootstrap
  • CX_OFFLINE — set to a truthy value to force offline bootstrap

From GitHub Releases

Download the binary for your platform from the latest release:

Platform File
Linux x86_64 cx-x86_64-unknown-linux-gnu
Linux ARM64 cx-aarch64-unknown-linux-gnu
macOS x86_64 (Intel) cx-x86_64-apple-darwin
macOS ARM64 (Apple Silicon) cx-aarch64-apple-darwin
Windows x86_64 cx-x86_64-pc-windows-msvc.exe

Each file has matching .sha256, .info.json, .packages.txt, and .runtime.lock files. Release artifacts are also covered by GitHub Artifact Attestations:

gh attestation verify ./cx-x86_64-unknown-linux-gnu \
  -R jezdez/conda-express \
  --signer-workflow jezdez/conda-express/.github/workflows/release.yml

See the artifact verification guide for checksum, metadata, runtime lock, and air-gapped transfer checks.

Docker

A multi-arch image is published to GHCR on every release:

docker run --rm -v cx-data:/home/nonroot/.conda/express ghcr.io/jezdez/conda-express bootstrap

The image runs as non-root (uid 65532), can run with a read-only root filesystem when the managed prefix is mounted as a writable volume, and includes provenance attestations and SBOMs. Docker Desktop on macOS and Windows automatically selects the right architecture (linux/amd64 or linux/arm64).

docker run --rm --read-only --tmpfs /tmp \
  -v cx-data:/home/nonroot/.conda/express \
  ghcr.io/jezdez/conda-express status
# Run a conda command through cx
docker run --rm -v cx-data:/home/nonroot/.conda/express ghcr.io/jezdez/conda-express create -n myenv python=3.12

Use as a container in CI (GitHub Actions):

jobs:
  test:
    container: ghcr.io/jezdez/conda-express:latest
    steps:
      - run: cx bootstrap && cx create -n test python numpy

Use as a base for multi-stage application builds:

FROM ghcr.io/jezdez/conda-express:latest AS conda-builder
RUN cx bootstrap && cx create -n app python numpy pandas
FROM gcr.io/distroless/cc-debian12:nonroot
COPY --from=conda-builder /home/nonroot/.conda/express/envs/app /opt/conda

PyPI

pip install conda-express

The PyPI package installs the cx release binary built with conda-ship for your platform.

Upgrading from early releases

Current cx releases bootstrap into ~/.conda/express. Early releases used ~/.cx; upgrading the binary does not migrate that prefix automatically. Keep ~/.cx until you have recreated or archived any environments you still need. If an old Cargo-installed cx is still on your PATH, remove it because conda-express no longer publishes new crates.io releases.

See the upgrade guide for commands to export old environments, bootstrap the new prefix, and remove the old directory safely.

Reproducing distribution artifacts

The cx and cxz artifacts published from this repository are built with conda-ship. This repository keeps the conda-express distribution defaults and delegates the generic runtime and builder implementation to conda-ship.

Use this repository's release workflow to reproduce these conda-express artifacts. For custom package sets, binary names, or release channels, use conda-ship directly.

Configuration

The conda-express runtime is defined in pyproject.toml. Pixi solves the runtime source environment, and conda-ship derives the runtime lock from that committed lockfile:

[tool.conda-ship]
runtime = "cx"
runtime-version = { from = "project-metadata" }
delegate = "conda"
layout = "online"
source-environment = "runtime"
exclude = ["conda-libmamba-solver"]
docs-url = "https://jezdez.github.io/conda-express/"
install-scheme = "conda-home"
install-name = "express"

CLI reference

cx bootstrap [OPTIONS]           Bootstrap a fresh conda installation
  --force                        Re-bootstrap the managed install path
  --bundle DIR                   Use a bundle directory
  --offline                      Disable network access during bootstrap

cx --path DIR <command>           Use a custom install path
cx status                         Show cx installation status
cx shell [ENV]                   Alias for conda spawn (activate via subshell)
cx uninstall [OPTIONS]           Remove the managed install path and environments
  -y, --yes                      Skip confirmation prompt

cx help                          Getting-started guide
cx <conda-args>                  Passed through to conda

Frozen base prefix

The ~/.conda/express prefix is protected with a CEP 22 frozen marker after bootstrap. This prevents accidental modification of the base environment (e.g., conda install numpy into base). Users should create named environments for their work:

cx create -n myenv numpy pandas
cx shell myenv

For now, update the base installation by re-bootstrapping with cx bootstrap --force. The included conda-self plugin is intended to make base updates available as a conda command once that workflow has settled.

Building custom binaries

For custom package sets or new distributions, use conda-ship directly. This repository's build workflow is release preparation for this repository's cx and cxz binaries, not a generic downstream builder interface.

Uninstalling

To remove the conda prefix and all environments managed by cx:

cx uninstall

This shows the paths it plans to remove and asks for confirmation. Use --yes to skip the prompt. The command also cleans up PATH entries from shell profiles that were added by the installer and prints a hint for removing the cx binary through your original install method.

How it works

  1. Build time: Pixi solves the runtime source environment into pixi.lock; the conda-express release workflow asks conda-ship to derive a runtime lock, filter excluded packages, and stamp that lock into the staged binary.

  2. First run: cx reads the stamped runtime lock, downloads packages from conda-forge, and installs them into the prefix. No repodata fetch or solve needed at runtime.

  3. Subsequent runs: cx detects the existing prefix and replaces its own process with the installed conda binary, passing all arguments through.

Activation model

cx delegates conda commands after bootstrap

cx ships with conda-spawn instead of traditional conda activate. There is no need to run conda init or modify shell profiles.

# Optional: expose the managed conda executable directly
export PATH="$HOME/.conda/express/condabin:$PATH"

# Activate an environment (spawns a subshell)
cx shell myenv

# Deactivate by exiting the subshell
exit

Lockfile format

The stamped runtime lock uses the rattler-lock v6 format (same as pixi.lock). It can be:

  • Read by pixi
  • Imported by conda-lockfiles
  • Checked into version control for reproducibility auditing

License

BSD 3-Clause. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

conda_express-26.5.2.post1-py3-none-win_amd64.whl (3.9 MB view details)

Uploaded Python 3Windows x86-64

conda_express-26.5.2.post1-py3-none-macosx_11_0_arm64.whl (3.5 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

conda_express-26.5.2.post1-py3-none-macosx_10_12_x86_64.whl (3.6 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file conda_express-26.5.2.post1-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for conda_express-26.5.2.post1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 4241fb8e8d12b2dac7289e3b4a0579ea30f5618865724a0dbb0f79f52d671c5f
MD5 f320549260bcaa5ad90dab4502eed6c8
BLAKE2b-256 2d09eea891180ab2d71b74b3a2c4e0615c2e7d657da727dc0e15c9140eaf63c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-26.5.2.post1-py3-none-win_amd64.whl:

Publisher: release.yml on jezdez/conda-express

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file conda_express-26.5.2.post1-py3-none-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for conda_express-26.5.2.post1-py3-none-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 70b17ecdd44c99766490d7d35ac91a832a0c0351008c1a2cbac44e61dfe30246
MD5 94a88803e8c0ba8b5edb9aede9ee0162
BLAKE2b-256 609f15a4cc145b24853d006f61e1d99dae8c79ec5c343f3e54e3391d28242f93

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-26.5.2.post1-py3-none-manylinux2014_x86_64.whl:

Publisher: release.yml on jezdez/conda-express

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file conda_express-26.5.2.post1-py3-none-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for conda_express-26.5.2.post1-py3-none-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a55ef62ac911d12d8076ea3d4b7716ccfcb9f70a38721480c19effcccadada5a
MD5 8fc0fe5f37a93bd95bcf4cf2ca957f61
BLAKE2b-256 cddfc36cd9646d10f4284a7b766242517f8b0a84e3a01d0eeff79b18f8447b6b

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-26.5.2.post1-py3-none-manylinux2014_aarch64.whl:

Publisher: release.yml on jezdez/conda-express

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file conda_express-26.5.2.post1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for conda_express-26.5.2.post1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3aa5a7f7f8b00c75b6eacfb5a6fdecd1e2cfff669fd388a676c98778fc6ef0b1
MD5 dd915cce0c9e38ebc6cd17929ec5efb3
BLAKE2b-256 7ce7f06221cd190f790bfc424817468e6bc4791232fb952838bf36b735ec28bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-26.5.2.post1-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on jezdez/conda-express

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file conda_express-26.5.2.post1-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for conda_express-26.5.2.post1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2e296f0594ea3355fc3161d35d61c7ad59319bebdc9b100b54cfdec06460c5ed
MD5 41d9f6e0f931f50281a2dd2cd4e2431f
BLAKE2b-256 32a6187f0770879566a12fabc9dd364b201c981f73bd283928390b14af1f0d17

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-26.5.2.post1-py3-none-macosx_10_12_x86_64.whl:

Publisher: release.yml on jezdez/conda-express

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page