Hey everyone,
I'm launching Magic Frame v1.0, an open-source self-hosted dashboard for the displays in your home — wall-mounted monitors, kitchen panels, picture frames, old TVs. It treats Home Assistant as a first-class citizen, not as an afterthought, and the same display can switch between smart-home dashboard mode and a real picture frame fed by your Immich albums.
Why I built it
We have a portrait monitor mounted on the wall in the kitchen as our family board (shopping list, calendar, weather, who needs to feed the cat). I wanted two things baked into one display:
- Real HA integration — not iframe hacks, not screenshots, but actual live entities and direct service calls. The HA frontend works great in a browser, but it doesn't feel right as a family board sitting on the wall all day.
- A real home for my Immich photos — I have ~30k photos sitting on my self-hosted Immich, and the only ways to display them on a screen at home all involved either piping them through someone else's cloud (DAKboard etc.) or running a separate slideshow app with no overlays.
Magic Frame combines both. Same display does smart-home dashboard during family hours and rotates through your Immich album as a real picture frame the rest of the time.
Home Assistant integration
What I felt was always half-baked in other dashboards:
- Live entity updates via WebSocket (no polling)
- Buttons that call HA services and webhooks directly — tap = service call
- Notification tiles with rule-based auto-show / auto-hide. Example:
light.washing_machineturns on → tile "Washing machine done" pops up, tap to dismiss → tile hides until rule fires again. Same pattern for "feed the cat", dryer done, motion alerts - Shopping & Todo widgets that read & write
todo.*entities — what you tick off on the wall is gone from HA too, and vice versa - Color & icon rules per entity state — door sensor green/closed, red/open; lights show actual brightness as a tile gradient
- Multi-instance support if you run several HAs
Picture-frame mode (Immich + WebDAV)
The same display can fade all HA entities away and just rotate wallpapers — tap a toggle button → dashboard is back. The photo source is the interesting part for self-hosters:
- Direct connection to your Immich instance — drop in the Immich URL + an API key in Settings → Integrations, photos never leave your home network, no cloud relay, no third-party account
- Per-view album picking — the kitchen monitor rotates "Family", the bedroom tablet shows "Travel", the living-room TV cycles "Landscape Photography". Each view binds to its own Immich album
- Auto-pickup of new photos — add a photo to the album in Immich today, it shows up on the displays automatically
- WebDAV folder support too — works with Nextcloud, Seafile, or any plain WebDAV source
- Smooth crossfade transitions, configurable rotation interval
So the same tablet that shows "Washing machine done" notifications at 9pm becomes a picture frame with last summer's vacation photos at 3am. No re-config, just a toggle.
Editor & layouts
- Drag-&-drop editor on a 24-column grid — no YAML, no CSS tweaking
- Multiple views, each with its own URL — portrait for the kitchen monitor, landscape for the living-room TV, picture-frame style for the side-table tablet
- Live sync via WebSocket — change a widget on your laptop, every connected display updates instantly
- Auto-snapshot before every save (last 20 kept) + manual export/import
10 core widgets
Clock · Weather (Open-Meteo / DWD / OpenWeatherMap / HA entity) · Calendar (iCal + Google + MS365 OAuth) · HA-Entities · HA-Notifications · Buttons · Timer · Quick-Post via REST/iOS Shortcut · Shopping · Todos
Custom widgets
Upload a JS bundle through the UI — hot-loaded, no container restart. Manifest defines fields (text/number/boolean/color/url). Example module included in the repo.
Optional hosting layer
For when you want to reach it from outside: Caddy reverse proxy + auto-HTTPS via Let's Encrypt · 10 DNS providers built in for ACME DNS-01 · DDNS updater (Cloudflare/Hetzner/DynDNS-v2) · 2FA TOTP + recovery codes · in-app brute-force protection. All off by default — pure LAN works out of the box.
Install
Docker Compose stack (Next.js 15 + Postgres 16 + Caddy 2). Two commands on any Linux box (Pi 4/5, NAS, NUC, old laptop):
curl -fsSL https://get.docker.com | sh
curl -fsSL https://raw.githubusercontent.com/jeremiaa/magic-frame/main/deploy/install.sh | bash
Then http://<server-ip>/login → admin setup → Integrations → drop in your HA URL + Long-Lived Access Token (and Immich URL + API key if you want photo wallpapers) → entities show up.
Repo + Docs
Full README has more screenshots, a demo video, custom-module dev docs, a Troubleshooting section, and the iOS-Shortcut/REST-API reference for the companion endpoints.
What I'd love to hear
This is v1.0 and I'm just getting started. Especially curious:
- What HA-specific widgets or behaviors are still missing for you in dashboards like this?
- For people running family boards or wall displays — what's annoying in your current setup?
- For Immich users — would "tablet as a real picture frame fed by Immich albums" be useful for you, or do you already have a setup you like?
- Any feedback on the install / first-run flow?
Honest disclosure: I'm new to OSS — this is my first real project. I built it pair-programming with Claude as a coding assistant. Architecture, features and UX decisions are mine; implementation is AI-generated and reviewed by me. License is Polyform Noncommercial — free for personal/household/club/NGO/school use.


