
Overview
Inkwell is an always-on e-paper dashboard for the desk — a 7.5" e-ink panel that wakes every few seconds, pulls a freshly rendered 800×480 image from a single endpoint, and paints the day in black and white. There is no app on the device and no UI framework anywhere: a FastAPI service fans out to weather, Todoist, market, flight, and calendar sources, then draws the entire screen pixel by pixel with Pillow — dithered patterns instead of greys, hand-placed type instead of CSS. Todos, reading progress, a live overhead-flight map, NSE/BSE movers, air quality, a monthly calendar, a daily quote, and a rotating photo all share one glanceable layout, backed by DynamoDB and S3 with JWT-scoped device tokens and a TTL cache that keeps upstream APIs from ever seeing the refresh rate.
Key features
- Server-Rendered E-Paper: The display is a dumb client — it fetches one BMP from
/display/{id}/dashboardon a timer and draws it. Every layout change ships from the server with zero firmware updates. - 1-Bit by Design: The whole dashboard is composed directly in PIL mode
1at 800×480, using bar, dot, and cross-hatch fill patterns to fake tone, and bundled DejaVu faces so rendering is byte-identical on macOS and Linux. - Live Flight Radar: An OpenSky feed of aircraft overhead is plotted onto a real-tile map dithered down to pure black and white, with the home location and each flight marked and labelled by callsign.
- Day at a Glance: Todoist tasks, in-progress books with reading percentages, the month calendar with today highlighted, OpenWeatherMap conditions, AQI, top NSE/BSE gainers and losers, and a daily quote — all sized to stay legible from across the room.
- Photo Rotation: Uploaded photos are auto-contrasted, Floyd–Steinberg dithered, and cycled through the dashboard's feature slot, stored in S3 with per-display assignment.
- Fail-Soft Composition: Every data source is independently guarded and TTL-cached (30s flights, 5m markets, 60m weather) — a dead upstream degrades one tile instead of blanking the screen, and the panel always gets a valid frame.
- Two-Tier Auth: Firebase tokens for humans managing displays and photos; long-lived signed JWTs for the devices themselves, with last-sync heartbeats recorded per panel in DynamoDB.
Links
Share