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:
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:
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
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.