Quick start#

Installation#

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.

The shell script downloads the right binary for your platform, verifies its checksum, updates your shell profile / PATH, and runs cx bootstrap.

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"

Download the binary for your platform from the latest release:

Platform

cx (7-11 MB)

cxz (50-95 MB)

Linux x86_64

cx-x86_64-unknown-linux-gnu

cxz-x86_64-unknown-linux-gnu

Linux ARM64

cx-aarch64-unknown-linux-gnu

cxz-aarch64-unknown-linux-gnu

macOS x86_64 (Intel)

cx-x86_64-apple-darwin

cxz-x86_64-apple-darwin

macOS ARM64 (Apple Silicon)

cx-aarch64-apple-darwin

cxz-aarch64-apple-darwin

Windows x86_64

cx-x86_64-pc-windows-msvc.exe

cxz-x86_64-pc-windows-msvc.exe

Windows ARM64 is not published for conda-express yet. conda-ship has Windows ARM64 builder assets, but full runtime bootstrap support still depends on the conda package ecosystem.

Each runtime has matching .sha256, .info.json, .packages.txt, and .runtime.lock metadata. Direct downloads are also covered by GitHub Artifact Attestations from the release workflow. For a quick attestation check:

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

See Verify Release Artifacts for checksum, metadata, lockfile, and air-gapped transfer checks.

cxz is the self-contained variant with the locked package archives embedded. See Offline and Air-Gapped Installs for details.

After downloading, make it executable and move it to your PATH:

chmod +x cx-x86_64-unknown-linux-gnu
sudo mv cx-x86_64-unknown-linux-gnu /usr/local/bin/cx

A multi-arch image is published to GHCR:

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

Works on Linux, macOS, and Windows via Docker Desktop. The image runs as non-root (uid 65532), includes provenance attestations and SBOMs, and can run with a read-only root filesystem when the managed prefix is mounted as a writable volume.

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

A pre-bootstrapped cxz image is also available — conda is already installed, no bootstrap step needed:

docker run --rm ghcr.io/jezdez/conda-express:latest-cxz create -n myenv python=3.12
pip install conda-express

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

Bootstrap#

Bootstrap conda, create an environment, and activate it

If you used the installer script, bootstrap has already been run for you. Otherwise, run it manually:

cx bootstrap

Bootstrap uses the built-in runtime lock, so it does not solve an environment at runtime. The prefix is protected with a CEP 22 frozen marker to prevent accidental modification. Bootstrap also writes conda-meta/history and conda-meta/initial-state.explicit.txt, so conda recognizes the managed prefix as an environment and conda-self can reset it to the shipped package set.

Set up your PATH#

This step is optional. Add the managed condabin directory to your shell profile only if you want to run the bootstrapped conda executable directly:

export PATH="$HOME/.conda/express/condabin:$PATH"

Create an environment#

cx create -n myenv python=3.12 numpy pandas

Activate an environment#

cx uses conda-spawn instead of traditional conda activate. This spawns a new subshell with the environment activated — no conda init or shell profile modifications needed:

cx shell myenv

To leave the environment, exit the subshell:

exit    # or Ctrl+D

Use conda commands#

cx delegates conda commands after bootstrap

Ordinary conda commands can be run through cx:

cx install -n myenv scipy matplotlib
cx list -n myenv
cx remove -n myenv scipy
cx env list

Auto-bootstrap#

If you skip cx bootstrap and run a conda command directly, cx bootstraps on first use:

# This bootstraps ~/.conda/express automatically, then runs `conda create`
cx create -n myenv python=3.12

Updating#

If you used an early cx release that bootstrapped into ~/.cx, read Upgrade From Early cx Versions before removing old files. Current releases bootstrap into ~/.conda/express.

To update the base conda installation, re-bootstrap:

cx bootstrap --force

To reset the existing managed base prefix to the package set shipped by the runtime, use the conda-self snapshot written during bootstrap:

cx self reset --snapshot installer-exact

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. It also cleans up PATH entries from shell profiles and prints a hint for removing the cx binary through your original install method. See the CLI reference for all options.