Desktop applications and compositors need the same behavior without sharing a windowing or rendering architecture.
Project case study
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.

Creator and lead developer across the retained runtime, widgets, text, accessibility, renderers, platform services, and tests.
Renderer-neutral foundations with optional desktop, Vulkan, Vello, Linux, resource, session, and testing layers.
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.
Retained state with typed messages
Stable widget identity supports reconciliation, focus, overlays, pointer capture, animation, and cancellable background tasks.
Paint operations cross the boundary
The core emits renderer-neutral text, shape, image, clipping, and damage data for direct Vulkan or Vello translation.
Services are typed requests
Dialogs, clipboard, notifications, appearance, files, and session behavior stay replaceable and testable.
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.
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.
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.
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.
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
Go deeper
Read the architecture and performance notes.
The repository documents crate boundaries, runtime passes, rendering paths, deterministic tests, and performance budgets.