huntsyea / kitchen-frame
git clone https://github.com/huntsyea/kitchen-frame.git
A calm family dashboard for a cheap Android photo frame: calendar, weather, Todoist, recipes, music and agent messages on a Cloudflare Worker. Inspired by Wes Bos's photo-frame-dashboard.
+0
stars, 24h · #40,698
+~0
stars, 7 days · #45,393
+46
stars, 30 days · #14,000
46
★ total
6
forks · 1 open issues
Star history (as recorded here)
LanguageJavaScript
LicenseMIT
Created2026-10-13 (9d ago)
Last pushtoday
Watchers0
OwnerUser
GitHub topics
android-kioskcloudflare-workersdurable-objectsfamily-dashboardhome-assistantphoto-framesveltetodoist
Links
README excerpt
# Photo Frame Dashboard A calm family dashboard for a cheap Android photo frame on the kitchen wall: clock, weather, the family calendar, Todoist tasks and groceries, recipes, music controls, messages from AI agents, and a photo slideshow when nobody's looking. It runs on a ~$50 frame and a Cloudflare Worker. > **Inspired by Wes Bos.** The idea and the overall approach come from Wes Bos's video > Taking over Android photo frames and his repository > wesbos/photo-frame-dashboard, which also > has the device guides for rooting many frame models. This is an independent implementation; > see CREDITS.md. | Calendar (dark, after sunset) | Tasks board | Recipes | | --- | --- | --- | | | | | Screenshots use the built-in demo mode, so all data shown is invented. ## Status Running on a Pastigio FRAME156 (Android 8.1, WebView 106, 1920×1080) in the kitchen. The device record, every change made to it and how to undo each one are in docs/frame.md. The developer wiki is in openwiki/. ## Layout - `dashboard/src/`: the web app (Svelte 5, no SvelteKit). Tabs: Home (clock, weather, today's events, to-dos), Calendar (week and month), Groceries and Tasks (Todoist), Recipes (TheMealDB plus saved recipes) and Music (Home Assistant). After 5 minutes untouched it switches to an idle clock screen. The frame loads it full screen in a kiosk WebView. - `dashboard/worker/`: the Cloudflare Worker that serves the app and its API: merged calendar, weather (Open-Meteo), Todoist lists, the iCloud shared album (photos proxied and cached in KV), recipes (TheMealDB plus saved ones) and agent messages (a Durable Object that pushes them to the frame over a WebSocket). Tokens and links for those services stay on the server. - `docs/research.md`: what we learned from the upstream repo and the video, plus performance constraints. - `kiosk/`: the Android app the frame boots into (one full-screen WebView). `kiosk/build.sh` builds it without Gradle; see `docs/frame.md` for the install and the changes made to our frame. - `reference/photo-frame-dashboard/`: upstream clone, gitignored. Re-create with `git clone https://github.com/wesbos/photo-frame-dashboard reference/photo-frame-dashboard`. ## Run [code] ## Calendar The Worker merges any number of iCal links into one agenda. A cron job refreshes them into KV every 10 minutes, writing KV only when something changed (or hourly), and the page polls every 5. If a feed fails, its last good events stay up. How often the frame polls each feed (`start()` in `src/lib/state.svelte.js`): calendar every 5 minutes, weather every 15, Tasks every minute while the dashboard is up, Groceries every minute only while its tab is open, photos every 5 minutes only while the slideshow is showing photos, and nothing for messages, which are pushed over a WebSocket the moment they're sent (docs/messages.md). A poll waits for the previous one to finish, and unchanged results don't redraw the screen. That's roughly 1,500–2,000 Worker requests a day. The accou