Seven frameworks deep-dived against primary sources, eight comparable specifications built in each of them (56 apps), and the dependency trees compared by experiment round — to answer two questions: where exactly is the fragmentation, and how do you actually ship a cross-platform desktop app in Rust today?
The ecosystem is consolidating from the bottom of the stack upward — faster than its reputation suggests. In the last 12 months: the principal reusable pure-Rust text stacks converged on HarfRust, Zed dropped its custom Linux GPU layer for wgpu, and Slint/Bevy/floem migrated to parley/fontique. AccessKit is now the de-facto native accessibility abstraction; iced and floem remain unintegrated, while gpui support is unreleased and currently disabled in Zed. What remains fragmented is the top: text layout, 2D renderers, widgets, and windowing forks.
raw-window-handle is the sole cross-platform GUI-interoperability abstraction; the set also includes platform-specific GUI crates.| Capability | iced | egui | gpui | tauri | xilem | slint | dioxus |
|---|---|---|---|---|---|---|---|
| Windowing | winit | winit | in-houseper-platform | taowinit fork | winit | winit+qt, linuxkms | taowinit migration proposed |
| GPU / render backend | wgpu | wgpu | Metal/D3Dtested 0.2.2: blade on linux; zed main: wgpu ‘26, unreleased | webview | wgpu | backend-dependentOpenGL/wgpu/Skia/software | webview |
| 2D renderer | iced_wgpu | epaint | in-house | webview | vello | femtovg/skia/qt+ own software | webviewblitz 0.7.9: classic Vello |
| Text shaping | harfrustvia cosmic-text | harfrustin epaint 0.35+ | platformCoreText/DWrite; linux (0.2.2): cosmic-text/rustybuzz | webview | harfrustvia parley | harfrustvia parley | webview |
| Text layout | cosmic-text | galleyshapes RTL runs; no paragraph BiDi | in-house | webview | parley | parley | webviewblitz: parley |
| Font fallback | fontdbdormant since ‘24 | bundled | platformlinux (0.2.2): fontdb | webview | fontique | fontique | webview |
| Widget layout | in-house | in-house | taffy | CSS | in-house | DSL+ taffy (exp.) | CSSblitz: taffy+stylo |
| Widgets | in-house | in-house | low-level elementsno reusable 1st-party suite; gpui-component is 3rd-party | HTML/JS | in-house~15 views | in-house | HTML/JS |
| Accessibility | missingdraft PR #3111 | AccessKitschema required; eframe adapter default | unreleasedmerged 2026-05 | webview | AccessKit | AccessKitdefault on Winit desktop | webview |
| IME | winitsince 0.14 | winit | platformwindows rough | webview | winit | winit | webview |
| Styling / theming | in-house | in-house | tailwind-like | CSS | in-house | DSL | CSS |
A GUI framework is a tower of layers: window (winit opens the window and feeds you input) → GPU (wgpu turns one API into Metal/Vulkan/DX12) → 2D renderer (turns “rounded rect with shadow” into GPU work or pixels) → text (find fonts → shape glyphs → lay out lines) → layout (taffy computes flexbox math) → a11y (AccessKit feeds screen readers) → widgets. Several lower-layer abstractions are increasingly shared; these four stories are where sharing still breaks down.
Text is a pipeline: discover fonts → shape glyphs → lay out lines. The bottom stage just consolidated — HarfRust (the HarfBuzz org’s official Rust port) now shapes for cosmic-text, parley and egui. But the layout stage — line breaking, wrapping, bidirectional text, rich text, caret/editing semantics; the genuinely expensive part — still exists four times:
| Stack | Owner | Used by | Known holes |
|---|---|---|---|
| cosmic-text | System76 (for COSMIC) | iced, COSMIC, gpui-on-Linux | fallback via dormant fontdb |
| parley | Linebender | xilem, Slint, Blitz, Bevy, floem | egui adoption stalled on API mismatch |
| epaint “galley” | egui, in-house | egui only | no paragraph-level BiDi reordering; no color emoji |
| line_layout | Zed, in-house | gpui only | quality differs per OS (platform shapers) |
Why it persists: both leading stacks have sustained institutional contributors—System76 employees on cosmic-text, and a mix of grants and employer-backed contributors around Linebender—so both remain active. egui tried adopting parley (egui#5784) and hit a real architecture mismatch: parley wants to own “a rectangle to fill with text”; immediate-mode egui re-derives layout every frame. Iced adopted cosmic-text in 2023; the retained primary sources establish the adoption, not why it was chosen over Parley.
Why you care: four stacks means four independent sets of text bugs. egui shapes individual Arabic/Hebrew runs but cannot reorder multiword or mixed-direction paragraphs correctly (egui#1016); Slint's run reordering and tested selection work, while explicit base direction, UI mirroring, and codepoint-oriented backspace remain gaps. Momentum favors parley (3 frameworks migrated in 12 months) but cosmic-text won’t vanish while COSMIC ships on it.
Reusable native stacks increasingly share wgpu, but renderer implementations still target a mix of wgpu, platform GPU APIs, OpenGL/Skia, and CPU software. In this sample the framework-side layer includes vello (Linebender, GPU compute), epaint (egui, CPU tessellation), iced_wgpu, femtovg (Slint default), Skia bindings (Slint premium/freya), and gpui’s shader pipeline (“render like a videogame”, one shader per primitive).
Why it persists: genuinely different philosophies (compute-shader vector rendering vs tessellation vs SDF shaders), plus Slint’s need to run on GPU-less microcontrollers. Vello is one prospective shared renderer, alongside reusable Skia, FemtoVG, and tiny-skia paths; classic Vello is alpha and only Hybrid has been described as roughly beta.
Why you care: the six-plus renderer families duplicate some anti-aliasing, clipping, glyph-atlas, and GPU-driver work, but this audit did not quantify a multiplier. This layer consolidates last, if ever — the realistic near-term win is sharing the bricks (egui already adopted vello_cpu for glyph rasterization) rather than whole renderers.
In 2021 Tauri forked winit into tao because it needed native menus/tray and — decisively — GTK-hosted windows on Linux, since WebKitGTK (Wry/Tauri’s supported Linux system-webview backend) can only render inside GTK containers. Menus and tray have since been extracted into winit-compatible crates (muda, tray-icon), removing part of the fork’s original rationale — but the GTK constraint remains (tao#509: “running webkitgtk outside of gtk is not fun or not even possible”).
The drift: tao is frozen on winit’s pre-0.30 closure API while winit’s 0.31 redesign moved away from it (historically tracked in the now-closed winit#3367). Divergence can require parallel maintenance, but this audit did not establish that every platform fix is duplicated. Dioxus 0.7.9 still ships Tao/Wry; a winit migration is proposed in open dioxus#2706. Tauri v3 planning targets GTK4, not an un-fork. The structural fix — a windowing-agnostic wry (wry#1014) or winit GTK embedding — remains unshipped; this audit found no dedicated public funding source for it.
Specific Linux paths in the common tauri-apps shell crates hit a GTK/X11 boundary:
muda’s Linux menubar API requires a gtk::Window, so it cannot attach that menubar to a plain
winit window; tray-icon’s winit path requires a second GTK event loop on a parallel thread; and
global-hotkey’s Linux backend is X11-only. Wayland portal support already exists in Rust through
ashpd, while
ksni implements StatusNotifierItem. winit itself has no menu/tray API
(winit#403, open since 2018).
Why you care: this specific integration gap contributes to native-GPU Rust apps feeling “not quite a desktop app” on Linux. It’s not impossible — the remaining opportunity is to integrate existing portal/SNI/DBusMenu implementations into maintained, winit-compatible shell facades. That shared integration would benefit every winit-based framework.
What it is: screen readers don’t see pixels — they need a semantic tree (“a button named Add, focused”), and every OS has a different ancient API for it. AccessKit defines one Rust tree format with adapters for Windows UI Automation, macOS NSAccessibility, Linux AT-SPI, Android and iOS. No comparable cross-toolkit Rust abstraction was found in this audit; egui, Slint, xilem, Bevy, vizia, Blitz, GPUI (since May ’26), and GTK 4.18 all integrate it, although Zed currently opts out of GPUI’s path.
Recent-author concentration: public commit attribution in the dated snapshot is dominated by Matt Campbell and Arnold Loubriat. That is a continuity heuristic, not a measured probability of project collapse. STF: the Sovereign Tech Fund, a German federal program for critical open-source infrastructure, funded AccessKit’s Linux work through a GNOME Foundation contract in 2023–24 (GNOME STF report). That 2023–24 project was described as mostly wrapped up by Apr 2025. This audit found no later direct institutional AccessKit grant; visible personal support includes GitHub Sponsors.
Why you care: the ecosystem standardized on a project with concentrated recent authorship and no later direct institutional grant identified in this audit — and the remaining gaps (a web/canvas adapter, deeper text-editing semantics, and the prototype-stage Wayland a11y stack “Newton”) are long-running infrastructure work for which sustained support could materially help.
The shared infrastructure under the sampled frameworks, ranked by an explicitly interpretive
sustainability assessment. The table contains 21 entries; 15 are rated amber/red. “Author concentration” is
a heuristic derived from dated public commit attribution, not a measured probability of collapse, and “none found” means no public direct
funding source was identified—not proof that a contributor is unpaid. Exact reverse-dependency, sponsor, and search-result counts are dated
snapshot observations whose raw query responses were not retained. Full sourced table:
report/data/load-bearing-crates.md.
| Crate | What it is | Author-concentration indicator | Public support evidence | Last release | Observed signal / interpretation | Assessment |
|---|---|---|---|---|---|---|
| fontdb | finds fonts installed on the system | no sampled activity | no public direct source or announced successor found | Oct 2024 | 21-month release gap; used under Iced/COSMIC/Zed-Linux font resolution | red |
| apple-codesign | Rust-native signing & notarization from non-Mac CI | high | GitHub Sponsors (8 public at snapshot) | Nov 2024 | no release in 19 months and 69 open issues; principal open-source Rust-native path found | red |
| winit | opens windows, delivers keyboard/mouse/IME events everywhere | high | no direct institutional source found; personal sponsors visible | Mar 2026 | 0.31 redesign in beta for roughly 7 months and 21 days; a prolific contributor announced a hiatus citing burnout; 1,225 reverse deps recorded at snapshot | amber |
| taffy | CSS flexbox/grid layout math as a library | high | no public direct source found | Jul 2026 | recent authorship concentrated in one maintainer under Zed, Bevy, Servo, Blitz, Slint | amber |
| accesskit | the screen-reader bridge for Rust toolkits (+ GTK 4.18) | high | 2023–24 STF/GNOME project mostly wrapped up; personal sponsors visible | Jun 2026 | recent work concentrated in two people; no later direct institutional grant found | amber |
| cosmic-text | text layout engine (the Iced/COSMIC one) | high | System76 employment supports the maintainers | Apr 2026 | active, with support concentrated in one company | amber |
| swash | rasterizes shaped glyphs into pixels | high | maintainer employment is separate from a direct project grant | Jun 2026 | recent public commits concentrated; compatibility work continues | amber |
| tao | Tauri’s winit fork (GTK-hosted windows for Linux webview) | high | Tauri umbrella / CrabNebula involvement | May 2026 | recent authorship concentrated; remains on the pre-0.30 winit API | amber |
| muda | native menu bars & context menus | high | Tauri umbrella; no direct source found | Jun 2026 | recent authorship concentrated; Linux menubars require a GTK window | amber |
| tray-icon | system tray icons | high | Tauri umbrella; no direct source found | Jun 2026 | recent authorship concentrated; winit Linux path requires a parallel GTK loop | amber |
| global-hotkey | system-wide keyboard shortcuts | high / low-volume | Tauri umbrella; no direct source found | May 2026 | 6 commits in 12 months; its Linux backend is X11-only (ashpd exposes the portal separately) | amber |
| arboard | clipboard read/write | high | maintained in the 1Password organization | Aug 2025 | ~10.5-month release gap against 1,052 reverse deps at snapshot | amber |
| rfd | native open/save file dialogs | high | no public direct source found; 0 public sponsors at snapshot | Jan 2026 | active, with recent public work concentrated in one maintainer; 479 reverse deps | amber |
| notify-rust | desktop notifications | high | no public direct source found | Jun 2026 | active across three platforms, with recent authorship concentrated | amber |
| softbuffer | CPU pixel buffer onto a window (software rendering) | high | no public direct source found | Dec 2025 | 76 of roughly 84 commits in the audited year attributed to one author | amber |
| wgpu | one GPU API → Metal/Vulkan/DX12/WebGPU | lower | Mozilla employs core maintainers for Firefox WebGPU | Jul 2026 | broad employer-backed contributor set in this comparison | green |
| harfrust | the text shaper (ligatures, Arabic, kerning) | moderate | Google Fonts–backed, HarfBuzz org | Jul 2026 | active with upstream/institutional backing | green |
| parley + fontique | text layout engine + font fallback (the Linebender one) | lower | two active NLnet grants (through Aug 2026) + Canva contributor | Jun 2026 | active; time-bounded grant deadlines are a continuity consideration | green |
| wry | embeds the OS webview (the Tauri/Dioxus renderer) | lower | Tauri programme; CrabNebula employs a maintainer | May 2026 | multiple active contributors in the sampled window | green |
| tiny-skia | CPU 2D renderer (iced’s software fallback) | lower | Linebender stewardship (post-handoff) | Feb 2026 | post-handoff release shipped; activity remains modest | green |
| raw-window-handle | the universal window-handle socket between crates | moderate | rust-windowing umbrella; no direct project source found | May 2024 | stable API with low release activity (78M downloads at snapshot) | green |
A todo app (text input, Enter shortcut, per-row delete, live counter, scrolling) built idiomatically in each framework, versions pinned. All seven compiled and survived the launch check; later inspection observed their windows, and the implementations cover the source-level spec (GPUI exposes low-level elements and a hand-built input example but no reusable first-party high-level input widget, so this app approximated text input). On this M4 Pro, these seven small apps each clean-built in under a minute from a warm registry and empty target directory; that is not a general large-application ranking.
Round 2 tested what production apps are made of: drag-and-drop, live data, custom charts, hover
interactions, inline editing, animation. Two more apps per framework — “Pulse” (live metrics
dashboard: draggable card grid, 10–60 Hz data, hover-tooltip chart) and “Board” (kanban: cross-column DnD,
drop indicators, double-click edit). All 14 built and survived the scripted launch check, and later inspection observed
their windows; interaction evidence ranges from source/API paths through retained app tests as marked per capability.
Full data: report/11-interactive-results.md + per-app FRICTION.md.
| Capability | iced | egui | gpui | tauri | xilem | slint | dioxus |
|---|---|---|---|---|---|---|---|
| Charts + sparklines | hand-rolled | egui_plot | hand-rolled | Canvas2D | hand-rolled | Path strings | SVG in RSX |
| Chart hover + tooltip | hand-rolled | 1 line | hand-rolled | hand-rolled | hand-rolled | assembled | assembled |
| DnD: grid reorder | hand-rolled | egui_dnd | native DnD | HTML5+math | hand-rolled | hand-rolled | hand-rolled |
| DnD: cross-column | hand-rolled | hand-rolled | native DnD | hand-rolled | hand-rolled | DragArea 1.17 | hand-rolled |
| Drag ghost | assembled | assembled | built-in | free (HTML5) | assembled | hand-rolled | hand-rolled |
| Live data 10–60 Hz | built-in² | idiom | spawn loop | events | task view | Timer | tokio DIY |
| Inline edit (dbl-click) | assembled | assembled | own editor | assembled | own editor | assembled | assembled |
| Animate reorder/drop | snaps¹ | tweens | settle only | CSS FLIP | snaps¹ | animate x,y | CSS settle |
¹ The sample has no shared automatic FLIP/position-transition
abstraction: stock iced/xilem layouts snap, while the implementations used egui tweens, hand-built CSS FLIP, or explicit Slint x/y animation.
² iced’s time::every needs a non-default executor feature; the compile error gives no hint.
One quick-note app per framework exercising everything AROUND the window: tray, global hotkey, native
menubar, dialogs, clipboard (text + image), Finder file-drop, notifications, live dark mode, multi-window, close-to-tray.
Zero implementation-level not-achievable cells on tested macOS — every framework exposed a viable path,
although Finder drops and some notification results were source/API-level rather than real end-to-end observations.
Full matrix + evidence notes: report/12-shell-integration-results.md.
| Capability | iced | egui | gpui | tauri | xilem | slint | dioxus |
|---|---|---|---|---|---|---|---|
| System tray | assembled | assembled | assembled | built-in | assembled | DSL element | built-in |
| Global hotkey | assembled | assembled | assembled | plugin | assembled | assembled | built-in |
| Native menubar | muda¹ | muda¹ | built-in | built-in | muda¹ | DSL element | built-in |
| Native dialogs | rfd | rfd | built-in | plugin | rfd | rfd | rfd |
| Clipboard image | arboard | arboard | built-in | plugin | arboard | arboard | arboard |
| File drop (Finder) | built-in | built-in | built-in | built-in | workaround | unstable feature | built-in |
| Notification | notify-rust | osascript² | notify-rust | plugin | osascript² | notify-rust | notify-rust |
| Dark mode (live) | built-in | built-in | built-in | built-in | hand-rolled | built-in | built-in |
| Close-to-tray | built-in | assembled³ | assembled | built-in | assembled | built-in | built-in |
¹ A trap reproduced in these 3 integrations: muda’s
predefined Edit items silently swallow ⌘X/⌘C/⌘V before the framework’s own bindings — the standard Edit menu breaks paste
app-wide. ² notify-rust was rejected after a reproducible frame-scheduling freeze in this egui/macOS configuration;
delegate replacement is the leading inferred cause. ³ eframe never runs App::ui for hidden viewports — reopen logic must
live elsewhere or the window can’t come back. Round upset: dioxus quietly matches Tauri here (tray,
hotkey, menubar, multi-window, close-to-tray all built-in). Scope note: this is macOS; the Linux GTK
fault line (muda menubars cannot attach to plain winit windows; global-hotkey is X11-only) stands as documented in the fragmentation stories.
The same multilingual corpus (Latin ligatures, Arabic/Hebrew BiDi, Chinese/Japanese/Korean, Devanagari,
Thai, ZWJ emoji, one all-scripts line) rendered by every framework — the text-stack fragmentation made visible.
Verification used screenshots plus OCR/glyph/caret diagnostics described in each FRICTION file. The seven screenshots are
retained, but not every raw diagnostic output is; exact caret/OCR/mark counts and caption-specific interpretations therefore
remain local observations rather than independently reproducible results. Full matrices incl. evidence levels and editing
behavior: report/13-text-i18n-results.md.
The sharpest cross-stack finding is about editing, not rendering: Backspace over 👨👩👧👦 deletes the whole cluster in WebKit and gpui’s hand-rolled editor, shrinks it through valid smaller emoji in Slint (by design), and splits the cluster or leaves a dangling zero-width joiner in the tested iced, egui, and xilem editing paths. Those integrations lacked whole-cluster deletion out of the box; this does not establish that cosmic-text or Parley themselves lack grapheme editing. Egui also dropped 13 corpus combining marks; Slint showed one notdef mark and clipped tall stacks. macOS AX selected-text queries returned garbled RTL text for egui; actual screen-reader speech was not exercised, so assistive-technology impact remains an inference.
All seven iteration-1 apps were bundled into launching DMGs containing ad-hoc-sealed .app bundles. The
“packaging is the hard part” claim splits in two: the mechanical layer is nearly free — a revived
cargo-bundle packaged all six non-Tauri frameworks with an
identical 4-line stanza, under a minute each (and beat
cargo-packager, the ecosystem’s “intended answer,”
head-to-head in this run). The trust layer is the real cliff: with no identity configured none of the
tested runs produced a distribution signature; cargo-bundle lacks signing while Tauri/cargo-packager support it when
configured. The create-dmg flows failed repeatedly on this macOS 26 machine, while a plain hdiutil create
fallback was more reliable. In the standard quarantined-distribution path tested here, spctl rejected all seven
ad-hoc bundles as expected without Developer ID signing and notarization; Tauri,
cargo-packager, and the principal Rust-native cross-platform implementation
rcodesign automate parts of that workflow but cannot supply
Apple credentials. Bundle sizes: 5.0 MiB (GPUI) → 14.7 MiB (Slint).
Reliable app-attributed notification banners and dock behavior also benefit from a bundled,
identified .app. Details: report/14-packaging-results.md.
Round 4 tested the last untested dimensions: “Peek” (camera preview ≈30 fps, mic meter,
audio, 200-image gallery), “Grid” (100k rows: virtualization, sort, filter, resize, selection), and
“Fetcher” (debounce, streamed progress, and cancellation proven by a local server that logs client
disconnects). All 21 apps built and ran. Full matrices with per-cell evidence labels:
report/15-media-hardware-results.md,
report/16-data-grid-results.md, and
report/17-async-network-results.md.
table eagerly built 600k cell widgets in the inspected path, and Slint’s StandardTableView did
not meet the chip or multi-selection parts of this spec. Xilem supplied stock virtualization but represented roughly
8,000 rows rather than the full 100,000; its table furniture was hand-rolled from Masonry widgets.The macOS-built apps, rebuilt and run on Linux headlessly (lavapipe software Vulkan + llvmpipe GL,
WebKitGTK 2.50.6 — one plausible CI configuration). All 11 tested apps compiled with zero source
changes; the differences live entirely in the render path and the shell layer. Verbatim logs, screenshots, and
probe sources retained. Full report: report/18-linux-reality-results.md.
WGPU_BACKEND=gl rescued both wgpu failures.Whatever you pick: prototype the riskiest screen first (not hello-world), pin versions exactly (several audited tutorials were stale; this was not universal), test Linux on Wayland + NVIDIA early, and budget real time for packaging, signing, and updates. Tauri has the most integrated first-party chain; other stacks assemble maintained bundlers, platform tools/rcodesign, and Velopack.