MyRust
v0.1.0 · Linux verified, macOS and Windows untested

Desktop apps in Rust. Small, typed, no unsafe core.

One binary for macOS, Windows and Linux. Draw a native UI with an immediate-mode engine, or load a web frontend in the webview the OS already has and call Rust through typed IPC.

$ cargo run -p dashboard -- --native-ui
Get started
6.3MB
Binary, stripped
101MB
Memory, native UI
365MB
Memory, webview included
0%
CPU at idle

Measured on this project's Linux container under Xvfb, release build, with the dashboard example: binary size after strip, PSS summed across the process tree, CPU sampled over ten seconds at rest. The webview figure includes the WebKitGTK web and network processes. macOS and Windows use different webview engines and have not been measured.

main.rs
use myrust_core::{
    app::{App, WindowConfig, WindowContent},
    ui::{button, column, text, NativeUi},
};

fn main() -> anyhow::Result<()> {
    let mut app = App::new("counter")?;
    let mut count = 0;

    let ui = NativeUi::new(move |c| {
        column(c).gap(12.0).children(|c| {
            text(c, &format("{count}"));
            if button(c, "Increment").clicked {
                count += 1;
            }
        });
    });

    app.on_ready(move |ctx| {
        ctx.create_window(WindowConfig {
            title: "Counter".into(),
            content: Some(WindowContent::NativeUi(ui.clone())),
            ..WindowConfig::default()
        })?;
        Ok(())
    })?;
    app.run()
}

No webview

The view is a Rust closure over your app's state. MyRust calls it to build each frame, resolves layout on the CPU, and rasterizes the display list into the window through softbuffer. No HTML, no JavaScript, no IPC hop.

Interaction is immediate-mode: button(c, "Increment").clicked is the click state for this frame, not a callback registration.

Run it

$ cargo run -p dashboard -- --native-ui

What is not done yet

This is an early framework. The list below is the honest boundary of what the current code does, matching the README: