This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+14 more
Summary
AI summaryUpdates Bug fixes, preedit, and Dock/paint across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
Adds end‑to‑end IME composition input on Win32, X11, and macOS. Adds end‑to‑end IME composition input on Win32, X11, and macOS. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Feature | Medium |
Introduces native text editing with selection, word motion, clipboard, and undo across controls. Introduces native text editing with selection, word motion, clipboard, and undo across controls. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Feature | Medium |
Replaces mock raster core in PhotoEdit with a genuine C++ raster engine (brush, clone, dodge/burn, etc.). Replaces mock raster core in PhotoEdit with a genuine C++ raster engine (brush, clone, dodge/burn, etc.). Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Feature | Low |
Implements lazy per‑glyph font fallback for CJK characters (no more tofu). Implements lazy per‑glyph font fallback for CJK characters (no more tofu). Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Feature | Low |
Adds kinsoku line breaking and UTF‑8 support on MSVC for CJK strings. Adds kinsoku line breaking and UTF‑8 support on MSVC for CJK strings. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Feature | Low |
Correctly suppresses preedit underline for Korean hangul input. Correctly suppresses preedit underline for Korean hangul input. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Feature | Low |
Provides virtual list/tree recycling providers supporting 200k‑row scrolling without allocation. Provides virtual list/tree recycling providers supporting 200k‑row scrolling without allocation. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Feature | Low |
Adds a small 3D engine with orbit camera, gizmos, and the DENDER sample built on the editor core. Adds a small 3D engine with orbit camera, gizmos, and the DENDER sample built on the editor core. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Feature | Low |
Embeds Decius CSS framework, UI fonts, and icon font into the library for zero‑asset styling. Embeds Decius CSS framework, UI fonts, and icon font into the library for zero‑asset styling. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Feature | Low |
Adds affinetools devtools with Elements/Sources/Memory panels over a separate‑process protocol. Adds affinetools devtools with Elements/Sources/Memory panels over a separate‑process protocol. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Performance | Low |
Hardens memory and DOM resource lifecycle, improving UI object lifetime stability. Hardens memory and DOM resource lifecycle, improving UI object lifetime stability. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Deprecation | Low |
Retires unfinished demo samples. Retires unfinished demo samples. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Bugfix | Medium |
Fixes Rust crate build failure caused by header generation in source tree. Fixes Rust crate build failure caused by header generation in source tree. Source: llm_adapter@2026-07-16 Confidence: high |
— |
| Bugfix | Medium |
Fixes N‑stop radial gradient rendering collapse. Fixes N‑stop radial gradient rendering collapse. Source: llm_adapter@2026-07-16 Confidence: high |
— |
| Bugfix | Medium |
Fixes 3D demo segfaults on launch. Fixes 3D demo segfaults on launch. Source: llm_adapter@2026-07-16 Confidence: high |
— |
| Bugfix | Medium |
Fixes multi‑layer CSS background rendering regression. Fixes multi‑layer CSS background rendering regression. Source: llm_adapter@2026-07-16 Confidence: low |
— |
| Bugfix | Medium |
Fixes Win32 IME caret positioning bug. Fixes Win32 IME caret positioning bug. Source: llm_adapter@2026-07-16 Confidence: low |
— |
| Bugfix | Medium |
Fixes DENDER crash when changing object dimensions. Fixes DENDER crash when changing object dimensions. Source: llm_adapter@2026-07-16 Confidence: low |
— |
| Bugfix | Medium |
Fixes macOS multi‑second drag lag issue. Fixes macOS multi‑second drag lag issue. Source: llm_adapter@2026-07-16 Confidence: low |
— |
| Bugfix | Medium |
Fixes Cmd‑Q not working on macOS. Fixes Cmd‑Q not working on macOS. Source: llm_adapter@2026-07-16 Confidence: low |
— |
| Bugfix | Medium |
Fixes GL backend composite format and V orientation errors. Fixes GL backend composite format and V orientation errors. Source: llm_adapter@2026-07-16 Confidence: low |
— |
| Bugfix | Medium |
Fixes out-of-bounds read in IME caret path. Fixes out-of-bounds read in IME caret path. Source: llm_adapter@2026-07-16 Confidence: low |
— |
| Bugfix | Medium |
Corrects multi‑layer CSS background rendering so every layer carries full N‑stop gradients. Corrects multi‑layer CSS background rendering so every layer carries full N‑stop gradients. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Bugfix | Medium |
Corrects Win32 IME caret placement to the right of the typed glyph. Corrects Win32 IME caret placement to the right of the typed glyph. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Bugfix | Medium |
Eliminates macOS multi‑second drag lag caused by input ordering. Eliminates macOS multi‑second drag lag caused by input ordering. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Bugfix | Medium |
Corrects OpenGL backend composite format and vertical orientation errors. Corrects OpenGL backend composite format and vertical orientation errors. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Bugfix | Low |
Prevents DENDER crash when changing object dimensions by regenerating mesh state each frame. Prevents DENDER crash when changing object dimensions by regenerating mesh state each frame. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Bugfix | Low |
Enables Cmd‑Q to quit the application on macOS. Enables Cmd‑Q to quit the application on macOS. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Bugfix | Low |
Fixes background image inheritance causing descendant repaints of parent gradients. Fixes background image inheritance causing descendant repaints of parent gradients. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Refactor | Low |
Changes build scripts (`./build.ps1`/`./build.sh`) to run every sample, including Python ones, with auto‑generated example list. Changes build scripts (`./build.ps1`/`./build.sh`) to run every sample, including Python ones, with auto‑generated example list. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Refactor | Low |
Updates CI to gate language bindings (affineui_c), all examples, and gcc amalgamation builds. Updates CI to gate language bindings (affineui_c), all examples, and gcc amalgamation builds. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
| Refactor | Low |
Adds `examples/19_ime_lab` harness for verifying IME against platform implementations. Adds `examples/19_ime_lab` harness for verifying IME against platform implementations. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
Full changelog
The first public release of AffineUI. Alpha — features, APIs, and the set of
supported platforms are all still in flux — but verified on Linux (Ubuntu,
x86-64), macOS (Apple Silicon), and Windows (x86-64): the full suite (600+
tests) passes on each, and every demo in the repo runs on all three.
Highlights
IME and international text. Composition (preedit) input now works end to end
on all three desktop platforms: Win32 via IMM32, Linux/X11 via XIM with
on-the-spot inline preedit, and macOS via NSTextInputClient. (#39, #50, #53,
#57, #74) CJK renders properly too — lazy per-glyph font fallback (no more tofu),
kinsoku line breaking, and /utf-8 on MSVC, which was silently corrupting CJK
string literals through the ANSI codepage. (#51) The preedit underline is
Japanese/Chinese convention and is correctly suppressed for Korean, where hangul
assembles jamo-in-place with no clause structure. (#75)
Native text editing and input interception. Selection, word-wise motion,
clipboard, and undo across text controls, with the input pipeline reworked to
route native events correctly. (#57)
Virtual lists and trees. Recycling providers, handle-keyed tree state that
survives expand/collapse renumbering, and full bindings — 200k-row lists scroll
without allocating. (#48)
3D viewport and DENDER. A small 3D engine, a reusable DCC viewport with an
orbit camera and gizmos, and the DENDER sample built on the editor core. (#45)
PhotoEdit on a real raster core. The photo editor now runs on a genuine C++
raster engine (brush, clone, dodge/burn, selection, gradients, blend modes,
filters) rather than a mock. (#38)
Compile-time Decius bundle. The Decius CSS framework, UI fonts, and icon font
are embedded in the library, so Theme::Decius renders fully styled with zero
on-disk assets and zero configuration. (#26, #27)
affinetools devtools. Elements / Sources / Memory panels over a
separate-process protocol, with a working hotkey and launcher.
Bug fixes
- Out-of-bounds read in the IME caret path.
snap_utf8_boundaryclamped an
offset withstd::min(pos, size())and then indexed it — butsize()is a
valid offset, not a valid index. It fired on essentially every IME keystroke
(a composition cursor of-1means "caret at end of preedit", which resolves
to exactlytext.size()). Silent UB in release builds; a 1-byte overread that
could mis-position the caret. (#81) - The published Rust crate could not build.
build.rsinvoked cmake, which
generated a header into the source tree — something cargo forbids ("Source
directory was modified by build.rs").--no-verifyhid it from CI, but every
consumer's build would have hit it. The generated header now goes to the build
directory. (#81) - The two-file SDK didn't compile under gcc. 500+ errors, invisible because
CI only ever compiled the amalgamation on clang. Three distinct defects: C99
designated initializers in Lexbor (legal in C, not in C++), anextern "C"
wrapper that dragged sokol's C++ reference overloads into C linkage, and X11's
Nonemacro poisoning the single translation unit. (#52) - Multi-layer CSS backgrounds. Only the bottom background layer could carry
more than two gradient stops, so a stacked value like.dcs-hw--lacquer
(a 6-stop specular over a base ramp) painted a blown-out 2-stop white wash —
or, for a three-layer value, dropped both upper layers and rendered flat. Every
layer now carries a full N-stop list, painted back-to-front. (#52) - N-stop radial gradients rendered as nothing. The bottom-layer paint path
forwardedstop1_pos_pct— a two-stop-only concept that scales the radius —
into an N-stop ramp, where stop 1 is merely the second stop. The radius
collapsed to 4% of its size. (#73) - Win32 IME caret landed to the left of the glyph being typed.
GCS_CURSORPOSreturns the caret in the low 16 bits, and a0cursor on a
non-empty preedit means "no caret placed inside the composition", not "caret at
zero". (#73) - DENDER crashed when changing an object's dimensions. The 3D renderer cached
a rawPainter*across frames, but the painter is a per-frame stack object.
Regenerating the mesh changed the render target, which forced the stale pointer
to be dereferenced — into a dead stack frame. (#83) - Background images were inherited by descendants, making every child restart
its parent's gradient inside its own box. (#52) - macOS: multi-second drag lag, from queued native input being ordered behind
a coalesced frame marker. (#56) 3D demos segfaulted on launch. (#54)
Cmd-Q didn't work. (#72) - GL backend: wrong composite format and V orientation. (#32)
- Memory and DOM resource lifecycle hazards; UI object lifetimes and image
ownership hardened. (#44, #86) - Dock/paint: column widths, window-edge span and precedence, textarea clip,
atomic float painting. (#35, #37)
Changes
./build.ps1 run <name>/./build.sh run <name>now work for every
sample, including the Python ones (PhotoEdit, the component gallery). The
example list is generated from CMake at configure time rather than hand-
maintained, so it can't drift. (#52, #58)- CI now gates the surfaces that had no coverage at all: the language
bindings (includingaffineui_c, the C ABI both Rust and C# link against,
which no job had ever built), every example, and the amalgamation under gcc.
(#52) examples/19_ime_lab— a harness for verifying IME against a real platform
IME, showing the engine's live composition state (preedit, clause range, caret
rect) next to the text fields. (#52)- Unfinished demos retired. (#58)
- Docs:
USERS_GUIDE.mdandREFERENCE.md, organized by renderer/framework
layer. (#34) Translated READMEs. Every package README now states the alpha
status and the verified platforms plainly. (#94) - Tag-driven release pipeline for crates.io, NuGet, PyPI, and GitHub Releases.
- The project moved to the
affineuiorg (github.com/affineui/affineui),
along with decius-css and the lexbor / nanovg / yoga forks. (#91) - Discussion, questions, and show-and-tell: r/affineui. (#93)
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
About AffineUI
All releases →Beta — feedback welcome: [email protected]