Vitaliy Alexeyev

03 / 07 · 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, synshell, 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.
  • The syngui CLI, in the spirit of flutter build and cargo tauri: builds and runs apps for Linux x86_64 and aarch64, Android (APK) and iOS (IPA built on Linux, no Xcode), makes Arch and AUR packages (-git and -bin), and syngui doctor checks the toolchain.
03

Install

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

cargo install --path syngui-cli --profile fast-release
syngui doctor                      # NDK/SDK, JDK, iOS SDK, aarch64 sysroot
syngui run -d android              # APK for the device, install, launch, logcat
syngui package -f aur              # <name>-git and <name>-bin PKGBUILDs

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

Measured, not promised

How it is tested

The performance numbers were measured on my machine, and every app I have built since — synthos, synshell, linux-legion, ardor-mouse — runs on this framework, so its bugs get found by real use.

Every number here is measured on my own hardware. github.com/VitaminDB/syngui