📈 GH Trending Explorer 🎲 Surprise me

← all repos

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)

2026-10-20 · 46 ★ 2026-10-23 · 46 ★
LanguageJavaScript
LicenseMIT
Created2026-10-13 (9d ago)
Last pushtoday
Watchers0
OwnerUser

GitHub topics

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