Project case study

Experimental · Active developmentRust · Vulkan · Vello · winit · AccessKit

VUI

An embeddable Rust UI toolkit that separates application and widget behavior from rendering—supporting native desktop windows, direct Vulkan presentation, Vello-based embedding, and compositor-owned UI.

VUI component gallery showing buttons, selection states, and a slider in the dark theme
A checked-in Vulkan snapshot used to detect visual regressions across components, themes, interaction states, and scale factors.
ProblemUI without host lock-in

Desktop applications and compositors need the same behavior without sharing a windowing or rendering architecture.

What I builtA modular UI stack

Creator and lead developer across the retained runtime, widgets, text, accessibility, renderers, platform services, and tests.

Architecture12 focused crates

Renderer-neutral foundations with optional desktop, Vulkan, Vello, Linux, resource, session, and testing layers.

ProofTwo production-shaped hosts

A native multi-window application path and direct embedding in FocalDesk's wgpu and raw Vulkan compositor backends.

The challenge

Keep UI behavior stable while the host and renderer change.

A conventional desktop toolkit tends to own the event loop, native windows, renderer, and platform integration. That is convenient for a standalone application, but it makes reuse inside a compositor or an existing GPU pipeline difficult.

VUI keeps widget state, layout, events, semantics, commands, tasks, and paint operations in a renderer-neutral core. Hosts can select the layers they need: a native winit application, Vello scene translation, direct Ash/Vulkan rendering, or their own platform and render target.

System design

One behavioral core, multiple ownership models.

The dependency boundaries let applications choose a complete desktop stack or embed only the retained runtime and paint protocol. Renderer and platform integrations depend inward; the core does not depend on them.

01 · Runtime

Retained state with typed messages

Stable widget identity supports reconciliation, focus, overlays, pointer capture, animation, and cancellable background tasks.

02 · Rendering

Paint operations cross the boundary

The core emits renderer-neutral text, shape, image, clipping, and damage data for direct Vulkan or Vello translation.

03 · Platform

Services are typed requests

Dialogs, clipboard, notifications, appearance, files, and session behavior stay replaceable and testable.

04 · Verification

Deterministic harnesses at every layer

Headless interaction tests and offscreen Vulkan snapshots fix time, fonts, scale, theme, and rendering configuration.

Engineering decisions

Desktop capability without coupling widgets to the desktop.

01 · Embedding

The host keeps GPU ownership

Constraint
A compositor already owns its device, queues, render targets, and frame schedule.
Decision
Accept host-owned wgpu or Vulkan resources and render into a persistent transparent texture.
Tradeoff
The integration boundary is more explicit, but embedding avoids CPU readback and a second GPU stack.
02 · Accessibility

Semantics belong beside behavior

Constraint
A custom renderer cannot rely on native controls to supply an accessibility tree.
Decision
Widgets emit renderer-independent semantics and route AccessKit actions back through the runtime.
Tradeoff
Every component must maintain its semantic contract, but all renderers expose the same accessible behavior.
03 · Text

Editing is a system, not a field

Constraint
Desktop text requires shaping, bidi, IME, selection, clipboard, undo, hit testing, and scrolling.
Decision
Share Unicode-safe editing behavior and Parley/Fontique shaping across fields, text areas, hosts, and tests.
Tradeoff
The implementation surface is large, but behavior stays consistent rather than being rebuilt by each application.
04 · Testing

Control every visual input

Constraint
Host fonts, timing, scale, and GPU configuration can make image comparisons noisy.
Decision
Check in fonts and baselines, fix the animation clock and sample count, and produce amplified diff artifacts.
Tradeoff
Linux is the canonical visual baseline, while other platforms still compile and test platform-neutral behavior.

Where it stands

A broad experimental toolkit with a deliberately small core.

VUI already exercises the difficult desktop paths—text editing, accessibility, virtualized data, multi-window lifecycle, platform services, and GPU presentation—while keeping renderer and host choices open.

Implemented

  • Retained widgets, layout, themes, commands, and overlays
  • Unicode text shaping, IME-aware editing, and bidirectional text
  • Virtualized lists, trees, and data tables
  • Live AccessKit semantics and action routing
  • Multi-window winit/Ash desktop applications
  • Vello and direct Vulkan rendering paths
  • Headless and GPU snapshot testing

Current boundaries

  • Experimental API under active development
  • Linux is the canonical visual-regression platform
  • Some native capabilities remain host-specific
  • Compositor embedding requires explicit GPU integration
  • Applications opt into only the platform layers they need