#gpu-rendering #wgpu-rendering #gpu #graphics #wgpu

bexa-ui-render

GPU rendering backend for BexaUI — wgpu + glyphon text rendering

1 unstable release

Uses new Rust 2024

0.1.0 Feb 7, 2026

#716 in GUI


Used in bexa-ui

MIT license

2.5MB
4.5K SLoC

BexaUI

The Hacker's UI Toolkit for Rust.

A GPU-accelerated, native GUI framework designed for building developer tools, terminals, and infrastructure dashboards in Rust.

Unlike generic GUI frameworks, BexaUI treats the terminal as a first-class citizen. No Electron. No web stack. Just Rust, GPU, and a real PTY.

Why BexaUI?

  • Built-in Terminal — Real PTY-backed VT100/ANSI terminal emulator with interactive shell, colors, and cursor navigation. No other Rust GUI toolkit ships this.
  • GPU Accelerated — wgpu 28 with SDF rendering for crisp rounded corners, borders, and alpha blending at any scale.
  • Declarative ui! Macro — Build widget trees like JSX, with compile-time Rust safety. No runtime overhead.
  • Flexbox Layout — Powered by taffy with CSS-like semantics. No manual pixel math.
  • Reactive Signals — Simple Signal<T> / SetSignal<T> state management inspired by modern reactive frameworks.
  • Multi-Window — Spawn new windows from callbacks (like Delphi forms). Each window has its own widget tree.
  • Theming — Centralized Theme struct with pre-built palettes (Ocean, Light, Dark).
  • Keyboard & Clipboard — Tab/Shift+Tab focus, Enter/Space activation, Ctrl+C/V/X.

Ideal Use Cases

BexaUI is not a general-purpose GUI framework. It is optimized for:

  • Custom Terminal Emulators — SSH clients, multiplexers, serial monitors
  • DevTools — Log viewers, debuggers, profilers, REPL interfaces
  • Admin Panels — Docker/K8s dashboards, database managers, server monitoring
  • Infrastructure Tooling — Embedded flash tools, deployment consoles, CI/CD dashboards
  • Internal Tools — Company-specific ops tools that need a real terminal

Widgets

Widget Description
Container Flexbox container with padding, background color, border radius
Flex Row/column layout wrapper
Label Text display with signal-based reactive content
Button Interactive button with hover/active/focus states and click handlers
TextInput Text field with cursor, selection, clipboard, and glyph-based positioning
Checkbox Toggle checkbox with signal binding
RadioButton Radio button groups with shared signal
Select Dropdown select with overlay rendering
Icon Nerd Font icon rendering
Terminal PTY-backed terminal emulator (feature-gated)

Quick Start

use bexa_ui::prelude::*;

fn main() {
    let theme = Theme::ocean();
    let metrics = Metrics::new(16.0, 22.0);

    let (text, set_text) = create_signal("Hello, BexaUI!".to_string());
    let label = Label::new(text, metrics, theme.text_primary);

    let mut btn = Button::new("Click me", metrics)
        .with_colors(theme.button, theme.button_hover, theme.button_active, theme.button_focus)
        .with_border_radius(6.0);
    btn.set_on_click(move || {
        set_text.set("Button clicked!".to_string());
    });

    let root = ui! {
        Container::new().with_padding(32.0) => {
            label,
            btn,
        }
    };

    App::new(root)
        .theme(theme)
        .title("My App")
        .run();
}

Terminal Widget

The terminal widget spawns a real PTY process and renders it with monospace font and ANSI colors. It requires the terminal feature flag.

use bexa_ui::prelude::*;

fn main() {
    let theme = Theme::ocean();
    let metrics = Metrics::new(16.0, 22.0);
    let requests = App::window_requests();

    let mut btn = Button::new("Open Terminal", metrics)
        .with_colors(theme.button, theme.button_hover, theme.button_active, theme.button_focus)
        .with_border_radius(6.0);
    btn.set_on_click({
        let reqs = requests.clone();
        move || {
            let term = Terminal::new(Metrics::new(14.0, 18.0));
            reqs.lock().unwrap().push(WindowRequest {
                title: "BexaUI Terminal".into(),
                width: 900,
                height: 600,
                root: ui!(term),
                theme: Theme::ocean(),
            });
        }
    });

    let root = ui! {
        Container::new().with_padding(32.0) => {
            btn,
        }
    };

    App::new(root)
        .theme(theme)
        .title("Terminal Demo")
        .with_requests(requests)
        .run();
}

Architecture

BexaUI is organized as a Rust workspace with three crates:

bexa-ui/              # Facade crate — re-exports everything via prelude
bexa-ui-core/         # Widgets, layout, theme, signals, renderer commands
bexa-ui-render/       # wgpu rendering, glyphon text, event loop, multi-window

Rendering pipeline (4-pass per frame):

  1. Main quad pass (SDF rounded rects with borders)
  2. Main text pass (glyphon)
  3. Overlay quad pass (dropdowns, tooltips)
  4. Overlay text pass

Examples

# Basic hello world
cargo run -p bexa-ui-examples --example hello

# Dashboard with all widgets
cargo run -p bexa-ui-examples --example dashboard

# Checkbox, radio buttons, and select dropdown
cargo run -p bexa-ui-examples --example checkbox_radio

# Terminal in a new window
cargo run -p bexa-ui-examples --example terminal --features terminal

# Theme gallery
cargo run -p bexa-ui-examples --example theme_gallery

# Grid layout
cargo run -p bexa-ui-examples --example layout_grid

Dependencies

Crate Purpose
wgpu 28 GPU rendering
winit 0.29 Window management and events
glyphon 0.10 Text rendering (cosmic-text)
taffy 0.4 Flexbox layout engine
arboard 3 Clipboard access
portable-pty 0.9 PTY for terminal (optional)
vte 0.15 ANSI escape sequence parser (optional)

Roadmap

Done:

  • Text input with clipboard
  • Keyboard navigation
  • Checkbox / Radio / Select
  • Scrollbar
  • Multi-window support
  • Terminal widget (PTY + VT100)

Next:

  • Table / DataGrid
  • Slider widget
  • Image widget
  • Animations and transitions
  • Accessibility (screen readers)
  • Publish to crates.io
  • CI/CD with GitHub Actions

Contributing

Contributions are welcome! BexaUI is especially looking for help with:

  • Terminal emulation improvements (mouse support, 24-bit color, scrollback)
  • New widgets (Table, Slider, Tree view)
  • Testing and CI setup
  • Documentation and examples

Feel free to open issues, submit pull requests, or suggest new features.

Support

If you find BexaUI useful and want to support its development:

Buy Me A Coffee

License

MIT

Dependencies

~31–54MB
~838K SLoC