
Motorized faders
Ilosariph/motorized-faders
RP2040 board (Pico-clone with RTL8720DN WiFi — GP4/GP5 not exposed) + TB6612FNG motor drivers + Alps motorized faders.

Poko: a phone-free MagSafe companion. nRF52840 + Zephyr, round display, haptic ring, voice memos, iPhone app, parametric CAD, KiCad.
Pokodoro is an open-source printed circuit board by justinjchae, from the justinjchae/poko repository on GitHub. It is a 4-layer board of 55 × 85 mm with 52 parts on 58 nets, routed with 356 tracks and 55 vias.
It is built around the ESP32-S3-WROOM-1-N4, 1N5819HW-7-F-01 and MCP73831T-2ACI/OT-HXY, with the MIC5219-3.3YM5-TR, B3F-4050 and BC817 among its other parts. Its parts include 15 capacitors, 12 resistors, 7 ICs, 5 switches and 4 connectors. It belongs with the radio and wireless and lEDs and displays boards and the ESP32 and nRF52 and nRF5x boards of this library.
A palm-sized, phone-free companion: the things you'd pick up your phone for, without picking up your phone.
A round 240×240 display, one rotating ring, a haptic motor, a microphone and BLE to an iPhone app. It snaps onto the back of the phone like a MagSafe accessory, or comes off and stands in for the phone at the gym, the library or on a walk.
nRF52840 · Zephyr / nRF Connect SDK · LVGL · BLE · MCUboot OTA · SwiftUI · Fusion 360 API · KiCad · JLCPCB
Left: the V1B prototype in hand, home ring on Voice Memos. Right: Pomodoro → workout logging → recording and browsing memos → Now Playing, all from the thumb wheel (2× speed).
| Use case | On the device | On the phone | |
|---|---|---|---|
| ⏱ | Pomodoro focus timer | Ring sets the time, haptic ticks while turning, glanceable progress ring, silent vibration at the end | none |
| 🏋️ | Workout tracker | Today's exercises, the weight prefilled from last time with plates per side, rest timer, every set saved to flash | Routines are edited in the app and synced |
| 🎙 | Voice memos | Hold to record from any screen; ADPCM to on-board flash; works offline | Pulled over BLE, transcribed, titled and routed to Reminders, groceries or Calendar |
| 🎵 | Now Playing (extra) | Play/pause/skip and 16-step volume over Apple Media Service | none |
| ⌨️ | Desk keyboard (extra) | USB/BLE HID: ring as a scroll wheel, voice-to-typing | Transcription |
What it won't do: show notifications, run feeds, or ask you to scroll. One hand, eyes-free, every action confirmed by vibration.
These are the constraints every hardware and firmware decision is checked against. Full reasoning is in SPEC.md and the part-by-part tracker docs/hardware/LOCK.md.
| Requirement | Target |
|---|---|
| Form factor | MagSafe-style accessory, 60 × 90 mm outline, half-round top |
| Thickness | 8–9 mm for production (the printed prototype is 18.8 mm; this is the hardest constraint) |
| Interaction | One hand, eyes-free. Turn moves focus, click commits; turning never silently changes a value |
| Navigation depth | Home → app → one detail level, max. Apps live at fixed clock positions on the home ring |
| Battery | Lasts a normal day; ~0.5 mA sleep-floor target |
| Offline | Device works without the phone; the phone does the heavy lifting (transcription, sync) |
| Manufacturing | Every part sourceable at ~100 units, JLC-assemblable, no injection mold for the first run |
| Prototyping rule | Internals must be printable (PLA/TPU) or stock commodity parts; dimensions tunable by reprint |
| Access rule | Every prototype breaks out spare GPIOs, 3V3/GND and an outside-reachable reset |
| Subsystem | Decision | Why |
|---|---|---|
| MCU | nRF52840: XIAO Sense on a carrier board for the first batch, Raytac MDBT50Q module for production | BLE + battery life over the ESP32-S3 used in v0; the module is ~1.5–3 mm thinner and ~$6 cheaper than soldering down a dev board |
| Display | 1.28" round GC9A01 TFT, 240×240, 4-wire SPI, bare 16-pin FPC panel | Round AMOLED was RFQ-only with ~1,000 MOQ; TFT has transparent low-volume pricing. Cost: the backlight dominates power, so it gets a discrete constant-current sink with PWM |
| Input | Rotating ring + mechanical select, AS5600 magnetic angle sensor on-axis | EC11 encoders are too thick for 8 mm. Optical, magnetic strip, inductive PCB coil and capacitive were weighed, and the press-sensing options were tested on rigs (see Hardware) |
| Haptics | LRA + DRV2605L; detents simulated in software | One actuator gives detents, clicks and alerts with no mechanical detent to wear out or add thickness |
| Power | 500 mAh 303450 LiPo (3.0 mm thick), single-cell linear charger | Chosen to protect the thickness budget; battery life comes from backlight PWM and a low sleep floor |
| Storage | 16 MB QSPI NOR flash on the production board (memos + OTA slot), no SD card | About 31 minutes of memos alongside a full OTA image |
| Firmware | Zephyr / nRF Connect SDK | Real power management, MCUboot signed OTA, BLE stack. Arduino and CircuitPython were used only for bring-up |
| Enclosure | Machined shell (quote pending) with 3D-printed internals | Small batch; no mold until demand is proven |
flowchart LR
subgraph Device["Poko (nRF52840, Zephyr)"]
Ring["Ring<br/>AS5600 / EC11"] --> Input["Input + detent engine"]
Btn["Select button"] --> Input
IMU["6-axis IMU"] --> Pickup["Pickup-to-wake<br/>auto-rotate"]
Mic["PDM mic"] --> Rec["Recorder<br/>ADPCM"]
Input --> Shell["App shell<br/>home ring + apps"]
Pickup --> Shell
Shell --> UI["LVGL UI"] --> LCD["GC9A01 240×240"]
Shell --> Haptic["Haptic patterns"] --> LRA["DRV2605L + LRA"]
Rec --> Flash["Flash<br/>memo store"]
Shell --> BLE["BLE<br/>GATT · AMS · HID · SMP"]
Flash --> BLE
OTA["MCUboot<br/>signed OTA"] -.-> Flash
end
subgraph Phone["iPhone companion (SwiftUI)"]
Sync["Memo sync"] --> STT["On-device<br/>transcription"]
STT --> Route["Voice-action router"]
Route --> Rem["Reminders /<br/>groceries"]
Route --> Cal["Google Calendar"]
Routines["Workout routines"]
end
BLE <--> Sync
BLE <--> Routines| Stage | What | Status |
|---|---|---|
| Breadboard bring-up | XIAO nRF52840 Sense + round GC9A01 module + EC11 encoder (detent removed, shaft cut down) + ERM motor. CircuitPython first, then Zephyr | Done (Sept 2026) |
| Enclosure V1B | Two-part printed shell, 33 mm thumb wheel, display retainer, VHB-mounted XIAO, magnet in the back cover, support-free print orientations. 18.8 mm thick | Printed, carried daily to the gym and library |
| Enclosure V2 (inset) | Parametric Fusion 360 model driven from Python (cad/enclosure_v2_inset.py): 8 mm stack, datum-based tolerance stack, pairwise interference checks | Modelled |
| Knob and ring test rigs | Printed rigs + an ESP32-S3 logger streaming AS5600 angle/AGC/magnitude at 100 Hz to a Web Serial visualizer | Built and tested, see below |
| XIAO carrier PCB | Chin board carrying the display FPC, AS5600, DRV2605L/LRA, backlight sink, select-switch footprints | Next: floorplan → schematic → JLC order |
![]() V1B opened: cell, wiring, magnet in the back cover | ![]() Breadboard bring-up | ![]() Protoboard for the first enclosure | ![]() EC11 opened to remove the detent spring | ![]() Cutting the encoder shaft down |
The ring has to feel premium (the iPod click wheel is the reference) inside an 8 mm stack, so I built rigs and measured before committing:
Scripts: cad/as5600_knob_rig.py, cad/ring_rig.py, firmware/tools/as5600_rig/ (logger firmware + visualizer).
docs/hardware/LOCK.md.docs/hardware/pins.md).docs/hardware/jlc-cost.md.A Zephyr application split into a small OS layer and apps (source in a private repo; happy to walk through it):
os/: input (EC11 Gray-code decoder, AS5600 driver), detent and haptic engine, LVGL screen and widgets, power states (dim, sleep, pickup-to-wake from the IMU), battery ADC, PDM capture with ADPCM, NVS-backed memo store, BLE link (custom GATT, Apple Media Service, HID keyboard), USB HID, MCUboot OTA, crash capture.apps/: Pomodoro, Gym (with synced routines), Voice memos, Now Playing, Desk keyboard, Settings.Each feature was specced as a numbered brief with acceptance criteria and an outcome write-up.
SwiftUI app (XcodeGen project, source in the same private repo): memo sync over BLE, on-device transcription, automatic titles, a voice-action router (to-dos, groceries, Google Calendar via OAuth PKCE), and workout routine editing. A routing eval harness scores the router against synthetic and real memo sets.
| What | Result | How |
|---|---|---|
| Current, screen off / on / recording | 37.5 / 42.6 / 44.0 mA | Multimeter in series with the battery, USB unplugged (power.md) |
| Backlight share of screen-on draw | 33.5 mA (~79%) | Voltage across the module's 8.2 Ω backlight resistor. This is why the production board gets a PWM current sink |
| OTA over BLE | 561 KB in ~34 s, 42.5 s swap | MCUboot. A battery pull mid-swap recovered, and all 105 stored memos kept matching CRCs (ota-checks.md) |
| Boot time | 53 s → 4.4 s | Traced to a per-key NVS walk at boot, replaced with a single pass |
| Voice-to-text, release to typed | 5.9–6.3 s → ~3.0–3.7 s | Timing marks on device and phone, 5–7 s utterances |
| Voice-action routing accuracy | 47/54 → 52/54 on real memos | Eval harness, Apple on-device model |
| Album-art decode | 65 ms avg / 167 ms max | Measured, then cut: it made the UI lag |
![]() |
Inspiration: concentric orbits on black, like the iOS Solar System lock screen. They map naturally onto a round display and a ring you turn.
|
Poko is the second version of a device I started in 2024: Pokodoro, a portable Pomodoro timer that tells you a session is over with a vibration instead of a beep, so it works in a library or an office. I sketched it, prototyped it on protoboard, laid out a 4-layer board in KiCad, had it fabricated, hand-soldered it and designed the enclosure.
![]() Assembled v0 | ![]() Custom PCB (KiCad 3D) | ![]() Inside the enclosure |
![]() UI sketches | ![]() Enclosure sketches | ![]() Protoboard MVP |
Board: ESP32-S3-WROOM-1, USB-C with a TVS ESD array, MCP73831 LiPo charger, Schottky OR-ing of USB and battery into a MIC5219 LDO, transistor-driven vibration motor and buzzer, SPI OLED header, two user buttons plus boot/reset. KiCad sources, Gerbers, BOM and placement files are in pokodoro/.
What changed in Poko: the MCU went to nRF52840 for BLE and battery life, a round colour display replaced the 128×64 OLED, a haptic ring replaced the buttons, the firmware moved to Zephyr with OTA and a phone app, and the scope grew from a timer into something to carry every day.
Current goal: a lendable batch of 7 units, polished enough to hand to 3–5 people for two weeks of real use (Pomodoro, workouts, memos).
SPEC.md concept, requirements, early BOM and power budget
docs/hardware/ part lock tracker, pins, power, haptics, OTA, tolerance stack, JLC cost
docs/images/ photos, demo GIF, KiCad exports
cad/ parametric Fusion 360 scripts: enclosure, floorplan, test rigs, 3MF export
firmware/tools/as5600_rig/ ring-rig logger (ESP32-S3) + Web Serial visualizer and menu tests
pokodoro/ the v0 KiCad project (schematic, PCB, Gerbers, BOM)Firmware (Zephyr, C) and the iPhone app (SwiftUI) are in a private repo and available on request.
I'm the sole developer. I set the requirements, made the hardware and part decisions, sourced parts and talked to suppliers, and built, printed and bench-tested every prototype and rig. Pokodoro (v0) I designed end to end myself. For Poko, most of the firmware, iOS and CAD-script code was written with AI coding agents (Claude Code) working from feature briefs. I wrote each brief's requirements, tested the results on real hardware, and accepted or rejected them.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 7 | 0.1uF | Pokodoro_Footprints:CAP_CL10_SAM | C3, C7, C8, C12, C13, C14, C15 |
| 6 | 10K | Pokodoro_Footprints:RC0603N_YAG | R1, R5, R6, R7, R11, R12 |
| 6 | 10uF | Pokodoro_Footprints:CAP_CL10_SAM | C2, C4, C5, C6, C9, C11 |
| 4 | MountingHole | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 1N5819HW-7-F | Pokodoro_Footprints:1N5819HW-7-F_DIO | U2, U4, U6 |
| 2 | 1K | Pokodoro_Footprints:RC0603N_YAG | R8, R9 |
| 2 | 330 | Pokodoro_Footprints:RC0603N_YAG | R4, R10 |
| 2 | 5K1 | Pokodoro_Footprints:RC0603N_YAG | R2, R3 |
| 2 | B3F-4050 | Pokodoro_Footprints:B3F-4050 | SW3, SW4 |
| 2 | BC817 | Pokodoro_Footprints:BC817-40 | Q1, Q2 |
| 2 | PTS810SJG250SMTRLFS | Pokodoro_Footprints:PTS810 | SW1, SW2 |
| 2 | S2B-PH-K-SLFSN | Pokodoro_Footprints:S2B-PH-K-S | J2, J4 |
| 2 | WL-SMCW_0603 | Pokodoro_Footprints:WL-SMCW_0603 | D2, D3 |
| 1 | 1uF | Pokodoro_Footprints:CAP_CL10_SAM | C1 |
| 1 | 2171790001 | Pokodoro_Footprints:USBC_MOLEX_2171790001 | J1 |
| 1 | 470pF | Pokodoro_Footprints:G-188_MUR | C10 |
| 1 | CEM-120342 | Pokodoro_Footprints:CEM-120342 | U7 |
| 1 | DT1042-04SO-7 | Pokodoro_Footprints:DT1042-04SO | D1 |
| 1 | EG1224 | Pokodoro_Footprints:EG1224 | S3 |
| 1 | ESP32-S3-WROOM-1-N4 | Pokodoro_Footprints:ESP32-S3-WROOM-1-N4 | U1 |
| 1 | MCP73831T-2ACI/OT | Pokodoro_Footprints:SOT-23-5_MC_MCH | U3 |
| 1 | MIC5219-3.3YM5-TR | Pokodoro_Footprints:SOT-23-5_M5_MCH | U5 |
| 1 | S7B-XH-A_LF__SN_ | Pokodoro_Footprints:S7B-XH-A-1 | J3 |

Ilosariph/motorized-faders
RP2040 board (Pico-clone with RTL8720DN WiFi — GP4/GP5 not exposed) + TB6612FNG motor drivers + Alps motorized faders.

Rithvik-Vadlamani/kvm-switch
Four-layer HDMI/USB KVM design with STM32 firmware, supply supervision, and verification evidence

vekkuli/chess_clock
This repo contains design and fabrication files for my DIY chess clock project. The main components in the design are

ZeusyBoy98/HexiLux
A custom open-source smart lighting solution, using tiling hexagonal panels. Featuring music sync and home assistant compatibility.


Paumanok/kasa-remote
An ESP32 based remote control device for manipulating and monitoring TPLink Kasa devices.


ericpearson1313/tt_pump_out_chip
60 Hz Liquid‑Pump Controller ASIC with Current‑Drop Shutoff
It measures 55 × 85 mm and has 4 copper layers, 1.6 mm thick.
52 parts, built around the ESP32-S3-WROOM-1-N4, 1N5819HW-7-F-01, MCP73831T-2ACI/OT-HXY and MIC5219-3.3YM5-TR. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the justinjchae/poko repository on GitHub, at the commit this page was made from: the board is pokodoro/Pokodoro/Pokodoro.kicad_pcb and its schematic pokodoro/Pokodoro/Pokodoro.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask justinjchae before reusing the design.