Releases: 1minds3t/uv-ffi
Release list
uv-ffi v0.10.8.post15 - Self-Healing Bubble Installs, Plan IPC, and 12ms Persistence
This is a landmark architectural release for uv-ffi. It introduces atomic, self-healing persistent states for isolated --target environments ("bubbles"), establishes a bidirectional IPC contract between Rust and Python, and drops cache-warm installation latency to ~12ms.
uv traditionally assumes a perfectly healthy filesystem, leading to ghost files or fatal panics when the environment or cache is externally modified. uv-ffi now implements a pre-flight surgical healing pipeline for --target installs:
-
Ghost
dist-infoEviction: Detects metadata without matching package directories and evicts them prior to resolution so the planner sees the correct filesystem state. -
Orphan Dir Wipe: Detects package directories without matching
.dist-infometadata and wipes them before the Installer runs. This guarantees stale.pyfiles don't persist across interrupted version changes. -
Corrupted Cache Retry: Intercepts
uv's fatalarchive-v0cache panics (e.g., mismatched wheel versions), surgically evicts the corrupted archive on disk, and automatically forces a rescan and retry. -
Rust now publishes resolved plan entries (
cached,remote,reinstall,extraneous) to a staticINSTALL_PLANand fires aPLAN_READY_CALLBACKbefore execution. -
Python can now intercept the installation plan via
set_plan_callback()and optionally returnTrueto gracefully short-circuit the Rust installer, allowing Python to take ownership of the operation. -
12ms Bubble Installs: Implemented a persistent
BUBBLE_SITE_PACKAGES_CACHE. Bubble target states are now cached in memory entirely decoupled from the main environment, dropping--targetinstallation latency from 30ms to ~12ms. -
Surgical Cache Control: Added
evict_packages_from_bubble_cacheandpatch_bubble_site_packages_cachepyfunctions for Python-side memory map updates without requiring a 2.5ms disk rescan. -
Native Module Rename: Renamed the native extension from
uv_ffi.uv_ffitouv_ffi._native. This prevents the.sobinary from hijacking the Python module namespace during import. -
Docstring & Type Contract: Completely overhauled
uv_ffi/__init__.py. Added comprehensive IPC contract documentation, data flow maps, type-hinted wrappers, and_noopsafety stubs for legacy binaries to preventAttributeErrorcrashes on older platforms. -
Note:
mark_plan_handled()has been deprecated. Python should return a boolean directly from the callback instead. -
Backfill workflows now correctly parse and handle
.tar.gzsource distributions alongside wheels. -
Updated PyPy wheel build arguments and temporarily removed WebAssembly target steps.
-
Fixed race conditions in exotic wheel workflow polling.
-
Cleaned up repository tracking (removed accidental
uvs_lib.rsduplication).
📝 Code Changes:
- UPDATE: crates/uv-ffi/python/uv_ffi/init.py (260 lines changed)
- UPDATE: crates/uv-ffi/src/lib.rs (310 lines changed)
- UPDATE: crates/uv/src/commands/pip/install.rs (258 lines changed)
- UPDATE: crates/uv/src/commands/pip/operations.rs (75 lines changed)
- UPDATE: crates/uv/src/lib.rs (13 lines changed)
⚙️ Configuration:
- crates/uv-ffi/pyproject.toml (8 lines)
New Features:
- feat: 12ms bubble installs via persistent BUBBLE_SITE_PACKAGES_CACHE
Bug Fixes:
- fix: route bubble staging through /tmp — 13ms installs
Updates:
- Update README.md
- Update build args for PyPy wheel in workflow
- Update PyPy wheel build and remove WebAssembly steps
14 files changed, 830 insertions(+), 175 deletions(-)
uv-ffi v0.10.8.post14 - improve exotic-wheels installation reliability and index compatibility
Installation Improvements
Updated installation guidance for exotic-wheels hosted packages.
Previous documentation recommended using:
pip install uv-ffi -f https://exotic-wheels.github.io/While this can work in certain cached or direct-link scenarios, --find-links (-f) is not intended to behave as a scalable multi-package package index.
The recommended installation method is:
pip install uv-ffi --extra-index-url https://exotic-wheels.github.io/--extra-index-url properly integrates the exotic-wheels PEP 503 index with PyPI and allows pip to:
-
resolve packages through per-package index pages
-
fall back cleanly to PyPI
-
avoid flat-index scaling issues
-
work reliably across fresh environments and machines
-
avoid cache-dependent behavior seen with
--find-links -
--find-linksremains supported for direct wheel pages and local wheelhouses -
HTTPS is required for proper pip index integration
-
Documentation was updated to reflect the correct long-term installation workflow
📝 Code Changes:
- UPDATE: crates/uv-ffi/build.rs (3 lines changed)
📚 Documentation:
- README.md (2 lines)
- crates/uv-ffi/README.md (6 lines)
Updates:
- Update backfill_wheels.yml
- Update Python version in build-wheels workflow
- Update tag resolution for GitHub Release upload
- Update rust-toolchain version to 1.77.0
- Update Rust toolchain version to 1.91.0
- Update build-wheels-extended.yml to include new argument
9 files changed, 207 insertions(+), 162 deletions(-)
uv-ffi v0.10.8.post13 - abi3 feature flag + cp37 support + piwheels memory fix
This release brings official support for Python 3.7 (End-Of-Life) without impacting modern Python environments, introduces a new dedicated domain for extended/exotic wheels, and ships critical memory optimizations to prevent Out-Of-Memory (OOM) errors on constrained 32-bit build systems like PiWheels.
-
Elegant Python 3.7 Backwards Compatibility:
- Converted PyO3
abi3-py38from a hard requirement to a default-enabled Cargo feature. - Python >= 3.8 continues to use the highly compatible
abi3single-wheel target. - Python 3.7 drops the
abi3feature during source builds (--no-default-features), gracefully falling back to a version-specific (cp37-cp37m) extension. - Lowered
requires-pythoninpyproject.tomlto>=3.7and added the appropriate PyPI classifiers.
- Converted PyO3
-
Proactive Source Build Fallback Guides: Updated the
build.rsscript to output a highly visible ASCII-art warning when a source build fails, immediately directing users to the pre-builtexotic-wheelsindex. -
New Dedicated Exotic Wheel Index: Migrated extended wheel hosting from the personal GitHub Pages URL to a new dedicated domain:
https://exotic-wheels.github.io/. -
Resolved 32-bit ARM OOM Crashes: Fixed a critical issue where compiling on Raspberry Pi build nodes would crash LLVM due to memory exhaustion.
-
Workspace Profile Inheritance: Moved the
[profile.release]block out ofcrates/uv-ffi/Cargo.tomland into the root workspaceCargo.tomlso Maturin correctly applies it. -
Aggressive Size/Memory Tuning: Changed optimization levels from
stoz(most aggressive size/memory optimization) and fine-tunedcodegen-unitsto heavily restrict peak RAM usage per thread. -
Automated Wheel Indexing (
build_index.py): Added a new Python script that dynamically fetches release assets from PyPI and GitHub Releases, seamlessly generating a static HTML index forpipto parse via--extra-index-urlor-f. -
Extended
cp37CI Matrices: Added dedicatedmanylinux_2_17jobs to automatically build CPython 3.7 wheels acrossx86_64,aarch64,i686,armv7, andppc64le. -
Toolchain Pinning: Pinned the Rust toolchain to
1.77.0in the extended build workflows to ensure maximum compatibility with older legacy targets. -
Workflow Tag Matching: Improved GitHub Actions tag matching logic to gracefully handle blank-tag manual workflow dispatches.
📝 Code Changes:
- UPDATE: crates/uv-ffi/build.rs (15 lines changed)
⚙️ Configuration:
- Cargo.toml (4 lines)
- crates/uv-ffi/Cargo.toml (13 lines)
- crates/uv-ffi/pyproject.toml (5 lines)
Updates:
- Update tag matching logic in publish workflow
13 files changed, 171 insertions(+), 28 deletions(-)
uv-ffi v0.10.8.post12 - The "PiWheels Survival & Global Index" Release
This release brings massive improvements to memory-constrained builds (solving the dreaded 32-bit LLVM Out-Of-Memory crashes) and fully launches our PEP 503-compliant Extended Wheel Index on GitHub Pages.
-
Fixed LLVM OOMs on 32-bit architectures: Applied a strict memory-safe
[profile.release]to the workspace root (where Cargo actually respects it). -
Disabled LTO & Chunked Codegen: Set
lto = falseandcodegen-units = 16to prevent the compiler from exhausting the 3GB 32-bit address space during the final linking phase. -
Binary Shrinkage: Added
opt-level = "s",panic = "abort", andstrip = true. This drops peak RSS RAM usage during compilation by gigabytes and shrinks the final.sobinary size from ~55MB down to <15MB. -
Fully Functional PEP 503 Index: The CI now generates a static, pip-compatible HTML index and deploys it directly to GitHub Pages (
https://1minds3t.github.io/uv-ffi/). -
Fixed API Pagination (The Ghost Asset Bug): Refactored the
backfill_wheels.ymlscript to properly paginate through the GitHub Releases API. All 600+ exotic wheels are now correctly discovered and indexed (bypassing the 100-item hard limit). -
macOS Optimization: Filtered out redundant macOS
x86_64andarm64wheels from the index in favor of theuniversal2binaries to reduce index bloat. -
Conda-Forge Recipe Added: Shipped the initial
meta.yamlto prepareuv-ffifor official distribution on theconda-forgechannel. -
Smarter Build Fallbacks: Updated the
build.rscompile-time warnings andREADME.mdto explicitly map out which architectures are served from PyPI (Mainstream ABI3) vs. our Extended Index (musllinux, armv7, riscv64, s390x, ppc64le, PyPy, 3.13t).
📝 Code Changes:
- UPDATE: crates/uv-ffi/build.rs (10 lines changed)
⚙️ Configuration:
- Cargo.toml (7 lines)
- crates/uv-ffi/Cargo.toml (8 lines)
- crates/uv-ffi/pyproject.toml (2 lines)
Additional Changes:
- chore: Update configuration
- chore: apply strict memory-safe release profile to workspace root for PiWheels
- chore: optimize release profiles to fix ARM32 OOMs and reduce binary size
Updates:
- Update README with link to browse all wheels
- Update backfill_wheels.yml to exclude specific wheels
8 files changed, 147 insertions(+), 67 deletions(-)
uv-ffi v0.10.8.post11 - PiWheels and ARM Optimization
v0.10.8.post11
This release focuses on CI/CD infrastructure improvements and build reliability fixes, particularly for resource-constrained build environments like piwheels.
Build Fixes
• Added lower memory build settings to Cargo.toml to prevent OOM crashes on piwheels for Python 3.13 aarch64 builds
CI/CD Overhaul
• Completely refactored the publish workflow — wheels now go to both GitHub Releases and PyPI
• Added new publish-collect.yml workflow that waits for all three platform builds to succeed before publishing, preventing partial releases
• Improved backfill workflow to target both GitHub Releases and PyPI with better artifact handling
• Switched from PYPI_API_TOKEN to OMNIPKG_DEPLOY_KEY for PyPI authentication
• Enhanced error logging for upload failures to make debugging easier
• Added workflow_dispatch trigger and tag input to publish-collect for manual runs
Infra
• Refactored find_run to handle multiple RUN_IDs
• Added functions to locate latest successful workflow runs for backfill targeting
⚙️ Configuration:
- crates/uv-ffi/Cargo.toml (5 lines)
4 files changed, 667 insertions(+), 337 deletions(-)
uv-ffi v0.10.8.post10 - The Local Filesystem Auto-Heal Release
The Local Filesystem Auto-Heal Release
This release introduces a surgical, high-performance auto-healing mechanism for local filesystem desyncs, making the uv-ffi engine practically immune to external tampering (like a rogue pip uninstall run outside of the daemon).
-
Local Filesystem Auto-Heal: If an external tool modifies the environment behind
uv-ffi's back, the in-memory cache becomes stale. The engine now explicitly catches the resultingos error 2 (No such file or directory)when trying to read missingdist-info/METADATAfiles. It automatically drops the RAM cache, forces a true disk rescan, and transparently retries the install. -
Proactive Patching Proven: Benchmarking this new heal path (~7.6ms) against a proactive delta-patch (~4.0ms) mathematically proved that calling
patch_site_packages_cachesaves ~3.6ms per invocation. It bypasses both the disk rescan penalty and allows the hot dependency resolver to skip cold evaluation logic entirely. -
README Accuracy: Updated the Python API examples to correctly reflect the new 4-tuple return signature (
rc, installed, removed, err) introduced inpost6. -
Cleaned Examples: Simplified the
pip installexamples in the documentation, removing redundant default flags (like--link-mode). -
Wheel Backfill Polish: Improved the
.github/workflows/backfill_wheels.ymlscript to handle artifact extraction and temporary directories more robustly, preventing disk bloat on the GitHub runner. -
HTML Generation Fixes: Fixed indentation and formatting bugs in the automated PEP-503 GitHub Pages index generator.
📝 Code Changes:
- UPDATE: crates/uv-ffi/src/lib.rs (15 lines changed)
⚙️ Configuration:
- .github/workflows/backfill_wheels.yml (179 lines)
Additional Changes:
- perf: auto-heal stale site-packages cache on dist-info ENOENT
- Update configuration
4 files changed, 124 insertions(+), 132 deletions(-)
uv-ffi v0.10.8.post9 - Fix sdist NOTICE packaging & self-healing registry cache
⚙️ Configuration:
- crates/uv-ffi/pyproject.toml (2 lines)
1 file changed, 1 insertion(+), 1 deletion(-)
uv-ffi v0.10.8.post8 - The UX Safety Net & Wheel Backfill Release
The UX Safety Net & Wheel Backfill Release
This release completely overhauls the developer experience (DX) for users on "exotic" platforms (musl, PyPy, riscv64, s390x, etc.) and introduces a massive CI backfill system to ensure every wheel ever built is permanently indexed and available.
-
Smart Source Build Hints (
build.rs): If a user runspip install uv-ffion an exotic platform andpipattempts to build from source, a custombuild.rsscript now intercepts the build process. Before throwing a compiler error, it explicitly prints a clean, highlighted warning instructing the user to use the--extra-index-urlto grab the pre-built wheel. -
Graceful Import Failures (
__init__.py): Added a pure-Python wrapper around the native extension. If the.so/.pydfile fails to load due to ABI/architecture mismatches, the resultingImportErroris intercepted. The user is presented with a highly descriptive error detailing their OS/Architecture and the exactpipcommand to resolve the issue using the extended GitHub index. -
Historical Wheel Recovery: Deployed a powerful new
backfill_wheels.ymlworkflow. This script scans the GitHub API across all past CI runs, deduplicates, downloads, and intelligently routes hundreds of non-expired exotic wheels into their correct GitHub Releases. -
Unified PEP-503 Index: The index generator now intelligently merges PyPI's JSON API responses with the GitHub Release assets, creating a single, comprehensive HTML index of every
uv-ffiwheel in existence. -
README Overhaul: Completely rewrote the root and crate-level
README.mdfiles to clearly separate "Standard Platforms" (PyPI) from "Exotic Platforms" (GitHub Pages), complete with a detailed compatibility matrix. -
Surgical Publishing: Added a
source_onlymanual dispatch option topublish.ymlallowing for quick, wheel-less updates to the source distribution. -
Strict Platform Filtering: Enhanced the publish workflow to strictly filter which CPython targets are permitted onto PyPI, guaranteeing the 10GB limit is never breached.
📚 Documentation:
- crates/uv-ffi/CHANGELOG.md (33 lines)
⚙️ Configuration:
- crates/uv-ffi/pyproject.toml (9 lines)
Updates:
- Update HTML writing logic in backfill_wheels.yml
8 files changed, 600 insertions(+), 332 deletions(-)
uv-ffi v0.10.8.post7 - ABI3 Wheels & Split Distribution Pipeline
This release introduces a major overhaul of the uv-ffi build and distribution system, significantly reducing PyPI storage usage while improving install reliability across platforms.
uv-ffi now builds using abi3-py38, producing one wheel per architecture compatible with all Python versions ≥3.8.
- Eliminates per-version wheel duplication (cp38–cp313)
- Reduces PyPI storage footprint dramatically
- Speeds up CI build times
- Simplifies downstream compatibility
The release pipeline now separates artifacts into two tiers:
-
PyPI (Primary Distribution)
- macOS
universal2 - Linux
manylinux(x86_64, aarch64) - Windows (
amd64,arm64) - (optional musllinux targets)
- macOS
-
GitHub Releases (Extended/Exotic)
- s390x, ppc64le, riscv64
- legacy / niche architectures
- experimental targets
This keeps PyPI lean while still supporting advanced use cases.
A lightweight index is now generated from GitHub Release assets, allowing access to non-PyPI wheels.
This lays the groundwork for:
--extra-index-urlusage- external wheel hosting without PyPI storage pressure
-
Single Orchestrator Workflow
publish.ymlnow owns the full release lifecycle- build workflows no longer auto-trigger on release
- eliminates duplicate CI runs and race conditions
-
Artifact Routing
- Wheels are automatically classified and routed to:
- PyPI (core)
- GitHub Releases (exotic)
- Wheels are automatically classified and routed to:
-
Improved Reliability
- Increased workflow timeouts for large builds
- Added retry logic for checkout and build steps
- Massive reduction in PyPI storage usage
- Cleaner, maintainable build matrix
- Faster installs for the majority of users
- Continued support for niche platforms without bloating distribution
This release marks the transition from a monolithic wheel distribution strategy to a scalable, multi-tier delivery system.
New Features:
- feat: enable abi3-py38 for universal wheels (reduce matrix bloat)
Updates:
- Update build-wheels workflow for better checks
Other Changes:
- Refactor build-wheels-exotic workflow and artifact names
- Refactor build-wheels-extended.yml for clarity
- Enhance publish workflow for wheels and index updates
- Fix wheel filename variable in build-wheels.yml
- Add retry attempts for checkout in build-wheels.yml
- ...and 1 more changes
5 files changed, 296 insertions(+), 190 deletions(-)
uv-ffi v0.10.8.post6 - The Auto-Healing & Transparent Errors Release
This release makes the persistent uv-ffi engine entirely self-contained, auto-healing, and transparent to the Python caller.
- Aggressive Registry Auto-Healing: The persistent PyPI Simple API cache now self-corrects. If the engine fails to find a newly published package (e.g.,
torch==2.11.0dropped 5 minutes ago) due to a stale RAM cache, it instantly detects the failure, drops its registry, and transparently retries the network fetch. Zero false-negatives, zero process restarts required. - Detailed FFI Error Surfacing:
uv_ffi.run()now returns a 4-tuple:(rc, installed, removed, err_msg). Real error strings fromuv's internal resolution (e.g., "No matching distribution found") are captured and passed directly to Python. No more guessing whyrc=1happened. - Manual Cache Control: Exposed
clear_registry_cache()to Python as an escape hatch / debugging tool. - Strict ExitStatus Mapping: Fixed a bug where slow-path resolutions falsely returned
rc=0on failure. The engine now strictly adheres touv::commands::ExitStatus. - Restored CDYLIB Build: Fixed
Cargo.tomlto ensure PyO3 builds the extension module cleanly out-of-the-box.
Bug Fixes:
- fix: use thin LTO for manylinux i686 to avoid 32-bit OOM
- fix: remove s390x from musl matrix (Tier 3 target, not buildable)
- fix: install all cross-compilers on host runner before maturin build
- fix: install s390x cross-compiler inside maturin container via before-script
- fix: remove duplicate env block
- fix: add aarch64 CFLAGS for ring crate assembly, install cross-compilers
- fix: install s390x cross-compiler for glibc build
- fix: pass $TAG shell var to dispatch instead of step output
- fix: use try/catch for powershell PyPI check to handle 404
- fix: handle 404 in powershell PyPI check gracefully
Updates:
- Update build-wheels-extended.yml
Other Changes:
- docs: document PyPI registry auto-healing and clear_registry_cache API
- fix(uv-ffi): implement aggressive auto-heal and strict ExitStatus mapping
- feat(uv-ffi): expose detailed error messages to Python caller
- feat(uv-ffi): implement self-healing registry cache and restore cdylib build config
- Add GitHub Actions workflow for static content deployment
- ...and 10 more changes
10 files changed, 763 insertions(+), 444 deletions(-)