laufey is a web embedded framework: build cross-platform desktop apps with web technologies and your choice of browser engine.
It is built around a small C ABI that separates the browser engine (the backend) from your application logic (the runtime). You write the runtime in Rust against one portable API; laufey ships prebuilt backends — Chromium via CEF, the system WebView, and an engine-free Winit windowing backend — and your app runs on any of them.
use laufey::{Value, Window};
fn main() {
Window::new(800, 600)
.title("My App")
.bind("greet", |call| {
let name = call
.args
.first()
.and_then(|v| v.as_string())
.unwrap_or("World");
call.resolve(Value::String(format!("Hello, {name}!")));
})
.load("index.html");
}
laufey::main!(main);
Where to go next
- Architecture — how backends and runtimes fit together.
- C ABI — the
laufey.hcontract: entry points, the API table, and the value model. Read this if you’re implementing a backend or a binding. - Backends — CEF, WebView, and Winit, and how they differ.
- The feature pages — windows, JavaScript interop, menus, dialogs, tray, notifications, and more — each with a usage example and its per-platform notes.
- Packaging & distribution — bundling, signing, and updates.
- Building — prerequisites and
maketargets.
The source lives at github.com/littledivy/laufey.