SEMANTIC UI FOR RUST

One language. Every interface.

Learn the model behind Glory: explicit semantics, fine-grained state, and rendering hosts you can replace.

No UI DSL

·

No virtual DOM

·

Pure Rust

Build beyond the browser.

DESIGNED TO BE UNDERSTOOD

A UI framework without the hidden machinery.

Glory keeps the application model explicit: semantic values describe the interface, Owners control lifetime, and hosts decide how those semantics become pixels.

✓

Describe interfaces with handwritten Rust builders—not a template compiler.

✓

Build once, then send typed patches instead of diffing virtual trees.

✓

Keep state and subscriptions attached to an explicit Owner lifetime.

✓

Share widgets across Web, SSR, and native rendering hosts.

✓

Inspect the same semantic model in headless tests before opening a window.

STATE TO SEMANTICS

Small pieces. Precise updates.

A Cage owns mutable state. A derived label tracks it. The button emits a semantic Activate event. No component-wide rerender is required.

counter.rs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
use glory::prelude::*; pub fn counter() -> impl Widget { widget(|scope| { let count = scope.cage(0_i32); let label = count.map(|n| format!("Clicks: {n}")); row().fill(( text().content(label), button() .label("Add one") .on(activate, move |_| { count.revise(|n| *n += 1) }), )) .show_in(scope) }) }

●

●

●

localhost:8796

LIVE GLORY WIDGET

A small, real counter

Built with Glory's own button, text, view, and reactive Cage.

Clicks: ⁨0⁩

The same Widget implementation works in a headless test, a browser host, an SSR snapshot, or a native window.

RENDERING IS A HOST DECISION

One widget tree. Multiple hosts.

Glory separates what your interface means from how a platform presents it. Choose static HTML, hydrated WebAssembly, or native Blitz rendering without rewriting the widget.

hydrate.rs

1 2 3 4 5 6 7
// Serialize a versioned semantic snapshot. let snapshot = glory::ssr::snapshot(counter())?; let html = format!("<main id=\"app\">{}</main>", snapshot.html); // Adopt that exact HTML in the browser. let app = glory::web::hydrate(root, counter())?; // Keep the WebApp alive.

THE HOST MATRIX

01

Web

WASM DOM rendering, input, geometry, and scrolling.

02

SSR

Static documents, snapshots, resources, and optional streaming.

03

Native

Blitz layout, desktop windows, and accessibility bridges.

Understand SSR & hydration →

LEARN THE FRAMEWORK

Understand it. Then build with it.

Follow the guides from first principles to a working cross-platform application. Each page includes concrete APIs, code, and current boundaries.

Architecture

Trace a Cage revision through derived values, semantic patches, and a rendering host.

Read the design →

Custom widgets

Implement the Widget trait, compose children, handle events, and own state correctly.

Write a widget →

SSR & hydration

Choose between static HTML, snapshots, resource transfer, and streaming.

Render on the server →

Cross-platform

Share one widget across Web, SSR, and Blitz while respecting host capabilities.

Compare hosts →

START WITH THE MODEL

Know what your UI is doing.

Explore the architecture →