Skip to content

Migration: uvpipx → ixt

Same core concepts — isolation, exposure, injection — generalized across three backends.

ixt is the successor to uvpipx. It carries the same model you already know, but works on Python, Node, and GitHub Releases — not just PyPI.


Command equivalence

Action uvpipx ixt
Install uvpipx install ruff ixt tool install ruff
Install, configure expose after uvpipx install ruff --expose __all__ ixt tool install ruff --bare && ixt tool config ruff expose __all__
Force reinstall uvpipx install ruff --force ixt tool install ruff --reinstall
Inject uvpipx inject ruff art ixt tool config ruff inject art
Remove injection uvpipx uninject ruff art ixt tool config ruff uninject art
Uninstall uvpipx uninstall ruff ixt tool uninstall ruff
Uninstall all uvpipx uninstall-all ixt tool uninstall --all
Upgrade uvpipx upgrade ruff ixt tool upgrade ruff
Upgrade all uvpipx upgrade-all ixt tool upgrade --all
List uvpipx list ixt tool list
Info uvpipx info ruff ixt tool info ruff
Get venv path uvpipx info ruff --get-venv ixt tool where ruff
Inspect env uvpipx venv ruff -- cmd ixt tool shell ruff (inspection shell, not activated)
Re-expose uvpipx expose ruff __all__ ixt tool config ruff expose __all__
Re-expose all uvpipx expose-all __all__ ixt tool config __all__ expose __all__
PATH setup uvpipx ensurepath ixt setup path
Diagnostics ixt doctor
Verbose uvpipx -v install ruff ixt -v install ruff

✨ What's new in ixt

Multi-backend

uvpipx was Python-only. ixt handles three ecosystems with the same commands:

ixt tool install ruff                    # Python (PyPI)
ixt tool install @biomejs/biome          # Node (npm)
ixt tool install BurntSushi/ripgrep      # Binary (GitHub Releases)

Declarative configuration

uvpipx had no config file. ixt introduces ixt.toml:

ixt tool export > ixt.toml         # snapshot current state
ixt tool apply                           # reproduce on another machine

Configuration guide

Unified commands

uvpipx used separate commands for variants. ixt unifies with flags and a config namespace:

uvpipx uninstall-all          →  ixt tool uninstall --all
uvpipx upgrade-all            →  ixt tool upgrade --all
uvpipx expose-all __all__     →  ixt tool config __all__ expose __all__
uvpipx inject ruff art        →  ixt tool config ruff inject art
uvpipx uninject ruff art      →  ixt tool config ruff uninject art

Environment navigation

ixt tool shell opens a subshell in a tool's directory; ixt tool where prints the path for scripts:

ixt tool shell ruff                      # opens subshell in ruff's env
ixt tool where ruff                      # prints the path

This is intentionally an inspection shell: it changes directory into the env but does not activate a venv, patch PATH, or inject NODE_PATH.


Migrating your tools

A migration script reads your uvpipx metadata and generates an ixt.toml.

# Preview what would be migrated
curl -fsSL https://gitlab.com/pytgaen-group/ixt/-/raw/main/scripts/migrate-uvpipx.py \
  | python3 - --dry-run

# Generate ixt.toml
curl -fsSL https://gitlab.com/pytgaen-group/ixt/-/raw/main/scripts/migrate-uvpipx.py \
  | python3 - -o ixt.toml

# Review and apply
cat ixt.toml
ixt tool apply

Using uv instead of system Python

curl -fsSL https://gitlab.com/pytgaen-group/ixt/-/raw/main/scripts/migrate-uvpipx.py \
  -o /tmp/migrate-uvpipx.py
uv run python /tmp/migrate-uvpipx.py -o ixt.toml

The script reads ~/.local/uv-pipx/venvs/*/uvpipx.json and extracts package names, exposure rules, and injected packages. Override the uvpipx location with --uvpipx-home /path or UVPIPX_HOME.

# Check what uvpipx has installed
uvpipx list

# Install each tool with ixt
ixt tool install ruff
ixt tool install mypy
ixt tool install httpie --bare
ixt tool config httpie expose http https

# Verify everything works
ixt tool list
ixt doctor

# Then remove uvpipx
uvpipx uninstall-all
uv tool uninstall uvpipx

Directory changes

uvpipx ixt
Home ~/.local/uv-pipx/ $IXT_HOME (default ~/.local/share/ixt, XDG)
Envs ~/.local/uv-pipx/venvs/ $IXT_HOME/installed/envs/
Binaries ~/.local/uv-pipx/bin/ $IXT_HOME/installed/bin/
Metadata uvpipx.json per env ixt.json per env

Exposure rules — fully compatible

All uvpipx expose rules work as-is

  • __main__ — primary binary
  • __eponym__ — binary matching tool name
  • __all__ — all binaries
  • Explicit list: ["http", "https"]
  • Aliases: ["rg:ripgrep"] — syntax <binary-in-env>:<shim-on-PATH>

See Exposure rules → Aliases for the full syntax reference and examples.