Repository navigation
Releases
v1.4.1: Setup Keeps a Working venv
🐛 Fixes
PyPilot 1.4.1 fixes how pypilot setup treats an existing environment on Windows.
- Setup keeps a venv that is already right. If
.venvalready runs the Python setup chooses, still has its interpreter and does not pull in the base Python's packages, setup keeps it and only syncs the packages. Before, it always rebuilt the venv. - A venv in use is never half-deleted. Rebuilding a venv while the editor runs its Python (a language server, a notebook kernel, an activated terminal) failed with
Access is denied. (os error 5)on.venv\Scripts, but only after uv had already deleted every installed package. Now setup,doctor --fixandinstallcheck first, leave the venv untouched, and say what to close:python.exe in .venv is running, so PyPilot left the environment as it is.
🧭 Zed tasks
- The task templates are now
tasks/windows.jsonandtasks/macos-linux.json. They run thepypiloton yourPATH, or else the copy the Zed extension downloaded, so they work on a machine where only the extension is installed. Copy the one for your OS again to get this.
The Zed extension picks up this engine the next time Zed starts. The VS Code extension and pypilot-cli still ship 1.4.0.
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Verify a download:
sha256sum -c SHA256SUMS --ignore-missing
gh attestation verify pypilot-linux-x64.tar.gz -R pypilot-dev/pypilotFull Changelog: v1.4.0...v1.4.1
v1.4.0: Targeted Fixes & Known Breakages
✨ What's New
PyPilot 1.4.0 fixes what is actually wrong. Before, Fix environment and doctor --fix rebuilt the environment for every problem, and could move a project to another Python on the way. Now every finding brings its own fix. A healthy project is left alone, the Python moves only when a dependency forces it, and every file PyPilot edits is named.
We tested it on 54 deliberately broken environments: corrupted venvs, Python mismatches, dependency conflicts, pixi, conda and Poetry projects, and breakages collected from Stack Overflow and GitHub issues. 45 now get the right targeted fix (13 before), none get a wrong one (9 before) and none are missed (21 before). The rest are reported with what you need to change.
📖 New guide: What doctor --fix fixes
🎯 A fix for each problem
- Lock and environment drift:
uv sync --lockedfor a missing or drifted package,uv lockfor a stale lock, a reinstall of only the half-installed package. - Damaged venvs (a missing interpreter or
pyvenv.cfg, system site-packages leaking in) are rebuilt on the Python they had, in place, even invenv/orenv/. - Python version:
requires-pythonand.python-versionare checked against the venv. An existing pin wins unless a dependency forces a change, the Python a fix picks is written to.python-version, andrequires-pythonis raised when a dependency needs it. An impossiblerequires-python(>=3.16,>=3.10,<=3.9) is an error, and nothing is built. - Honest results: a fix with a failed step no longer says "Done", and
--dry-runlists exactly what the real run does. Running the fix twice changes nothing the second time.
🧩 Conflicts resolved before anything changes
- Unsatisfiable pins get a relaxed pin, checked with uv before it is offered. An edit that leaves the project unresolvable is rolled back.
- Typos get "did you mean", versions that do not exist get the nearest releases, and packages with no build for this OS get an environment marker (
uvloopon Windows). - Undeclared imports (notebooks included) are added with the right distribution:
yamlbecomes PyYAML andsklearnbecomes scikit-learn.installandcheckaccept import names too.
📚 Known breakages
A new data table, known_breakages.json, refreshed weekly like the others, covers breakages that package metadata does not show:
- numpy 2 breaking old compiled packages (pandas before 2.2.2).
- Uncapped dependencies that later removed an API: markupsafe and jinja2, werkzeug and flask, itsdangerous and flask, urllib3 and requests-toolbelt, sqlalchemy and flask-sqlalchemy, importlib-metadata and flake8, setuptools 82 and
pkg_resources. - Shadowing packages (
jwtandPyJWT,enum34,typing) and yanked pins. - Removed stdlib modules (
distutils,imp, the 3.13 removals) and removed APIs in your own code (np.float,collections.Mapping,asyncio.coroutine,pydantic.BaseSettings, SQLAlchemy 2engine.execute, pandas 2DataFrame.append), reported by file and line with the replacement. - Releases that break on a newer Python: SQLAlchemy 2.0.0 to 2.0.30 on 3.13+, Flask before 2.3.3 on 3.14+.
🧪 pixi, conda and Poetry
- pixi: doctor's
pixi add python=X.Yis applied, and a broken prefix is repaired. - A conda
environment.ymlmoves to pixi and keeps its Python. - Poetry projects are read (
^and~constraints, groups) and installed with Poetry. - requirements.txt no longer overwrites pyproject.toml pins, lines with an obvious mistake are fixed, and the rest are reported by line number.
🛠️ Also
- New command:
pypilot fix requirements.<mode> --helpprints that mode's help. - New
fix.kindvalues in the JSON output; older kinds serialize as before. See the output reference. - The Zed "fix environment" task now runs
doctor --fix; a separate task keeps the fullsetup. - Release builds moved off the retired macOS 14 runners.
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Via VS Code: PyPilot for VS Code
Via pip:
pip install --upgrade pypilot-cliVerify a download:
sha256sum -c SHA256SUMS --ignore-missing
gh attestation verify pypilot-linux-x64.tar.gz -R pypilot-dev/pypilotFull Changelog: v1.3.0...v1.4.0
v1.3.0: pixi Advisory & Migration, Explain, JSON Output, Release Integrity
✨ What's New
PyPilot 1.3.0 recommends pixi when pip and uv hit a wall they cannot climb, moves a project to pixi on request, explains every verdict in detail, and makes every command scriptable. Releases are now verifiable end to end.
📖 New documentation site: https://pypilot-dev.github.io/pypilot/
🧪 pixi: from supported to recommended
- "pixi can help here": in a pip or uv project, PyPilot recognises problems conda-forge solves and pip cannot: a package with no wheel for your platform that needs native libraries (GDAL, PROJ, GEOS…), a build that failed on a missing header such as
gdal.h, CUDA sources withoutnvcc, a repo mixing Python with R, Rust or C++. It suggests pixi; it never converts on its own. pypilot migrate-to-pixi: previews a separatepixi.toml(conda-forge where available, PyPI otherwise, the Python your dependencies need), writes it with--write, installs with--install. It never touchespyproject.toml,requirements.txtorenvironment.yml. Alsomigrate-conda --to pixi,install-pixiandpackage_manager = "pixi"; in Zed and VS Code, "Initialize pixi project" asks before writing anything.- pixi doctor: every environment with its Python and drift between them, a chosen environment (
pixi_environment,--pixi-env), a read-only stale-pixi.lockcheck, and PyPI dependencies with no wheel for a platform the manifest declares.
🔍 Explanations
pypilot explain [package]: the resolution table behind a verdict,requires_pythonagainst the wheels per platform and which one limits the range; for a project, what blocks each Python ("3.13 is blocked by mediapipe 0.10.14, wheels end at cp312").pypilot checknames the project dependency a package conflicts with and suggests a conda-forge build when it fails.
🤖 Scriptable and previewable
--jsonon every command ({ "pypilot", "command", "ok", … }),--markdownondoctorandcheck.--dry-runonsetup,install,fix python,fix cudaand the newdoctor --fix: the exact commands and files, generated by the code path that runs for real.pypilot logs(a local, rotating, redacted log),pypilot completionsfor bash, zsh, fish and PowerShell,update-data --check,pypilot version.
🧭 Editors
- Workspace diagnostics:
diagnostics_scope = "workspace"checks every Python file and notebook, not only open ones. - Editor settings now reach the engine; before, VS Code's
pypilot.*settings had no effect on the server. Precedence: global file < editor < project file. - Other editors: a documented protocol with Neovim, Helix and Emacs setups (
helper/src/lsp/PROTOCOL.md).
🐛 Fixes
- Wheel resolution: a patch-level
requires-pythonsuch as>=3.8.1no longer drops the whole 3.8 line; 64-bit Windows no longer counts 32-bitwin32wheels; free-threadedcp3XXtwheels no longer count for the regular build; manylinux and musllinux wheels are kept apart. Now tested on Windows, macOS and Linux (glibc and musl, x64 and arm64). - Offline: PyPilot no longer calls every package it could not look up a typo. The editor stays quiet for those imports, and doctor lists them as "not checked".
- After a migration, doctor no longer warns that conda-forge packages will compile from source.
🔐 Release integrity
- Every release ships
SHA256SUMS, build-provenance attestations (gh attestation verify) and a CycloneDX SBOM; builds use--locked, andcargo-denyruns in CI. Dependencies were updated for advisories in rustls, tokio and zip.
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Via VS Code: PyPilot for VS Code
Via pip:
pip install --upgrade pypilot-cliVerify a download:
sha256sum -c SHA256SUMS --ignore-missing
gh attestation verify pypilot-linux-x64.tar.gz -R pypilot-dev/pypilotFull Changelog: v1.2.2...v1.3.0
v1.2.2: Python 3.15 Support
✨ What's New
PyPilot 1.2.2 adds support for Python 3.15, released on October 9.
🐍 Python 3.15
PyPilot only knew Python versions up to 3.14, so on a 3.15 project every package looked unsupported. That included pure-Python packages such as six and packages that already ship cp315 wheels such as numpy, and doctor told you to rebuild the environment on 3.14:
[ERROR] Python 3.15 is not supported by this project
numpy (supports 3.12–3.14), six (supports 3.7–3.14) do not support Python 3.15.
Python 3.15 is now recognised everywhere PyPilot reasons about versions:
- Wheels: pure-Python (
py3), stable-ABI (abi3) andcp315wheels count as supporting 3.15 - Interpreter discovery finds
python3.15andpy -3.15 - Recommendations: a project whose dependencies all run on 3.15 can be set up on it, while packages without 3.15 wheels (for example
mediapipe==0.10.14) are still reported correctly
The same project now reports:
supported Python: 3.12–3.15
✓ Everything looks good.
🛠 Maintenance
- The data check run before every change now flags a CPython release newer than the engine knows about, so the next Python version is picked up on release day
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Via VS Code: PyPilot for VS Code offers this update automatically
Via pip:
pip install --upgrade pypilot-cliFull Changelog: v1.2.1...v1.2.2
v1.2.1: Keep the Chosen Python & Check Pinned Versions
✨ What's New
PyPilot 1.2.1 makes sure the Python version PyPilot picks for a project is the one the project actually ends up running, and lets pypilot check answer questions about a specific version of a package.
🐍 Your environment stays on the Python PyPilot chose
uv rebuilds a project's .venv on whatever .python-version, or a global uv python pin, asks for. PyPilot built .venv on the version your dependencies need, but the next uv add or uv sync could quietly move it to another one while the report still said otherwise. For example, Fix Python reported "Environment now runs Python 3.12" while .venv was still on 3.14, so a dependency such as numpy==1.26.4 was installed on a Python it does not support.
- New projects get
requires-pythonand.python-versionset to the chosen Python - Setup on an existing uv project and Fix Python run
uv python pin <version>before syncing, so the rebuild sticks - If pinning fails, the step is shown in the report and the run continues
📁 Cleaner project setup
Projects without a pyproject.toml are now initialised with uv init --bare. Only pyproject.toml (and .python-version) is written. PyPilot no longer adds a git repository, README, sample code or build system to your folder. Older uv releases without --bare keep working.
🔎 check takes a version
pypilot check and the editor's Check package report accept anything you would write in requirements.txt, and judge the release it selects instead of the newest one:
$ pypilot check mediapipe==0.10.14
requirement : mediapipe==0.10.14
supported Python : 3.9–3.12
Before, check mediapipe==0.10.14 sent the whole string to PyPI as a package name and failed.
🐛 Clearer errors
- A misspelled package reads "
xis not on PyPI; check the spelling" instead of "PyPI has no usable metadata… PyPI returned 404 Not Found…" - A version that does not exist reads "
xhas no release 1.2 on PyPI"
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Via VS Code: PyPilot for VS Code offers this update automatically
From source:
cargo install --git https://github.com/pypilot-dev/pypilot --tag v1.2.1 pypilot-helper --lockedFull Changelog: v1.2.0...v1.2.1
v1.2.0: pixi Support & Pinned-Version Fixes
✨ What's New
PyPilot 1.2.0 adds first-class support for pixi projects and fixes two analysis bugs that could recommend the wrong Python for pinned dependencies.
🧪 pixi projects
- Detected automatically: a
pixi.toml, or[tool.pixi.workspace]inpyproject.toml, whateverpackage_manageris set to - Managed through pixi, never around it: setup runs
pixi install, installs runpixi add --pypi, moving Python runspixi add python=X.Y. PyPilot never creates a.venv, runs uv or touchespixi.lockin a pixi project, and if pixi is not installed it says so and changes nothing - The pixi environment is the environment: import diagnostics, installed packages (conda ones included), GPU checks and the Python version all come from
.pixi/envs/default - Install failures explained: when a PyPI dependency has no wheel for the environment's Python, PyPilot names the package and the fix, and turns pixi's own errors into plain language, e.g. "tensorflow 2.15.0 has no wheel for Python 3.12 (
cp312) on win-64; it only ships wheels for Python 3.9–3.11. Runpixi add python=3.11…" - Doctor speaks pixi: the recommended Python respects the manifest's
pythonspec, conda and PyPI dependencies are listed separately, and quick fixes read "Addrichwith pixi"
🐛 Fixes for every project
- PEP 440 version matching:
==2.15.0no longer matches2.15.0.post1, so pinned releases are analysed against their own wheels (a pinnedtensorflow==2.15.0now correctly reports Python 3.9–3.11 instead of 3.9–3.14) - Releases with no files for your platform (for example Linux-only wheels on Windows) are reported as cannot be installed here instead of being treated as supporting every Python, and no longer get contradictory GPU advice
🛠 Maintenance
- Tests run on
cargo nextest; a pre-release run covered uv, pip, notebook, broken-venv, pinned-version and pixi projects end to end
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Via VS Code: PyPilot for VS Code
Via pip:
pip install --upgrade pypilot-cliFull Changelog: v1.1.2...v1.2.0
v1.1.2: Moved to the pypilot-dev Organization
What's New
PyPilot now lives in the pypilot-dev GitHub organization, and this release updates every download address to match. There are no changes to how PyPilot behaves.
🏠 Moved to the pypilot-dev organization
- The Zed extension downloads the helper from
pypilot-dev/pypilot, and its download permission names that path - Installed engines refresh the bundled GPU/CUDA data tables from the new location
- Repository links in the manifests and the data checker point at the new home
🤝 Community files
- Added
CONTRIBUTING.md(including how the AGPL-3.0 engine and the Apache-2.0 Zed extension fit together), a Contributor Covenant 2.1CODE_OF_CONDUCT.md, issue templates and aCHANGELOG.md
Older versions keep working: GitHub redirects the old addresses. Zed extensions older than this version can only download from the old path, so until Zed updates them they keep using the helper they already have.
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Via pip:
pip install --upgrade pypilot-cliFull Changelog: v1.1.0...v1.1.2
v1.1.0: GPU Architecture, CUDA Extensions & Environment Health
✨ What's New
PyPilot 1.1.0 is built from the most common environment problems reported on Stack Overflow, GitHub and the Hugging Face forums: GPU builds that don't match the card, CUDA packages that won't install, broken venvs and binary mismatches. All of them are caught before they turn into a crash.
🎮 GPU & CUDA
- RTX 50-series (Blackwell) support: PyPilot now reads the GPU's compute capability, not just the driver. Blackwell cards (sm_120) need a CUDA 12.8+ build and torch 2.7+; older builds fail with "no kernel image is available". If no build fits both the driver and the card, PyPilot says exactly what to do (update the driver, or
torch==X --index-url cuY) - Installed torch checked against the GPU: a torch build that's too old for the card, or a CPU-only torch on an NVIDIA machine (e.g. after another install swapped it), gets a warning with the exact reinstall command
- GPU self-test after install: right after PyPilot installs torch, it checks
torch.cuda.is_available()and the supported architectures, and explains any mismatch - uv projects keep the CUDA build: the driver-matched PyTorch index is now recorded in
pyproject.toml([[tool.uv.index]]+[tool.uv.sources], Linux/Windows only), souv syncanduv runno longer reinstall CPU torch.pypilot fix cudasticks in uv projects too - TensorFlow on native Windows: TF 2.11+ has no GPU support on native Windows. PyPilot now says so instead of implying a GPU build, and suggests WSL2 with
tensorflow[and-cuda] - Current CUDA data: torch 2.13–2.14.1 and CUDA 13.0–13.4 driver minimums. New drivers now get the newest matching build (e.g. cu132 instead of cu126)
🧩 CUDA extension packages
- flash-attn, xformers, bitsandbytes, mamba-ssm, causal-conv1d are checked before install: source-only packages that need nvcc and
--no-build-isolation, missing Windows/macOS wheels, and xformers releases pinned to a different torch than yours. Each warning suggests an alternative such as PyTorch SDPA or WSL2 - Import quick fixes for these packages explain the problem instead of offering an install that will fail
🩺 Environment health
- Broken
.venvdetection: if the Python a venv was built on has been moved or removed, you get one clear error and a working Rebuild fix, instead of confusing "not installed" squiggles - NumPy 1 vs 2 mismatches: packages built for NumPy 1.x next to NumPy 2 are named before they crash with "numpy.dtype size changed". A light
pip checkcovers other installed dependency conflicts - Source builds explained: PyPilot tells apart packages that definitely need a compiler from ones that may not, gives the fix for your OS (Microsoft C++ Build Tools,
xcode-select --install,build-essential, rustup), skips advice for tools you already have, and names a Python version that has ready-made wheels
📓 Notebooks
- ipykernel pinned to
>=6.31.0,<7. This avoids both ipykernel 7.0.0 (cannot connect on Python 3.14) and the 7.x notebook hangs reported in VS Code. An ipykernel you installed yourself is left alone
🟦 Zed
- Nested projects: when the opened folder has no Python project but a single subfolder does, PyPilot works on that subfolder
- Optional pyright pin: after setup, Zed users can choose to point pyright/basedpyright at
.venv. PyPilot never does this without asking and never overwrites existing config
🛠 Maintenance
scripts/check_data.pyreports when the bundled GPU/framework tables fall behind PyPI and PyTorch, and checks that table changes stay compatible with released engines. A weekly CI job runs itAGENTS.mddocuments the data-first workflow and commit rules for contributors and AI agents
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Via VS Code: PyPilot for VS Code
Via pip:
pip install --upgrade pypilot-cliFull Changelog: v1.0.5...v1.1.0
v1.0.5: Jupyter Notebooks & Install-All Quick Fix
✨ What's New
📓 Jupyter notebooks
- Diagnostics and quick fixes inside
.ipynbcells (VS Code). Each Python cell is analyzed like a.pyfile; markdown cells are skipped - IPython magics and shell escapes (
%pip install,!ls,%%time,x = !pwd) are ignored, and cells whose body isn't Python (%%bash,%%writefile) are skipped - Notebook projects get a usable kernel: whenever PyPilot sets up the environment or installs a package in a project with notebooks, it ensures
ipykernel>=7.0.1is in.venv(as a dev dependency in uv projects). Older ipykernel releases fail to connect on Python 3.14 - New warning "Notebooks can't use .venv yet" when the environment lacks ipykernel, and a folder of notebooks now counts as a Python project
📦 Install several packages at once
- Select several unresolved imports → one quick fix installs them all (
Install 3 packages: numpy, pandas, requests), listed first and preferred - "Install all N missing packages in this file / notebook" covers the whole document, since a notebook selection can't span cells
- Same for creating or rebuilding the environment. Packages share one installer run; GPU-matched torch/tensorflow builds get their own so their index URL can't affect anything else
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Via pip:
pip install --upgrade pypilot-cliFull Changelog: v1.0.4...v1.0.5
v1.0.4: Windows Fixes, Offline Resilience & Command Results
✨ What's New
🪟 Windows fixes
- No more console windows flashing while the language server runs
python,uvornvidia-smi - Colored CLI output works in older consoles (cmd.exe, Windows PowerShell) instead of printing raw escape codes
- Every installed Python is found, including versions only reachable through the
pylauncher, so pip mode no longer reports installed versions as missing requirements.txtsaved as UTF-16 or with a BOM (whatpip freeze > requirements.txtproduces in Windows PowerShell 5) is now read correctly
📡 Offline resilience
- When PyPI can't be reached, PyPilot uses its expired cache instead of reporting every dependency as unresolvable
- The Zed extension starts the helper it downloaded earlier when GitHub can't be reached
🧩 Editor integration
- Environment-changing commands (
fixEverything,installPackage,recreateWithPython,installUvGlobally) now return{"ok": bool}, so the VS Code extension no longer reports success after a failed setup. Zed ignores the result, so nothing changes there. showDetailsaccepts a package argument and adds apypilot checksection to the report- The onboarding scan runs in the background, and out-of-order edits can no longer leave the language server with stale buffer text
pypilot fix python/fix cudanow refresh the editor afterwards, assetupandinstallalready did
🐛 Fixes
- Inline comments no longer leak into version specifiers (
numpy==1.26 # note) - An
=inside aname @ urlreference is no longer read as a version pin - A failed copy of the managed uv binary is reported instead of ignored
📦 Installation
Via Zed (recommended): Install the PyPilot extension from the Zed extension registry
Via pip:
pip install pypilot-cliFull Changelog: v1.0.3...v1.0.4