A pager-style AI device that connects to OpenClaw via Telegram. Captures images and voice, sends queries to Claude, displays condensed responses on a 0.96" OLED.
| Component | Detail | Status |
|---|---|---|
| MCU | ESP32 (with camera + mic) | Have |
| Display | 0.96" OLED 128x64, SSD1306, I2C, yellow-blue split (Great Bobot module w/ 4 buttons) | Confirmed |
| Audio output | Soberton WT-1209T piezo transducer (passive, 12mm) | Have |
| Battery | TBD capacity | Have |
| Buttons | 4 on-board buttons (K1-K4 on the OLED module PCB) | Have |
- Resolution: 128x64 monochrome
- Controller: SSD1306
- Interface: I2C (GND, VCC, SCL, SDA)
- Color zones: Top 16 rows = yellow, Bottom 48 rows = blue
- Text budget: 21 chars/line x 5 lines (6x8 font) = ~105 chars/screen
- Library: U8g2 (not LVGL — overkill for monochrome)
- Yellow zone: Status bar (time, signal, battery) — 16px
- Blue zone: Content area — 48px (~5 lines of text)
| Button | Press | Long Press |
|---|---|---|
| UP | Scroll up / previous item | Jump to previous date |
| DOWN | Scroll down / next item | Jump to next date |
| CAPTURE | Take photo and send | Hold to record voice -> transcribe -> send |
| SELECT | Open / confirm / drill in | Back / exit current view |
[ESP32 Pager] --WiFi--> [Telegram Bot API] <---> [OpenClaw on Mac/Server]
|
[Claude API]
Every Claude response produces two versions:
- Full response -> posted to main Telegram chat (read on phone)
- Condensed display version -> routed to pager channel (ESP32 reads this)
Second-stage compression via cheap/fast model, or structured output from Claude.
Leading option: U8g2 (monochrome display library)
- Best font selection for SSD1306 OLEDs
- Tiny memory footprint (~1KB framebuffer for 128x64)
- Hardware I2C support for ESP32
- Hundreds of built-in fonts at all sizes
Architecture reference: Sentry Alert TX-1 ("Beeper OS")
- Screen stack (push/pop), InputRouter, dirty tracking patterns
- Adapt for our hardware: swap TFT_eSPI for U8g2, MQTT for Telegram
- https://github.com/KyleTryon/sentry-alert-tx-1
- Home/Idle — clock, battery, signal strength, message count
- Message List — chronological, one line per message, date dividers inline
- Message Detail — full condensed text, scrollable
- Capturing — camera/recording feedback
- Sending/Loading — progress indicator while waiting for Claude
- Connection Error — WiFi/Telegram status, retry countdown
Pebble-style window stack (push/pop):
- SELECT pushes a new screen (drill in)
- BACK pops the current screen (go back)
- UP/DOWN navigate within the current screen
- 2 levels max: List -> Detail (not 3-level folder structure)
| Project | What to take from it | Link |
|---|---|---|
| Sentry Alert TX-1 | Screen management, button handling, buzzer, sleep | https://github.com/KyleTryon/sentry-alert-tx-1 |
| Meshtastic device-ui | LVGL chat panel, scroll containers | https://github.com/meshtastic/device-ui |
| MeshCore-Cardputer-ADV | Chat bubble rendering, themes | https://github.com/Stachugit/MeshCore-Cardputer-ADV |
| Pebble SDK | Window stack architecture, card pattern | https://developer.rebble.io |
| Flipper Zero | SceneManager pattern, state per scene | https://github.com/jamisonderek/flipper-zero-tutorials/wiki/User-Interface |
| OpenCharm | BLE bridge, Claude bridge, transcriber foundations | https://github.com/kickingkeys/opencharm |
- Wokwi (wokwi.com) — browser ESP32 simulator with TFT rendering
- LVGL PC Simulator — run LVGL on Mac via SDL, 240x240
- EEZ Studio — free drag-and-drop LVGL screen designer
- No voice activation / wake word (tried, didn't work)
- Push-to-talk via CAPTURE long press -> record -> transcribe -> send as text
- Transcription via MLX Whisper (from OpenCharm pipeline)