PaperColor dashboard worker The M5Stack PaperColor firmware GETs /render.json on each wake, interprets the Op[] with M5GFX, draws to the Spectra 6 panel, then deep-sleeps for nextWakeSec. The server owns the cadence. Read endpoints (no auth): GET /render.json[?screen=N] -> contract { ..., ops, screenIndex, screenCount } GET /preview[?screen=N] -> HTML/SVG mockup at 400x600 GET /manage -> HTML/JS UI for managing todos (asks for token) GET /photos -> HTML/JS UI for the photo frame (asks for token) GET /screens -> HTML/JS UI for the screen playlist (asks for token) GET /data -> HTML/JS UI to edit/review data-screen cards (asks for token) GET /todos -> list current todos as JSON GET /screens.json -> the screen playlist as JSON GET /images -> list photo ids as JSON GET /image/:id -> processed JPEG (400×600, from R2) GET /data/:slug -> a pushed card payload as JSON GET /healthz -> ok Write endpoints (require Authorization: Bearer ): POST /todo -> body {"text":"...","id":"optional-stable-id"} DELETE /todo/:id -> remove one DELETE /todos -> clear all PUT /screens -> body {"screens":[...]} (replace the playlist) DELETE /screens -> reset playlist to default POST /image -> raw image body or multipart; processed -> R2 DELETE /image/:id -> remove one photo DELETE /images -> clear all photos PUT /data/:slug -> body {"title?","sections":[{"heading?","items":[...]}]} DELETE /data/:slug -> clear that card