Skip to content

AffineUI

v0.4.1 Breaking

This release includes 1 breaking change for platform teams planning a safe upgrade.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

bootstrap cplusplus c# css dearimgui electron
+14 more
gamedev gpu gpu-accelerated-library gradio html5 python qt single-header-lib single-header-library ui ui-components ui-frameworks ui-frontend wpf

Affected surfaces

breaking_upgrade

Summary

AI summary

Fixes include making the Rust crate statically link its C ABI, correcting the Python version mismatch, removing extraneous photo_core dependency, and anchoring Painter's vtable.

Changes in this release

Bugfix High

Rust crate now links C ABI statically, fixing non‑runnable binaries on Linux.

Rust crate now links C ABI statically, fixing non‑runnable binaries on Linux.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix High

Removed extraneous `photo_core` from the wheel to avoid duplicate Objective‑C class definitions and crashes on macOS.

Removed extraneous `photo_core` from the wheel to avoid duplicate Objective‑C class definitions and crashes on macOS.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

`affineui.__version__` now matches the package version reported by pip and `affineui.version()`.

`affineui.__version__` now matches the package version reported by pip and `affineui.version()`.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

Anchored `Painter` vtable by adding a concrete definition, preventing undefined symbol errors on Linux/GCC.

Anchored `Painter` vtable by adding a concrete definition, preventing undefined symbol errors on Linux/GCC.

Source: llm_adapter@2026-07-16

Confidence: high

Refactor Low

Release tooling now builds a wheel and asserts that `__version__`, `affineui.version()`, and pip metadata are consistent.

Release tooling now builds a wheel and asserts that `__version__`, `affineui.version()`, and pip metadata are consistent.

Source: llm_adapter@2026-07-16

Confidence: high

Full changelog

A bug-fix release. Every fix here came out of testing the published 0.4.0
packages as a user would install them — from PyPI and crates.io, on a clean
machine — which is how each of these got caught.

Still alpha: features, APIs, and the set of supported platforms are all in
flux. Verified on Linux (Ubuntu, x86-64), macOS (Apple Silicon), and Windows
(x86-64).

Fixes

The Rust crate produced binaries that would not run. Anything built
against affineui 0.4.0 died at startup on Linux:

error while loading shared libraries: libaffineui_c.so:
cannot open shared object file: No such file or directory

affineui-sys built the C ABI as a shared library, linked it dylib, and
copied libaffineui_c.so next to the binary — but baked in no RPATH. ELF
does not search the executable's own directory, so the copy was never
findable. Windows (same-directory DLL search) and macOS both masked it;
only Linux surfaced it. The crate now links the C ABI statically: one
self-contained binary, nothing to locate at runtime, nothing to ship
alongside. (#99)

affineui.__version__ was frozen at 0.0.1 in every published wheel. It
was compiled from the project(affineui_python VERSION 0.0.1) literal in
bindings/python/CMakeLists.txt — a second source of truth that the release
version-stamper never touched. The wheel therefore disagreed with itself:
pip metadata and affineui.version() both reported 0.4.0 while
__version__ reported 0.0.1. It now comes from the packaged version
scikit-build-core supplies, which is the same value pip sees. (#102)

The wheel shipped photo_core, which does not belong in it. photo_core
is the Photo Edit sample's CPU raster core. Installing it into the
affineui wheel was not merely dead weight: it statically linked its own
copy of sokol_app, so any process importing both got two definitions of
the same Objective-C classes
(_sapp_macos_view, _sapp_macos_window, …)
— which macOS reports as "spurious casting failures and mysterious crashes."
It is no longer installed, and the raster core has been reworked to take
callbacks instead of an affineui::App&, so it no longer pulls in the
windowing runtime or a second sokol at all. (#100)

Painter had no key function, so its vtable was never anchored. Every
virtual was pure or defined inline — including the defaulted destructor — so
merely including painter.h forced the translation unit to link against the
full runtime. Linux/GCC surfaced it as an undefined ImageHandle::is_valid
at import time; macOS did not. Painter now anchors its vtable in a single
translation unit. (#103)

Release tooling

The version-stamping CI job now builds a wheel from the stamped tree and
asserts that __version__, affineui.version(), and the pip metadata all
agree
. The previous check only inspected the files the stamper writes, so a
version baked in from anywhere else was invisible to it — which is exactly
how the __version__ bug shipped. (#102)

Notes

0.4.0 remains published on PyPI, crates.io, and NuGet — registry versions are
immutable and cannot be replaced. Rust users should move to 0.4.1; on 0.4.0
the crate cannot produce a runnable binary on Linux.

Breaking Changes

  • The `affineui` Rust crate now links its C ABI statically, removing the need to ship `libaffineui_c.so` alongside binaries.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track AffineUI

Get notified when new releases ship.

Sign up free

About AffineUI

All releases →

Related context

Beta — feedback welcome: [email protected]