Skip to main content

A lightweight, single-binary conda bootstrapper — powered by rattler

Project description

conda-express (cx)

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

cx replaces the miniconda/constructor installation pattern with a ~17 MB static binary that bootstraps a fully functional conda environment in seconds.

Quick start

# Bootstrap a conda installation (first run only, ~3–5 s)
cx bootstrap

# Use conda normally — cx delegates transparently
cx install -n myenv numpy pandas
cx create -n science python=3.12 scipy

# Activate environments using conda-spawn (no shell init needed)
cx shell myenv

On first use, cx automatically installs conda and its plugins into ~/.cx from an embedded lockfile. Subsequent invocations hand off directly to the installed conda binary with no overhead.

What gets installed

cx installs a minimal conda stack from conda-forge:

Package Role
python >= 3.12 Runtime
conda >= 25.1 Package manager
conda-rattler-solver Rust-based solver (replaces libmamba)
conda-spawn Subprocess-based environment activation
conda-pypi PyPI interoperability
conda-self Base environment self-management

The conda-libmamba-solver and its 27 exclusive native dependencies (libsolv, libarchive, libcurl, spdlog, etc.) are excluded by default, reducing the install from 113 to 86 packages.

Installation

Installer script (recommended)

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 installer 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 (default: latest)
  • CX_NO_PATH_UPDATE — set to skip shell profile / PATH modification
  • CX_NO_BOOTSTRAP — set to skip running cx 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 a matching .sha256 checksum.

From PyPI

pip install conda-express

From crates.io

cargo install conda-express

The package is published as conda-express on PyPI and crates.io.

Building from source

Requires pixi (recommended) or Rust (edition 2024).

With pixi (recommended)

pixi manages the Rust toolchain from conda-forge for reproducible builds:

git clone https://github.com/jezdez/conda-express.git
cd conda-express

pixi run build          # cargo build --release
pixi run test           # cargo test
pixi run lint           # fmt-check + clippy

With system Rust

git clone https://github.com/jezdez/conda-express.git
cd conda-express

# Build (first build solves packages at compile time — needs network)
cargo build --release

# Binary is at target/release/cx
./target/release/cx --help

The first build runs a compile-time solve via build.rs, generating a rattler-lock v6 lockfile that gets embedded into the binary. Subsequent builds reuse the cached lockfile unless pixi.toml changes.

Configuration

Package specs, channels, and exclusions live in the [tool.cx] section of pixi.toml:

[tool.cx]
channels = ["conda-forge"]
packages = [
    "python >=3.12",
    "conda >=25.1",
    "conda-rattler-solver",
    "conda-spawn",
    "conda-pypi",
    "conda-self",
]
exclude = ["conda-libmamba-solver"]

Edit this section to customize what cx installs, then rebuild.

CLI reference

cx bootstrap [OPTIONS]           Bootstrap a fresh conda installation
  --force                        Re-bootstrap even if prefix exists
  --prefix DIR                   Target directory (default: ~/.cx)
  --channel CH                   Channels (default: conda-forge)
  --package PKG                  Additional packages to install
  --exclude PKG                  Packages to exclude (default: conda-libmamba-solver)
  --no-exclude                   Disable default exclusions
  --no-lock                      Ignore embedded lockfile, do a live solve
  --lockfile PATH                Use an external lockfile instead

cx status [--prefix DIR]         Show cx installation status
cx shell [ENV]                   Alias for conda spawn (activate via subshell)
cx help                          Getting-started guide
cx <conda-args>                  Passed through to conda

Disabled commands

cx uses conda-spawn instead of traditional shell-based activation. The following commands are intentionally disabled:

Command Instead
conda activate / deactivate cx shell myenv
conda init Add condabin to your PATH (see below)

Frozen base prefix

The ~/.cx 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

Updating the base installation is handled by conda self update (via conda-self).

How it works

  1. Compile time: build.rs reads [tool.cx] from pixi.toml, solves dependencies using rattler, filters excluded packages, and writes a rattler-lock v6 lockfile embedded into the binary.

  2. First run: cx parses the embedded lockfile, 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 ships with conda-spawn instead of traditional conda activate. There is no need to run conda init or modify shell profiles.

# Add cx to PATH (one-time setup)
export PATH="$HOME/.cx/condabin:$PATH"

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

# Deactivate by exiting the subshell
exit

Lockfile format

The embedded lockfile 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 Distribution

conda_express-0.1.6.tar.gz (112.3 kB view details)

Uploaded Source

Built Distributions

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

conda_express-0.1.6-py3-none-win_amd64.whl (8.0 MB view details)

Uploaded Python 3Windows x86-64

conda_express-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

conda_express-0.1.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

conda_express-0.1.6-py3-none-macosx_11_0_arm64.whl (7.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

conda_express-0.1.6-py3-none-macosx_10_12_x86_64.whl (7.7 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file conda_express-0.1.6.tar.gz.

File metadata

  • Download URL: conda_express-0.1.6.tar.gz
  • Upload date:
  • Size: 112.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for conda_express-0.1.6.tar.gz
Algorithm Hash digest
SHA256 7f031ee9cfbda95bbcd23e50c8f46a6db227f738f11f28c89f26d0e8b890d9c8
MD5 5c1b6e98d77375c16b49dcf10c566ac4
BLAKE2b-256 5d466383e08bc85410689298520e8c286997bdcd5e0f47b1e79c240fa1bd6986

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-0.1.6.tar.gz:

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-0.1.6-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for conda_express-0.1.6-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 33df9792c0b420e01fcf0625451161f6886c0a00aaf0a03e2b9cc841319a360e
MD5 ffda0d8961b620590cd1ed8bddd085c8
BLAKE2b-256 d74799ca427ebdc4eca472039664689b48a07af0f74a5c5178267072c1a64055

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-0.1.6-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-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for conda_express-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 897d704184801b6c14d93548e32461fd9b607f1b191e5c55be3bc5d93381a177
MD5 cd9ecf36bc40ed9675f193f98dfa513c
BLAKE2b-256 06b6d36a9a9a2fb56a8d916176922634a1e7fd6daa0e75129b335300be093f44

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-0.1.6-py3-none-manylinux_2_17_x86_64.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-0.1.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for conda_express-0.1.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1f1432fd48e961a0275fd216f0b49a45c0b4a3604615ad11e4876d57b17d773d
MD5 9c68a53e0f799a4cc7f15af8a4f01a75
BLAKE2b-256 0ddcbb66cf33f214cd346e457de51219732a0b4a0e9a38b9c5db6034d41c83da

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-0.1.6-py3-none-manylinux_2_17_aarch64.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-0.1.6-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for conda_express-0.1.6-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 33d126e1bb256b18b9792cc1c15cf1159cae8f8df2923d9187f175cf5e4db1f6
MD5 354d8671f12f4c1d5954b5a659ea987c
BLAKE2b-256 d5fc305471553e4651eddfecbb6bf66c46e1227fb36567ba272d2325a08199a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-0.1.6-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-0.1.6-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for conda_express-0.1.6-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2d41ea32ae6ed7076eaeb6b1ae701d93ba7bded5eaae0a1f88eacea7ebb2fc30
MD5 db0f6829805fe738b006281164ed12ce
BLAKE2b-256 6dd5e534aa2c70cff1bee9a0a7be63c6934b0ecf86f725f757ac5c1e484211d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for conda_express-0.1.6-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