Skip to content

Releases: 1minds3t/uv-ffi

uv-ffi v0.10.8.post15 - Self-Healing Bubble Installs, Plan IPC, and 12ms Persistence

Choose a tag to compare

@1minds3t 1minds3t released this 05 Jun 21:03

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-info Eviction: 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-info metadata and wipes them before the Installer runs. This guarantees stale .py files don't persist across interrupted version changes.

  • Corrupted Cache Retry: Intercepts uv's fatal archive-v0 cache 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 static INSTALL_PLAN and fires a PLAN_READY_CALLBACK before execution.

  • Python can now intercept the installation plan via set_plan_callback() and optionally return True to 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 --target installation latency from 30ms to ~12ms.

  • Surgical Cache Control: Added evict_packages_from_bubble_cache and patch_bubble_site_packages_cache pyfunctions for Python-side memory map updates without requiring a 2.5ms disk rescan.

  • Native Module Rename: Renamed the native extension from uv_ffi.uv_ffi to uv_ffi._native. This prevents the .so binary 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 _noop safety stubs for legacy binaries to prevent AttributeError crashes 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.gz source 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.rs duplication).


📝 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

Choose a tag to compare

@1minds3t 1minds3t released this 10 May 08:21

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-links remains 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

Choose a tag to compare

@1minds3t 1minds3t released this 09 May 20:49

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-py38 from a hard requirement to a default-enabled Cargo feature.
    • Python >= 3.8 continues to use the highly compatible abi3 single-wheel target.
    • Python 3.7 drops the abi3 feature during source builds (--no-default-features), gracefully falling back to a version-specific (cp37-cp37m) extension.
    • Lowered requires-python in pyproject.toml to >=3.7 and added the appropriate PyPI classifiers.
  • Proactive Source Build Fallback Guides: Updated the build.rs script to output a highly visible ASCII-art warning when a source build fails, immediately directing users to the pre-built exotic-wheels index.

  • 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 of crates/uv-ffi/Cargo.toml and into the root workspace Cargo.toml so Maturin correctly applies it.

  • Aggressive Size/Memory Tuning: Changed optimization levels from s to z (most aggressive size/memory optimization) and fine-tuned codegen-units to 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 for pip to parse via --extra-index-url or -f.

  • Extended cp37 CI Matrices: Added dedicated manylinux_2_17 jobs to automatically build CPython 3.7 wheels across x86_64, aarch64, i686, armv7, and ppc64le.

  • Toolchain Pinning: Pinned the Rust toolchain to 1.77.0 in 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

Choose a tag to compare

@1minds3t 1minds3t released this 26 Apr 19:52

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 = false and codegen-units = 16 to prevent the compiler from exhausting the 3GB 32-bit address space during the final linking phase.

  • Binary Shrinkage: Added opt-level = "s", panic = "abort", and strip = true. This drops peak RSS RAM usage during compilation by gigabytes and shrinks the final .so binary 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.yml script 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_64 and arm64 wheels from the index in favor of the universal2 binaries to reduce index bloat.

  • Conda-Forge Recipe Added: Shipped the initial meta.yaml to prepare uv-ffi for official distribution on the conda-forge channel.

  • Smarter Build Fallbacks: Updated the build.rs compile-time warnings and README.md to 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

Choose a tag to compare

@1minds3t 1minds3t released this 24 Apr 19:16

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

Choose a tag to compare

@1minds3t 1minds3t released this 24 Apr 02:22

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 resulting os error 2 (No such file or directory) when trying to read missing dist-info/METADATA files. 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_cache saves ~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 in post6.

  • Cleaned Examples: Simplified the pip install examples in the documentation, removing redundant default flags (like --link-mode).

  • Wheel Backfill Polish: Improved the .github/workflows/backfill_wheels.yml script 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

Choose a tag to compare

@1minds3t 1minds3t released this 23 Apr 17:16

⚙️ 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

Choose a tag to compare

@1minds3t 1minds3t released this 23 Apr 08:58

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 runs pip install uv-ffi on an exotic platform and pip attempts to build from source, a custom build.rs script 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-url to grab the pre-built wheel.

  • Graceful Import Failures (__init__.py): Added a pure-Python wrapper around the native extension. If the .so/.pyd file fails to load due to ABI/architecture mismatches, the resulting ImportError is intercepted. The user is presented with a highly descriptive error detailing their OS/Architecture and the exact pip command to resolve the issue using the extended GitHub index.

  • Historical Wheel Recovery: Deployed a powerful new backfill_wheels.yml workflow. 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-ffi wheel in existence.

  • README Overhaul: Completely rewrote the root and crate-level README.md files to clearly separate "Standard Platforms" (PyPI) from "Exotic Platforms" (GitHub Pages), complete with a detailed compatibility matrix.

  • Surgical Publishing: Added a source_only manual dispatch option to publish.yml allowing 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

Choose a tag to compare

@1minds3t 1minds3t released this 23 Apr 01:18

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)
  • 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-url usage
  • external wheel hosting without PyPI storage pressure

  • Single Orchestrator Workflow

    • publish.yml now 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)
  • 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

Choose a tag to compare

@1minds3t 1minds3t released this 22 Apr 14:26

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.0 dropped 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 from uv's internal resolution (e.g., "No matching distribution found") are captured and passed directly to Python. No more guessing why rc=1 happened.
  • 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=0 on failure. The engine now strictly adheres to uv::commands::ExitStatus.
  • Restored CDYLIB Build: Fixed Cargo.toml to 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(-)