schell/mogwai
schell/mogwai has 428 GitHub stars and 27 forks. Star changes are not measured yet. Last checked 2026-11-13 02:06 UTC. Last push 2026-09-26.
The minimalist, obvious, graphical, web application interface
Measured star growth
- in 24h
- Collecting history
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
Original
mogwai
minimal, obvious, graphical widget application interface
mogwai is a Rust crate for building GUI applications, primarily in the
browser, with cross-platform capabilities.
Overview
mogwai simplifies web app development by addressing challenges with
web-sys, focusing on:
- Element creation and styling
- Event handling
- Server-side rendering and cross-platform support
It offers a minimalistic and transparent approach, allowing you to structure your app freely.
Key Concepts
- View Construction: Use the
rsx!macro for intuitive view building. - Event Handling: Events are futures, not callbacks.
- Cross-Platform: Traits ensure operations are cross-platform, with room for specialization.
- Idiomatic Rust: Widgets are Rust types
Example
Here's a button that counts clicks:
use std::future::Future;
use mogwai::web::prelude::*;
use wasm_bindgen::prelude::*;
#[derive(ViewChild)]
pub struct ButtonClick<V: View> {
#[child]
wrapper: V::Element,
on_click: V::EventListener,
num_clicks: Proxy<u32>,
}
impl<V: View> Default for ButtonClick<V> {
fn default() -> Self {
let num_clicks = Proxy::<u32>::default();
rsx! {
let wrapper = button(
style:cursor = "pointer",
on:click = on_click
) {
// When the `num_clicks` proxy is updated it will replace this node.
{num_clicks(n => match *n {
1 => "Click again.".to_string(),
n => format!("Clicked {n} times."),
})}
}
}
Self {
wrapper,
on_click,
num_clicks,
}
}
}
impl<V: View> Step for ButtonClick<V> {
type Output = ();
fn step(&self) -> impl Future<Output = ()> {
async move {
let _ev = self.on_click.next().await;
self.num_clicks.modify(|n| *n += 1);
}
}
}
#[wasm_bindgen(start)]
pub fn main() {
let view = ButtonClick::<Web>::default();
mogwai::web::body().append_child(&view);
wasm_bindgen_futures::spawn_local(async move {
loop {
view.step().await;
}
});
}
Getting Started
- Install the Rust toolchain from https://rustup.rs/.
- Install trunk.
- Use
cargo-generateto start a new project:
cargo install cargo-generate
cargo generate --git https://github.com/schell/mogwai-template.git
cd your_project_name
trunk serve --config Trunk.toml
Resources
Community
Join the conversation on Element or via Matrix.
Support
Consider sponsoring on GitHub to support development.
Explore related projects
freeCodeCamp/freeCodeCamp
freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.
459,068 starsdonnemartin/system-design-primer
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
377,734 starsreact/react
The library for web and native user interfaces.
252,565 starsvuejs/vue
This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/core
212,527 stars