Christen Dijoux — Portfolio©2026
000

Case study · 07 / 11

Badger

Apps and Badge Studio for the GitHub Universe badge

Fig. 01 — BadgerHover for colour

The GitHub Universe '26 badge is a real little computer (RP2350, colour screen, MicroPython). I opened it up: new apps, an app store that runs in the browser, and a remote on my Galaxy Watch.

At GitHub Universe '26 in San Francisco, every attendee gets a Badger 2350: an RP2350 chip, a 320×240 colour screen, Bluetooth, Wi-Fi and MicroPython running MonaOS. Badger gathers what I built for it. On the badge: a Radar that finds nearby badges over Bluetooth and places them by signal strength (with a hot / cold game and an encounter history), a Badge app that shows my GitHub stats and QR codes and answers NFC scans, safer Contacts that still swap with stock badges, a pedometer, Mona Pet fed by steps, the Duck Maze game and a menu that keeps my apps apart. In the browser: Badge Studio, an app store that talks to the badge over USB (Web Serial) to install, update or remove apps, replace a built-in one, repair system files, reorder the home screen, change settings, take screenshots and open a MicroPython console, with nothing to install. On the wrist: Badger Remote, a Kotlin Wear OS app that presses the badge's buttons over Bluetooth Low Energy (2 bytes per press, merged into the badge's loop so every app sees them as real presses) and sends it my steps for the day. It is all tested in CI (simulated apps, contacts compatibility, Radar, Duck Maze levels, the watch app build), documented with one guide per app and open to contributions.

Main Features

Technical Challenges

Technologies

Year

In the wild

Live captures · hover for colour

What it does

01Badge Studio: an app store in the browser that talks to the badge over USB (Web Serial), nothing to install

02Install, update, remove or replace a built-in app, with the old version backed up

03Repair system files, reorder the home screen, change settings, take screenshots and open a MicroPython console

04Radar: nearby badges found over Bluetooth and placed by signal strength, hot / cold game and history

05Badge app: GitHub stats, QR codes for my site and profiles, NFC scan response

06Badger Remote: the Galaxy Watch becomes the badge controller (Bluetooth LE, tap or hold, crown)

07Pedometer and Mona Pet fed by the watch steps, kept on the badge between syncs

08Duck Maze, dizzy Mona when you shake the badge, and a menu that separates my apps from the stock ones

09PC tools: deploy and screenshots over the serial port (RGB565 → PNG)

10GitHub Actions CI: simulated apps, contacts compatibility, Radar, Duck Maze levels and the watch app build

How it was solved

01Coding for 520 KB of RAM and a 320×240 screen, inside MonaOS's render loop

02Estimating distance from Bluetooth signal strength alone, with no direction

03Staying compatible with the stock badges contact swap

04Writing to the badge from the browser without ever leaving it broken: every file is read back after it is written

05Making the watch presses look like real presses, in every app, menu included

06Sharing the badge's Bluetooth between the remote and the apps that need it

07Testing in CI code made for a device CI does not have

Stack

Front-end

Back-end

Tools

Tags

#micropython #github-universe #badger2350 #web-serial #bluetooth-le #wear-os #app-store #embedded

Next project

08 / 11

Fort Mason Octodex