// a tiny prototyping OS
A touch-navigable app launcher and open framework for the Waveshare ESP32-S3 AMOLED board. Swap batteries, build apps, 3D print a case. Everything is open — the firmware, the apps, the STL files, all of it.
Live accelerometer and gyroscope data from the onboard QMI8658. Swipe between accel (g) and gyro (dps) screens.
Enter any IP address and ping it. Shows response time in ms with a rolling 3-result history. Times out after 20 seconds.
Enter any two of V, I, R and calculate the third. Essential bench tool. The calculated result highlights in green.
RGB sliders with a live color preview and hex value. Save your last 3 colors. Built for matching real-world pigments and materials.
Millimeters to inches and back. Tap either field, type a value, the other updates instantly. No calculate button needed.
Board, firmware version, MAC address, free RAM, display specs, WiFi network, and battery percentage at a glance.
{
"wifi": {
"ssid": "YourNetwork",
"password": "YourPassword"
},
"owner": {
"name": "Your Name",
"email": "[email protected]"
}
}
Drop a settings.json on the device to configure WiFi and owner info. No on-screen keyboard needed — this is a dev tool, so configure it like one.
What shows up in the launcher tile. Keep it under ~12 characters.
A colour565 value used if no icon bitmap is found in /icons/.
Your app's entry point. Return from run() to exit back to the launcher. The shell handles everything else — crash recovery, memory cleanup, redraw.
Short press the physical home button to return to the launcher. Long press (2s) to enter deep sleep — press again to wake.
# mote app template NAME = "My App" ICON = 0xF81F # colour565 fallback def run(display, touch, font, button): # display → amoled.AMOLED (536×240) # touch → FT3168 driver # font → 31px bitmap font # button → HomeButton driver display.fill(0x0000) display.write( font, "Hello mote.", 160, 100, 0xF5A6 # orange ) while True: if button.check(): return # back to launcher t = touch.get_touch() if t: pass # handle touch
Mote requires a custom MicroPython build with the amoled C module. Use firmware_2025_12_15.bin from the dobodu repo.
Use mpremote to copy the core files, fonts, and apps to the board.
Create a settings.json with your WiFi credentials and owner info. The file is gitignored.
STL files included. White PLA, ~45 minutes. M2 screws into the board standoffs. No glue.
# install tools pip install esptool mpremote # erase + flash firmware esptool.py --chip esp32s3 \ --port $PORT erase_flash esptool.py --chip esp32s3 \ --port $PORT --baud 460800 \ write_flash --flash_size 16MB \ 0x0 firmware_2025_12_15.bin # upload mote mpremote connect $PORT cp boot.py : mpremote connect $PORT cp main.py : mpremote connect $PORT cp shell.py : mpremote connect $PORT cp button.py : # upload your settings mpremote connect $PORT \ cp settings.json :settings.json # run it mpremote connect $PORT run main.py
Be sure to confirm that you're ordering the touch version — the non-touch variant exists.
JST MX 1.25mm connector. Check polarity before connecting — LiPo connectors aren't standardized. ~500mAh recommended.
For mounting the board to the case via the onboard brass standoffs. Short M2s, 4–6mm length.
You will need this for your physical home button. The case provided accommodates a 12z12mm button.
Use these to expose GPIO ports on the board. The included case STL files accommodate 4 pins, extend the opening to allow more.
If you plan to 3D print the case files. ~45 minute print for both halves. No supports needed with the current design.
For flashing and charging. A right-angle adapter helps if you're routing the cable through the case opening rather than adding a magnet adapter.
Having solder and a soldering iron, heat shrink tubing, an X-Acto/hobby knife, sandpaper, and CA glue will all make mote easier to build.