E‑Paper Agent Console
Desk display for agent status + hold-to-talk dumps — the “broadcast console” pattern applied to HEOS / Arthur
← Cyborg wave hub · Shopping list · Principles · Character path · M5 path
Status: planning / field notes — not built yet on this desk.
Source post: Vinny (@hot_town) — ESP32 radio station console (~$55)
What this path is
A Wi‑Fi ESP32 board with e‑paper (and often onboard mics) that:
- Polls a tiny API every N seconds and draws a simple “console” UI
- On hold-to-talk: records audio → uploads → server transcribes → posts to chat / agent inbox
- Runs on battery as a standalone desk object
Vinny built it for an online radio station (live stats + owner chat pin).
Our remapping: HEOS / agent status on the screen; dumps go to arthur.agent (or Janice), not radio chat.
What this path is not
- Not a full product character shell (see character path)
- Not the lowest-friction unbox experience (see M5 path)
- Not on-device LLM inference — board is I/O; brain stays in the cloud / your agents
Their stack (from the post)
| Part | What they used |
|---|---|
| Board | Waveshare ESP32-S3 1.54" e‑Paper AIoT (~$30) — Wi‑Fi, mics, speaker, battery charge |
| Battery | 3.7V 500mAh LiPo (~$10) |
| Connectors | JST 1.25 adapters (bulk pack) |
| Display loop | Poll radio API every ~20s → 200×200 e‑paper “broadcast console” |
| Voice loop | Hold-to-talk → WAV upload → OpenAI transcription → websocket chat (API-key as owner) |
| Backend | Wasp (React/Node/Prisma) on Railway — /status, /chat, /voice-chat |
| Firmware | PlatformIO + Arduino, GxEPD2, Waveshare ES8311 codec drivers |
| Build help | Claude for endpoints + firmware; e‑paper UI mockups as Claude artifacts |
Our version (HEOS / agents)
| Their job | Our job |
|---|---|
| Radio live stats UI | TODAY Big 3 + Arthur/Janice status (working / needs review / idle) |
| Station chat message | Mental fog / code dump → HEOS inbox → Arthur sorts |
| Owner pin via API key | Device API key scoped to “dump only” — no email send, no spend |
| Wasp radio app | 3 tiny endpoints in front of HEOS / existing agent harness |
Matches the backlog on /cyborg: desk ESP32 for Big 3 + one button → agent.
Parts list (order)
Full carts + product links: Cart A on /cyborg-shopping.
| Priority | Item | Exact search / name | Why |
|---|---|---|---|
| P0 | Main board | Waveshare ESP32-S3-ePaper-1.54 AIoT (~$30) | E‑paper + mic + codec + charge on one board |
| P0 | USB‑C (data) | Not charge-only | Flash + serial |
| P1 | Battery | 3.7V LiPo ~500mAh, match JST 1.25 if required | Untethered desk |
| P1 | JST adapters | Only if battery plug ≠ board | Avoid forcing wrong connector |
| P2 | microSD FAT32 | Any small TF card | Optional audio/log storage |
Official product page: waveshare.com/esp32-s3-epaper-1.54 · docs: docs.waveshare.com
Tiny API contract
| Endpoint | Job |
|---|---|
GET /status | JSON for e‑paper: Big 3 lines, agent states, last dump time |
POST /voice-in | Multipart WAV/PCM + device key → transcribe → HEOS inbox / Arthur |
POST /chat (optional) | Text-only dump if mic path fails |
Host anywhere boring: Railway, Fly, Netlify functions, or a route on an app you already run. Device auth = long random key in firmware secrets, not a full user session.
Tutorial ladder
- Tooling: PlatformIO (or Arduino IDE) — flash blink / serial hello on the board
- Wi‑Fi: join network,
HTTPClientGET to a public JSON URL - Display: draw 3 lines of text with GxEPD2 (or board sample sketch)
- Status: point GET at your stub
/status(hardcoded JSON is fine) - Button: hold-to-talk GPIO → LED or serial “recording”
- Mic: short WAV/PCM buffer → POST to laptop endpoint first
- Transcribe: OpenAI Whisper (or equivalent) on server → log text
- Vault: append markdown / HEOS inbox entry; only then pretty UI
- Battery: sleep between polls; last, not first
UI pro tip (from the thread): ask Claude/Grok for 5–10 e‑paper UI mockups at 200×200 (or your resolution) before writing firmware layout code. Artifact mockups beat guessing pixels.
Skills & docs to follow
- PlatformIO ESP32 docs + board vendor Arduino samples
- GxEPD2 (or Waveshare e‑paper examples) for partial/full refresh tradeoffs
- Waveshare ES8311 / codec examples if using their AIoT board mics
- OpenAI (or other) audio transcription API docs for the server side
- Your own agent handoff: reverse prompting, mental fog, HEOS
Design rules (from cyborg principles)
- One job: display status + capture dump — not email, not calendar write-all
- Write to vault: transcription must land somewhere durable
- Blast radius: device key can only create dumps / read status
- Named agent: default dump target is
arthur.agent, not “AI”
First ship definition
Done when:
- E‑paper shows 3 lines from live
/status - One hold-to-talk produces a text file or HEOS note you can open on the laptop
- No speaker/TTS required for v1
Comments
Approved comments appear below. Log in once with GFAVIP — it applies across the whole site. GFAVIP login
View comments archive