A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

Categories

  • Announcements regarding the MagicMirror software and forum.

    66 Topics
    427 Posts
    karsten13K
    Release Notes Thanks to: @cgillinger, @khassel, @KristjanESPERANTO, @sonnyb9 ⚠️ This release needs nodejs version >=22.21.1 <23 || >=24 (no change to previous release) Compare to previous Release v2.35.0 This release falls outside the quarterly schedule. We opted for an early release due to: Security fix for the internal cors proxy API change of the weather provider smi Several bug fixes Breaking Changes The cors proxy is now disabled by default. If required, it must be explicitly enabled in the config.js file. See the documentation. ⚠️ Security You can find several publicly accessible MagicMirror² instances. This should never be done. Doing so makes your entire configuration, including secrets and API keys, publicly visible. Furthermore, it allows attackers to target the host; this is only prevented beginning with this release. Public MagicMirror² instances should always run behind a reverse proxy with authentication. [core] Prepare Release 2.36.0 (#4126) Allow HTTPFetcher to pass through 304 responses (#4120) fix(http-fetcher): fall back to reloadInterval after retries exhausted (#4113) config endpoint must handle functions in module configs (#4106) fix replaceSecretPlaceholder (#4104) restrict replaceSecretPlaceholder to cors with allowWhitelist (#4102) fix: prevent crash when config is undefined in socket handler (#4096) fix cors function for alpine linux (#4091) fix(cors): prevent SSRF via DNS rebinding (#4090) add option to disable or restrict cors endpoint (#4087) fix: prevent SSRF via /cors endpoint by blocking private/reserved IPs (#4084) chore: add permissions section to enforce pull-request rules workflow (#4079) update version for develop [dependencies] update dependencies (#4124) chore: update dependencies (#4088) refactor: enable ESLint rule “no-unused-vars” and handle related issues (#4080) [modules/newsfeed] fix(newsfeed): prevent duplicate parse error callback when using pipeline (#4083) [modules/updatenotification] fix(updatenotification): harden git command execution + simplify checkUpdates (#4115) fix(tests): correct import path for git_helper module in updatenotification tests (#4078) [modules/weather] fix(weather): use nearest openmeteo hourly data (#4123) fix(weather): avoid loading state after reconnect (#4121) weather: fix UV index display and add WeatherFlow precipitation (#4108) fix(weather): restore OpenWeatherMap v2.5 support (#4101) fix(weather): use stable instanceId to prevent duplicate fetchers (#4092) SMHI: migrate to SNOW1gv1 API (replace deprecated PMP3gv2) (#4082) [testing] ci(actions): set explicit token permissions (#4114) fix(http_fetcher): use undici.fetch when dispatcher is present (#4097) ci(codeql): also scan develop branch on push and PR (#4086) refactor: replace implicit global config with explicit global.config (#4085)
  • Discuss the MagicMirror² core framework.

    493 Topics
    4k Posts
    S
    @Bungle68 there is no auto update. You can go the manual install/update or use the scripted install/update. For the base. See the doc, alternative install My script are first there There are various mechanisms for modules
  • Anything harware related can be found here.

    797 Topics
    7k Posts
    B
    It’s easy to forget that while OLED is the biggest concern for burn-in, older LCDs can still suffer from image persistence if things stay static for too long. Moving the modules around slightly or using a screen saver script is such a practical way to extend the life of the hardware.
  • Add exciting new features to your mirror.

    6k Topics
    58k Posts
    R
    MMM-PresenceScreenControl — two new releases (ecoMode + Notification API) Dear all a small but meaningful round of updates for MMM-PresenceScreenControl just landed on main. Both started from a single GitHub issue, so I thought I’d write up the chain of reasoning rather than just drop a changelog — maybe useful for anyone evaluating a migration from MMM-Pir, and definitely useful as a reminder to myself to check the parent project’s feature surface more carefully when forking. Part 1 — ecoMode (Issue #5) Rocket78 opened issue #5 with a really well-argued request: even with the screen physically off, Electron keeps repainting hidden DOM. On a Pi 3 with X11, MMM-PresenceScreenControl was leaving things like Newsfeed cross-fades running every 20 seconds — and those repaints showed up clearly as CPU spikes in his graph. He asked for an equivalent of MMM-Pir’s ecoMode, which hides every other module while the screen is off, so the browser skips layout/paint/composite for them. So I built it, but tried to keep it lean: ecoMode: false, // opt-in, default off → no surprise ecoModeIgnore: [] // module names to keep visible Implementation notes that might interest other module authors: Rocket78 also dropped a great ddcutil snippet in the issue for monitors that show a “no signal” splash when the video output is cut — that splash is genuinely immersion-breaking, and ddcutil setvcp D6 sends the actual DDC/CI power command, which is much closer to pressing the hardware power button: onCommand: ddcutil setvcp D6 1 --skip-ddc-checks offCommand: ddcutil setvcp D6 5 --skip-ddc-checks Added to the README’s offCommand examples. The --skip-ddc-checks is needed because some monitors stop responding to DDC queries when powered off but still process incoming power-on commands — so the check would fail before the command is even sent. → Issue #5 closed, commit 42b68a6. Part 2 — what else did I miss? Closing the issue could have been the end of it. But Rocket78’s request raised an uncomfortable question: I never used ecoMode in MMM-Pir myself, so I didn’t notice it was missing. What else did I overlook when reviving MMM-Pir? Three items jumped out as actual gaps that other modules in the ecosystem could legitimately depend on: MMM_PIR-USER_PRESENCE — MMM-Pir broadcasts this notification on presence transitions. Other modules (Remote-Control, voice assistants, smart-home bridges) can listen for it. MMM_PIR-WAKEUP / LOCK / UNLOCK / END — incoming notifications that let other modules control the screen logic externally. MMM_PIR-SCREEN_POWERSTATUS — broadcast when the physical screen turns on or off. Without these, anyone migrating from MMM-Pir to my fork would suddenly find their automations dead — because they’d be listening for MMM_PIR-USER_PRESENCE and nothing was coming through. Even worse, they wouldn’t know why it stopped working; the screen-on/off behavior would seem fine, but cross-module integration would be silently broken. So I built a parallel notification API, namespaced MMM_PSC-* rather than impersonating MMM-Pir’s MMM_PIR-*: Outgoing notifications — emitted on state transitions only: MMM_PSC-USER_PRESENCE payload: true / false fires when combined presence changes MMM_PSC-SCREEN_POWERSTATUS payload: true / false fires when physical screen turns on/off Both fire only on actual transitions — no spam every poll cycle. Incoming notifications — consumed by the module MMM_PSC-WAKEUP wake screen, reset timer (equivalent to a touch) MMM_PSC-END force screen off immediately MMM_PSC-LOCK freeze presence handling — sensors are still tracked internally, but no longer change screen state MMM_PSC-UNLOCK resume normal presence handling and re-evaluate the current sensor state Implementation detail worth flagging: the LOCK guard sits in updatePresence(), which is the single funnel through which all sensor inputs (PIR, MQTT, touch, external wakeup socket) eventually pass. So whatever the trigger source, it’s correctly suppressed while locked. UNLOCK calls updatePresence() again, which re-evaluates the current sensor state — so if you’ve unlocked while a person is still in front of the PIR, the screen comes back on immediately. No need for the caller to send a WAKEUP after UNLOCK. Useful patterns this enables: // Wake the mirror when a doorbell event arrives: this.sendNotification("MMM_PSC-WAKEUP"); // Force-off cleanly from outside (smart-home rule, etc.) without // bypassing the module and going straight to the screen command: this.sendNotification("MMM_PSC-END"); // Take exclusive control of the display for a video call, // then hand it back when done: this.sendNotification("MMM_PSC-LOCK"); // ... your module is showing its full-screen content ... this.sendNotification("MMM_PSC-UNLOCK"); END is the clean way to force-off the screen from outside without touching offCommand directly — the module’s internal state stays consistent, all the right outgoing notifications still fire, and any other listeners (logging, analytics, smart home) see the transition. Tested live end-to-end via MMM-Remote-Control’s notification API: curl -X GET "http://localhost:8080/api/notification/MMM_PSC-LOCK" curl -X GET "http://localhost:8080/api/notification/MMM_PSC-END" → screen off, stays off curl -X GET "http://localhost:8080/api/notification/MMM_PSC-WAKEUP" → ignored (locked) curl -X GET "http://localhost:8080/api/notification/MMM_PSC-UNLOCK" → screen back on All four routes verified, log trace clean, outgoing notifications fired in the right order on every transition. → Commit 10000ca. Update / install If you’re already on the module: cd ~/MagicMirror/modules/MMM-PresenceScreenControl rm -rf node_modules git pull npm install Both changes are backwards-compatible. ecoMode is opt-in (default false), and the new notifications are additive — nothing existing is modified. So you can update without touching your config and pick up only what you need. A genuine thank-you to Rocket78 for the well-reasoned issue and the ddcutil tip — it triggered the full audit, which in turn closed a much bigger latent gap. Exactly the kind of feedback that improves a fork. If you’ve migrated from MMM-Pir and notice anything else missing that you’d consider load-bearing, please open an issue. Hope you find it useful. Warmest regards, Ralf
  • Make your mirror your own but modifying its appearance.

    433 Topics
    3k Posts
    S
    @kkmirr04 that’s ext3 not showing color In the off chance of some module install fluke Delete the Mmm-CalendarExt3 folder Then git clone And npm install in the folder created by clone Then restart MagicMirror
  • Share your project story with pictures.

    577 Topics
    5k Posts
    J
    @mrchips83 Thanks for sharing. Interest is peeked again! Think I’m going to dive back into MM.
  • You have a problem with your mirror? Ask for help.

    5k Topics
    36k Posts
    S
    @sdetweil What’s the procedure to update that module?
  • A place to talk about whatever you want.

    1k Topics
    10k Posts
    mumblebajM
    @miriamburrell If those can be linked to Strava then MMM-Strava can be used. I still use MMM-Strava and it still works fine but I am using Suunto watch connected to Strava and I can then display that via the MMM-Strava module.