3D Layout Designer
Visualize and arrange your controller modules in 3D space.
The OpenArcade Config App is a browser-based 3D configurator for designing controller layouts and mapping buttons.
3D Layout Designer
Visualize and arrange your controller modules in 3D space.
Button Mapping
Assign keyboard keys or gamepad buttons to each physical input.
Live Preview
See real-time button presses reflected in the 3D view.
WebSerial
Direct connection to the Pi via USB serial.
| Layer | Technology |
|---|---|
| 3D Rendering | Three.js |
| Framework | React |
| Styling | Tailwind CSS |
| Communication | WebSerial API |
┌──────────────┐ WebSerial ┌──────────────┐│ Config App │◄─────────────────────────►│ RPi Serial ││ (Browser) │ /dev/ttyGS0 │ Service │└──────┬───────┘ └──────────────┘ │ │ JSON-lines protocol │ ▼┌──────────────────────────────────────────────────────────┐│ Commands: ││ - list_devices Get all connected modules ││ - get_device Get device config ││ - set_mapping Update button mapping ││ - set_ui_binding Bind UI element to physical control ││ - get_live_state Stream real-time button states │└──────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────────┐│ OpenArcade Configurator [Connect] [Save] │├─────────────────────────────────────────────────────────────────────┤│ ││ ┌─────────────────────────────────────┐ ┌──────────────────────┐ ││ │ │ │ Device List │ ││ │ │ │ │ ││ │ 3D Controller View │ │ ○ Left Module │ ││ │ │ │ ● Right Module │ ││ │ [Interactive Three.js] │ │ ○ D-Pad Module │ ││ │ │ │ │ ││ │ │ ├──────────────────────┤ ││ └─────────────────────────────────────┘ │ Button Mapping │ ││ │ │ ││ │ Button 1: [Z ▼] │ ││ │ Button 2: [X ▼] │ ││ │ Button 3: [C ▼] │ ││ │ │ ││ └──────────────────────┘ │└─────────────────────────────────────────────────────────────────────┘The config app loads 3D models representing each module type:
Models are loaded from /public/plates/ in the config app.
cd config_appnpm installnpm run devThen open http://localhost:5173 in a Chromium browser.
npm run build# Output in dist/The app can stream real-time button states for visual feedback:
{ "cmd": "get_live_state", "device_id": "AA:BB:CC:DD:EE:FF" }Response (repeating):
{ "device_id": "AA:BB:CC:DD:EE:FF", "state": { "1": true, "2": false, ... } }Pressed buttons light up in the 3D view.