In development — follow the build

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.

RP2350 dual-core M33
320×240 IPS LCD
16-bit colour
12 buttons
USB-C

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

MoveZ A buttonX B buttonEnter 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.

my_game.rs
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.