Vitaliy Alexeyev

03 / 06 · Rust · wgpu 28 · WGSL

syngui

A retained-mode GUI framework for Rust — GPU-rendered through wgpu, styled with CSS-like stylesheets, wired with reactive signals.

Licence
MIT OR Apache-2.0
Platform
Linux · Windows · macOS · Android · Web
Packages
Cargo
Status
Young, API not stable
The widget_gallery_mss example running natively — MarkdownView with syntax highlighting
The widget_gallery_mss example running natively — MarkdownView with syntax highlighting
widgets in 10 categories
110+
tests
1 400+
per frame for a long chat feed (was 3.4 s)
5.8ms
platforms: Linux, Windows, macOS, Android, Web
5
01

What it is

Most Rust GUI libraries make you choose: immediate-mode simplicity (egui) or a retained tree with typed styling (iced), a custom DSL (Slint) or web tech (Tauri, Dioxus). syngui takes a different combination — real stylesheets with a cascade, SolidJS-style fine-grained reactivity, a retained widget tree, and a large set of widgets you would normally have to vendor yourself.

It is used in production by its author: synthos, syndesktop, linux-legion and ardor-mouse all run on it, so its bugs get found by real use.

02

Key features

  • MSS stylesheets: variables and var(), type / class / compound / descendant selectors, :hover, :active, :focus, :checked, :disabled, nesting, transitions, @keyframes, inheritance, plus window-state pseudo-classes.
  • Fine-grained reactivity: use_signal, use_effect, create_memo and use_context with automatic dependency tracking; subtrees rebuild granularly.
  • Retained-mode architecture: immutable Widget → stateful Element, diffed via can_update(), with dirty-flag propagation.
  • 110+ widgets: line / bar / pie / radar / gauge charts, a tile map, an embedded terminal (PTY + VT100), Markdown with syntax highlighting, a rope-backed code editor, an audio-clocked video player with hardware decode, a devtools inspector.
  • DocumentEditor: a Notion-style block editor where Markdown is both the model and the file format, with flow or free-canvas layout, vector shapes and live embeds of your own widgets.
  • 3D transforms from stylesheets, particle emitters with 15 presets and a macOS-dock-style fisheye row.
  • Measured hot paths: VirtualList, keyed children, a cached cascade and rendering batched into a handful of draw calls in one pass.
  • wgpu 28 (Vulkan / Metal / DX12 / GL / WebGPU) with hand-written WGSL shaders.
  • Linux on X11 and Wayland (with its own drag-and-drop), Windows, macOS, Android and Android TV, WebAssembly.
03

Install

cargo build -p syngui
cargo test -p syngui
cargo run -p widget_gallery_mss   # every widget + MSS styling

Video playback sits behind the optional ffmpeg feature and needs FFmpeg 7+ development libraries; without it nothing links against FFmpeg. The widget gallery also builds to WebAssembly.

Full instructions in the README →

04

Requirements and limitations

  • Text shaping is simple: Latin, Cyrillic and CJK render correctly, but there is no kerning, no ligatures, no GSUB/GPOS, no bidirectional text and no complex scripts (Arabic, Devanagari).
  • Colour emoji are drawn without a shaper: ZWJ sequences and VS16 can render as separate glyphs.
  • Accessibility (AccessKit) exists behind a non-default feature and is not continuously tested.
  • No CI yet: Windows, macOS and Android builds are verified by hand.
  • The API is not stable; expect breaking changes.
05

Screenshots

Vibe-coded with Claude Code

How it is built

The model writes the code, the tests and most of the documentation. The performance numbers were measured on my machine, and every app I have built since — synthos, syndesktop, linux-legion, ardor-mouse — runs on this framework, so its bugs get found by real use.

Everything here is vibe-coded. github.com/VitaminDB/syngui