A Raspberry Pi 4 display engine for ambient 3D art and always-on information displays.
Slides — small Rust programs compiled to WebAssembly — render at 60 FPS to whatever screen you've mounted on the wall. The engine enforces hard limits: 60,000 vertices, 4 MiB of texture memory, four meshes. Not guidelines. Hard limits.
This is the Constraint Principle: treat the hardware's boundaries not as a ceiling to push against, but as the canvas itself. Every polygon is intentional. Every pixel is placed.
| Repo | Purpose |
|---|---|
| vzglyd/vzglyd | Engine, slide runtime, example slides, packaging |
┌─────────────────────────────────────────────────────┐
│ Slide (.vzglyd archive) │
│ ┌────────────────┐ ┌───────────┐ ┌────────────┐ │
│ │ slide.wasm │ │ shaders │ │ assets │ │
│ │ (Rust→wasm32) │ │ (.wgsl) │ │ (≤4 MiB) │ │
│ └────────────────┘ └───────────┘ └────────────┘ │
└──────────────────┬──────────────────────────────────┘
│ wasmtime sandbox
▼
┌─────────────────────────────────────────────────────┐
│ Engine (Rust + wgpu) │
│ • Enforces vertex / texture / mesh budgets │
│ • Drives Wayland or DRM/KMS output │
│ • 60 FPS on Raspberry Pi 4 │
└─────────────────────────────────────────────────────┘
Slides are sandboxed WebAssembly. They can't see the filesystem, can't open sockets, can't allocate past their budget. If they try, the engine refuses — not crashes, refuses.
| Resource | Budget |
|---|---|
| Vertices per frame | 60,000 |
| Texture memory | 4 MiB (four 512×512 RGBA8) |
| Static meshes | 4 |
| Dynamic meshes | 4 |
| Target framerate | 60 FPS on RPi 4 |
A full procedural landscape fits in 4,225 vertices. A clock face, numerals, and sweep hand fit in the remainder.
clock · quotes · affirmations · facts · budget · chores · weather · afl-ladder · news · reminders · servers · wikipedia-history
All written in Rust, all compile to WASM, all fit the budget.
# Install the engine
cargo install --git https://github.com/vzglyd/vzglyd vzglyd
# Build and run the clock slide
cargo build --example clock --target wasm32-wasip1
vzglyd run target/wasm32-wasip1/debug/examples/clock.wasmRequires Rust 1.85+, a wasm32-wasip1 target, and a display.
New slides are the highest-leverage contribution. The engine is stable; the slide library is where the project grows.
See CONTRIBUTING.md for the authoring guide, shader contract, and submission checklist.
MIT or Apache-2.0, at your option.