A handheld for
indie games,
built in Rust.
Console32 is an open-source retro gaming handheld. Write games in Rust or C, test in your browser, and ship to real hardware — no OS, no compromise.
Play in your browser
The same game code that runs on hardware, compiled to WebAssembly. No install, no emulation layer — this is the real SDK.
Snake — Console32 WASM Demo
Click to start
Built for developers who care about the metal
No OS. No heap. No compromise. Every architectural decision serves one principle: deterministic over clever.
Bare-metal Rust
No RTOS overhead. Your game runs directly on the hardware with a guaranteed 16.67ms frame budget.
Dual SDK
Write games in Rust or C. The SDK handles all the unsafe boundaries — you write zero unsafe code.
Browser emulator
Your game compiles to WASM with zero code changes. Test, share, and demo without hardware.
Real audio
Dedicated audio core with I2S DAC, stereo headphone output, and hardware haptic feedback.
Drag-and-drop games
Load games via USB mass storage. Drop a .c32 file onto the console and play. No app store required.
Stable ABI
Games compiled today work on tomorrow's firmware. Indexed vtable design means no breaking changes.
Clean API, no boilerplate
The complexity lives inside the SDK. Your game code stays readable, typed, and safe.
use console32::prelude::*;
struct MyGame {
x: i32,
y: i32,
}
impl Game for MyGame {
fn init(console: &mut Console) -> Self {
MyGame { x: 160, y: 120 }
}
fn update(&mut self, console: &mut Console) {
if console.input.pressed(Button::Right) { self.x += 2; }
if console.input.pressed(Button::Left) { self.x -= 2; }
}
fn render(&mut self, console: &mut Console) {
console.display.clear(Color::BLACK);
console.display.sprite(&PLAYER, self.x, self.y);
}
}
console32_game!(MyGame);Building in public
Technical deep-dives, hardware decisions, and honest progress updates.
Get build updates
Low-frequency updates on hardware milestones, SDK releases, and when you can get your hands on one. No spam.
Unsubscribe anytime. Your email stays private.