A tilt-controlled marble-maze you play on your desktop with your Oura ring — hold your hand palm-up and tilt to roll a ball through procedurally-generated mazes to the goal. The mazes grow and pit-holes start appearing as you clear levels.
It talks to the ring directly over Bluetooth LE with no Oura account and no cloud — it only reads live motion (the accelerometer). The ring connection is built on the cloud-free Oura BLE client from open_oura (see Credits).
Unofficial — not affiliated with or endorsed by Oura. Works with Ring 3/4/5.
▶ Watch the story behind this project
- Put the ring on, hold your hand palm-up, and press Use Ring. A quick three-step calibration — hold still in a comfortable pose, tilt left, then tilt down — lines the board's controls up with your hand.
- Tilt to roll the ball to the glowing green goal. Reaching it loads the next, bigger maze.
- Level 1 is walls-only; later levels add pit-holes — fall in and you restart the level. Holes only sit in dead-ends, never on the solution path.
- No ring handy? Use Mouse tilts the board with the pointer.
- Bluetooth and the Rust toolchain. Built and tested on macOS;
Linux should work too (same
btleplugBLE stack), though it's untested. - An Oura Ring 3, 4, or 5 you can factory-reset (pairing installs a fresh key — see below).
cargo build --release # binary at target/release/ouraThe ring authenticates each BLE session with a 16-byte key. You get one by pairing
with a factory-reset ring; pairing installs the key and saves it to key.hex:
./target/release/oura scan # find your ring
./target/release/oura --key-file key.hex pair # on a FACTORY-RESET ring
./target/release/oura --key-file key.hex info # battery reads = key works
./target/release/oura --key-file key.hex maze # then open http://127.0.0.1:8090On macOS, grant Bluetooth permission to your terminal when prompted.
Pairing re-keys the ring, so the official Oura app won't recognize it again until you re-onboard there (which re-keys it once more). Treat the ring as dedicated to one or the other.
key.hex is your ring's secret key — it is gitignored; never commit or share it.
scan— list nearby ringspair— install + save an auth key (factory-reset ring)info— firmware / serial / batterymaze— serve the game on127.0.0.1:8090
A small Rust workspace:
oura-protocol— BLE packet framing, app-auth (AES), request builders, and device parsers.oura-link— thebtleplugBLE transport and the high-levelOuraClient.oura-cli— theourabinary.maze.rsis the self-contained game page, served over a loopback HTTP/SSE server (motion_server.rs) that streams the ring's accelerometer to the browser. The page is a single HTML/JS file with no external scripts or CDNs.
Built on open_oura by Th0rgal — the
cloud-free Oura BLE client and protocol work this game's ring connection is based
on. Huge thanks for the reverse-engineering that makes it possible. Licensed under
MIT (see LICENSE); open_oura is distributed under MIT per its
Cargo.toml.
MIT — see LICENSE.
