Skip to content

Releases: jeremiaa/magic-frame

v1.1.2 — calendar on displays, lock toggle, friendlier installer

Choose a tag to compare

@jeremiaa jeremiaa released this 06 Jul 13:12

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. ⚠️ Small behaviour note: if you had configured a tap action on a lock notification tile, it now actually fires — it did nothing before. Thanks @adamasc + cbrewer for the reports.

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 useless localhost — and respects custom HTTP_PORT everywhere, 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.sh

Your 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

Choose a tag to compare

@jeremiaa jeremiaa released this 03 Jul 09:16

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.sh

Your data stays untouched.

v1.1.0 — Camera, Stacking, HA-Triggers, Light Mode, Auto-Refresh

Choose a tag to compare

@jeremiaa jeremiaa released this 17 Jun 13:45

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

Choose a tag to compare

@jeremiaa jeremiaa released this 14 Jun 15:41

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.sh

Pulls the new pre-built images, leaves your data + secrets untouched. Hard-refresh the browser afterwards (Cmd+Shift+R).

v1.0.8

Choose a tag to compare

@jeremiaa jeremiaa released this 14 Jun 09:31

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_name in 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 only domain.service was 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, set APP_BASE_URL in .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.sh

Idempotent — 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

Choose a tag to compare

@jeremiaa jeremiaa released this 05 Jun 08:30

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.sh

Idempotent — 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

Choose a tag to compare

@jeremiaa jeremiaa released this 02 Jun 11:31

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

Choose a tag to compare

@jeremiaa jeremiaa released this 29 May 07:49

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 & rename
  • feat(buttons): per-slot visibility toggle

Update

cd ~/magic-frame && git pull && docker compose up -d --build

v1.0.4 — Widget titles always localise

Choose a tag to compare

@jeremiaa jeremiaa released this 29 May 06:59

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 editor
  • docs: 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

Choose a tag to compare

@jeremiaa jeremiaa released this 27 May 21:23

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 browser
  • fix(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