Releases: jeremiaa/magic-frame
Release list
v1.1.2 — calendar on displays, lock toggle, friendlier installer
Bug-fix round — three community reports, one installer glow-up.
🛠 Fixed
Google/Microsoft calendar now works on displays (#43) — the calendar feed authenticated through the viewer's browser session, so any wall display rendering the public view showed an empty calendar. Tokens are now resolved server-side from the stored integration — kiosk displays finally get calendar data without a login. (iCal feeds were never affected.) Thanks @kylermurphy for the precise DevTools repro.
Lock entities can now be toggled (#45) — Home Assistant has no lock.toggle, so tapping a lock tile silently did nothing. Taps now resolve the real service from the current state (lock.lock / lock.unlock), tested against a real Nuki.
No-op "background opacity" hidden on Image + Camera (#39) — full-bleed media fills the whole tile, the slider never did anything visible there.
✨ Installer
- The completion summary now shows your LAN address (
http://<your-ip>/editor) instead of a uselesslocalhost— and respects customHTTP_PORTeverywhere, including the health check (which previously polled port 80 blindly on custom-port installs). - The installer restarts itself once when an update replaces it — updating from pre-v1.0.9 versions no longer triggers a pointless from-source build.
- A little colour. ✨
📚 Docs
README restructured (compact with collapsible sections, 13-widget table, Google-Calendar setup tips — secret iCal vs. OAuth on a LAN-only install), Kubernetes manifests now pull the published ghcr images.
📦 Update
cd magic-frame && ./deploy/install.shYour data stays untouched. Rollback any time: set MAGIC_FRAME_VERSION=1.1.1 in .env and re-run.
v1.1.1 — hotfix: images gone after Immich 3.0 upgrade
Small but important hotfix.
🛠 Fixed
No images after upgrading Immich to 3.x — Immich 3.0 removed the assets[] array from the album-detail API response. Both the wallpaper slideshow and the Image widget read exactly that field, so after an Immich upgrade Magic Frame showed no photos at all.
Both now fall back to Immich's metadata search when the new response shape is detected — fully backwards compatible: on Immich ≤ 2.x nothing changes (the old code path still runs), on Immich ≥ 3.0 images, EXIF metadata and portrait/landscape detection all work again.
📦 Update
cd magic-frame && ./deploy/install.shYour data stays untouched.
v1.1.0 — Camera, Stacking, HA-Triggers, Light Mode, Auto-Refresh
A big feature release — much of it requested right here in the community. 🎉
✨ Features
📷 Camera widget (#3) — Show Home Assistant camera entities. Uses a dynamic snapshot route, so it keeps working even when the HA camera API rotates (no hardcoded URL). Fullscreen view, configurable refresh interval + aspect ratio.
🗂 Stacking / overlay widgets (#5) — Place widgets in the same grid cell and control their layering with a drag-sortable layer list in the editor.
🔀 HA-triggered show/hide (#6) — Show or hide widgets straight from Home Assistant, instantly (live, no polling). Two ways:
- Per widget — show only while an entity is in a given state, with an optional auto-hide after N seconds (e.g. the camera pops up when the doorbell rings, then hides again).
- Via a Button "Auto" tab — HA "presses" one of the button's slots, firing that slot's action.
☀️ Editor light mode (#21) — A proper light theme for the editor, canvas/grid included. Toggle in the top bar; defaults to dark.
🔄 Auto-refresh — Per-view refresh timer (off / 1–24 h) in a new View-Settings dialog, plus a Button "refresh" action — both triggerable from Home Assistant. Keeps long-running wall displays fresh.
🎨 Solid-colour background — A view background can now be a single solid colour instead of an image slideshow.
📅 Calendar
- 24h / 12h time-format toggle (auto / 24h / 12h) — #33
- "Show empty days": fixed 3-day agenda with empty-day cards — thanks @mattplate (#36)
- Events that already ended today are now hidden — thanks @mattplate (#35, fixes #34)
🛠 Fixes
- Sensor widget value colour now honours the configured colour (#33)
- Dashboard / Modules pages list all widget types (Image / Sensor / Camera)
📦 Notes
- All new settings are opt-in — existing dashboards upgrade unchanged.
- Update with
./deploy/install.sh(pulls the new image; your data stays untouched).
v1.0.9
Hotfix.
Fixed
- Calendar connection drops after ~1 hour (#32) — the OAuth token refresh read the client credentials only from environment variables, so it failed for anyone who entered them through the UI (where they live in the database). The access token then expired after ~1h and the Google/Microsoft connection dropped, needing a manual reconnect. The refresh now reads the same DB-stored credentials as the initial connect. Affects both Google and Microsoft.
This is the follow-up to the OAuth redirect fix in v1.0.8 (#31).
Updating
cd magic-frame
./deploy/install.shPulls the new pre-built images, leaves your data + secrets untouched. Hard-refresh the browser afterwards (Cmd+Shift+R).
v1.0.8
Maintenance + feature round driven by community issues.
New
- Sensor widget (#20) — multi-sensor value tiles with icons, per-sensor colour, adjustable icon/box size, glass styling (theme · opacity · blur), cards-or-grid layout, and an optional history sparkline. A lightweight companion to the HA Entity widget for at-a-glance readings.
- Per-entity name override on the HA Entity widget (#20) — rename any entity in the widget without touching its
friendly_namein Home Assistant. - Adjustable icon size + frame toggle on the HA Entity and Notification widgets (#20). Defaults reproduce the previous look exactly, so existing dashboards are unchanged.
Fixed
- Button service data (#30) — HA service calls now accept parameters like
{"brightness":128},{"value":1},{"temperature":21}. Previously onlydomain.servicewas sent, so services needing data did nothing. - WebDAV wallpapers (#29) — images now load on every view (not only the first dashboard), and a URL entered without
http://is handled gracefully. - Editor grid bounds (#28) — widgets can no longer be dragged off the bottom and lost; they stay within the visible grid (and reach the bottom edge on views without a metadata bar).
- Calendar OAuth behind a reverse proxy (#31) — Google/Microsoft sign-in now uses the external host for its redirect instead of
localhost:3000. If your proxy doesn't forward the host header, setAPP_BASE_URLin.env(it wins over auto-detection). - Empty views (#27) — a view you deliberately cleared no longer resurrects the default clock/weather/calendar widgets.
- Image widget's "Immich not configured" message now shows in English.
Updating
cd magic-frame
./deploy/install.shIdempotent — pulls the latest code, rebuilds the containers, and leaves your .env, database and uploaded modules untouched. Hard-refresh the browser afterwards (Cmd+Shift+R) — Next.js and the browser both cache aggressively.
v1.0.7
Community feedback round — Immich slideshows, wallpaper display controls, and a batch of fixes.
Features
- Image widget (#16) — play an Immich album as a slideshow inside a widget (crossfade, fit modes, rounded corners). Uses a global Immich connection, overridable per view.
- Wallpaper display options (#17) — fit modes (fill / fit / stretch / center), image position, transition duration, Ken Burns intensity.
- Wallpaper split-view — auto-pairs two portrait photos side by side, or fixed 2 / 2×2 grids, for mixed-orientation albums.
- Immich wallpaper sources — favorites and memories, not just albums.
- Global Immich connection — set once in Settings → Integrations, override per view/widget.
Fixes
- #19 Shopping & Todo lists were empty with a Home Assistant source → now read via
todo.get_items. - #22 Trigger-entity dropdown didn't show all entities (sensor.* fell off) → raised cap + prefix-ranked matches.
- #23 Trigger-entity dropdown truncated friendly names → stacked layout, both fully readable.
- List item cards no longer clipped at the top when the title bar is hidden.
- Immich image proxy now uses the resolved per-view/global key.
Editor light mode (#21) was attempted but pulled for now — the quick version wasn't readable enough; it'll be done properly in a later release.
Updating
cd magic-frame
./deploy/install.shIdempotent — pulls the latest code, rebuilds the containers, and leaves your .env, database and uploaded modules untouched. Hard-refresh the browser afterwards (Cmd+Shift+R) — Next.js and the browser both cache aggressively.
Magic Frame v1.0.6
Magic Frame v1.0.6
🔴 Critical fix — Todoist integration restored
Todoist sunset their old REST v2 API (it now returns 410 Gone), which broke the Todoist integration for everyone — no token could connect. This release migrates the client to Todoist's new unified API v1. Listing projects, reading/creating/completing tasks all work again.
If you use Todoist, please update. Thanks @ranjitrajkumar for the report (#12).
✨ Improvements
- Customizable list widgets — rename the header, hide the title bar, or hide just the count (Todo + Shopping).
- Markdown renders in Todoist tasks — bold/italic/links instead of raw
**asterisks**and long tracking URLs. - Configurable host ports via
.env(HTTP_PORT/HTTPS_PORT, default 80/443) — run behind your own reverse proxy without editing compose. Survives updates. (#11)
Update
```
cd magic-frame && git pull && ./deploy/install.sh
```
Your .env, database and uploaded modules stay untouched.
v1.0.5 — Button show/hide fix + per-button visibility
Fixes
Button show/hide / toggle now works on every view
A button's show / hide / toggle links are stored as widget ids, and widget ids get rewritten on save (prefixed with the view id) and on duplicate / rename (suffixed). None of those rewrites carried the button's stored references along — so a button configured in the editor pointed at widget ids that no longer existed the moment the view was saved, and its show/hide silently did nothing. This hit freshly created views and every duplicated/renamed view.
The references are now rewritten everywhere widget ids change. Older layouts self-heal on the next save (an unprefixed orphan maps cleanly onto the now-prefixed widget when it's still in the view). If a button still shows nothing after updating, open it in the editor and save once.
Improvements
Per-button visibility toggle
The Button widget has 4 slots. Each now has a Show this button toggle in its tab — turn it off to drop that slot from the rendered widget while keeping its configuration intact, so you can show just one (or any subset). Empty slots still hide automatically; a hint flags a slot that needs an icon or label to appear.
Changes since v1.0.4
fix(buttons): keep show/hide links working after save, duplicate & renamefeat(buttons): per-slot visibility toggle
Update
cd ~/magic-frame && git pull && docker compose up -d --build
v1.0.4 — Widget titles always localise
Fixes
Widget titles no longer show German on an English display (issue #7)
Reported by the community: widget titles like "Uhr", "Wetter", "Einkaufsliste" and "Nachrichten" stayed German even with the app set to English. The German label was baked into the saved layout (and re-injected server-side when empty), so any render path that didn't localise it leaked German.
Widget titles are now derived from the widget type and localised at render. New widgets store no hard-coded label; existing dashboards with German default labels are recognised and localised automatically — no migration, nothing to re-save. Custom labels you set yourself are untouched, and widget-linking (show/hide buttons) is unaffected since it targets widgets by id, not by label.
If you set a German default label install-wide, German displays still read German — only the "stuck in German on an English screen" case is fixed.
Changes since v1.0.3
fix(i18n): derive widget titles from type so they always localise (#7)fix(views)/fix(inspector): localise widget labels in the editor canvas, inspector header and mobile editordocs: add ROADMAP, refresh README screenshots
Update
cd ~/magic-frame && git pull && docker compose up -d --build
If git pull reports divergent branches or clobbered tags (only clones from before v1.0.2), re-run the installer — it auto-recovers:
curl -fsSL https://raw.githubusercontent.com/jeremiaa/magic-frame/main/deploy/install.sh | sudo bash
v1.0.3 — Smoother Tizen wallpapers, en-US default, manual clock format
Highlights
Smoother wallpaper transitions on Tizen / Samsung TV browsers
Kitchen-monitor and other Tizen-based displays kept hard-cutting between wallpapers. This release locks in a five-point fix: GPU layer promotion via translate3d, preload-before-swap with a detached new Image(), both crossfade slots mounted from the start, no fallback flash from the engine while the real config is still loading, and a localStorage cache of the wallpaper config so reload is instant from the second visit on. No regressions on Chrome / Firefox / Safari, image quality + dimensions stay 1:1 (no resize pipeline).
English locale now defaults to en-US format
12-hour time with AM/PM and "Tue, May 27" dates everywhere (Clock, Weather, Calendar, Immich + WebDAV wallpaper captions). Was en-GB before — UK format on every English install. You can still pick en-GB explicitly per Clock widget.
Manual time / date format override on the Clock widget
New per-widget pickers in the inspector — like Celsius / Fahrenheit on Weather. Defaults stay "auto" (follow the app locale) but you can pin 12h / 24h and de-DE / en-US / en-GB independently. Useful for mixed-language households.
TimezonePicker with autocomplete
Replaces the free-text "Europe/Berlin" input that was prone to typos (a stray paren could break time rendering). Filters on the city name first ("ber" → Berlin), keyboard nav, sanitised input. Same picker used for worldclock extra-timezone entries.
Changes since v1.0.2
fix(wallpaper): smooth crossfades on Tizen / Samsung TV browserfix(i18n): use en-US format for English locale (12h, US date)feat(clock): manual time/date format + TimezonePicker autocomplete
Update
Normal way:
cd ~/magic-frame && git pull && docker compose up -d --build
If git pull complains about divergent branches or clobbered tags (only affects clones from before v1.0.2), re-run the install script — it auto-recovers:
curl -fsSL https://raw.githubusercontent.com/jeremiaa/magic-frame/main/deploy/install.sh | sudo bash