Skip to content

AffineUI

v0.4.0 Feature

This release adds 3 notable features for engineering teams evaluating rollout.

✓ 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

Summary

AI summary

Updates Bug fixes, preedit, and Dock/paint across a mixed release.

Changes in this release

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_boundary clamped an
    offset with std::min(pos, size()) and then indexed it — but size() is a
    valid offset, not a valid index. It fired on essentially every IME keystroke
    (a composition cursor of -1 means "caret at end of preedit", which resolves
    to exactly text.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.rs invoked cmake, which
    generated a header into the source tree — something cargo forbids ("Source
    directory was modified by build.rs"). --no-verify hid 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++), an extern "C"
    wrapper that dragged sokol's C++ reference overloads into C linkage, and X11's
    None macro 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
    forwarded stop1_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_CURSORPOS returns the caret in the low 16 bits, and a 0 cursor 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 raw Painter* 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 (including affineui_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.md and REFERENCE.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 affineui org (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

Track AffineUI

Get notified when new releases ship.

Sign up free

About AffineUI

All releases →

Related context

Beta — feedback welcome: [email protected]