# MagicMirror changelog > MagicMirror² is an open source modular smart mirror platform. With a growing list of installable modules, the MagicMirror² allows you to convert your hallway or bathroom mirror into your personal assistant. - Vendor: MagicMirrorOrg - Category: Developer Tools - Official site: https://magicmirror.builders/ - Tracked by: What's New (https://whatsnew.fyi/product/magicmirror) - Harvested from: GitHub (MagicMirrorOrg/MagicMirror) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### v2.37.0 - Date: 2026-07-01 - Version: v2.37.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.37.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.37.0 - **fixed** — map IPv6 :: wildcard to localhost in electron - **fixed** — prevent unauthorized secret expansion in socket payloads - **fixed** — modules losing data after HTTP 304 responses - **fixed** — enforce ipWhitelist for Socket.IO - **added** — include Git hash and branch in system information log - **added** — support object-based electronSwitches - **fixed** — systeminformation thread not ending - **changed** — use ES module imports in browser core - **removed** — old Object.assign polyfill - **changed** — rewrite Module as an ES6 class - **changed** — rewrite NodeHelper as an ES6 class - **changed** — update electron to v42 - **removed** — ajv dependency - **fixed** — output right used node version from parent process in systeminformation - **fixed** — skip postinstall git clean when not in a git repository - **changed** — update dependencies to node v26 - **fixed** — resolve CodeQL alerts in alert module - **changed** — pre-filter ICS data before parsing in calendar - **changed** — use async ICS parsing to avoid blocking event loop in calendar - **added** — add allowBasicHtmlTags option for basic emphasis in newsfeed ##### Release Notes Thanks to: @angeldeejay, @egeekial, @khassel, @KristjanESPERANTO, @MikeBishop, @rejas > ⚠️ This release needs nodejs version >=22.22.2 <23 || >=24 (no change to previous release) [Compare to previous Release v2.36.0](https://github.com/MagicMirrorOrg/MagicMirror/compare/v2.36.0...v2.37.0) ###### [core] - Prepare Release 2.37.0 (#4193) - fix(electron): map IPv6 :: wildcard to localhost (#4188) - refactor(main): modernize DOM update flow with async/await (#4186) - refactor(main): simplify _updateDom with async/await (#4185) - fix(security): prevent unauthorized secret expansion in socket payloads (#4184) - refactor(main): simplify updateDomWithContent async flow (#4182) - fix: modules losing data after HTTP 304 responses (#4180) - chore: add missing core defaults (#4181) - fix(server): enforce ipWhitelist for Socket.IO too (#4169) - feat(systeminfo): include Git hash and branch in system information log (#4167) - feat(electron): support object-based electronSwitches (#4161) - systeminformation thread not ending: move error handling from utils to app (#4160) - fix systeminformation thread not ending (#4155) - refactor: use ES module imports in browser core (#4158) - refactor(core): remove old Object.assign polyfill (#4157) - refactor: rewrite Module as an ES6 class (#4151) - refactor: rewrite NodeHelper as an ES6 class (#4147) - update eletron to v42 (#4144) - refactor(utils): drop ajv dependency (#4142) - fix(systeminformation): output right 'used node' version (from parent process) (#4141) - fix: skip postinstall git clean when not in a git repository (#4139) - Remove unnecessary conditionals and fix falsy property check in imperial conversion (#4135) - update version in package.json ###### [dependencies] - update dependencies (#4191) - Bump actions/checkout from 6 to 7 (#4190) - chore: update dependencies and adjust import path for SunCalc (#4189) - update dependencies incl. electron and revert yauzl-electron-install-fix (#4183) - update dependencies, add electron fix in package.json (#4175) - chore: update dependencies (#4162) - Bump actions/dependency-review-action from 4 to 5 (#4152) - Unify linting: replace Stylelint and markdownlint with ESLint (#4148) - update dependencies and workflows to node v26 (#4140) ###### [modules/alert] - CodeQL cleanup for alerts #18, #19, #20 (#4153) - fix: resolve CodeQL alerts #24 and #26 (#4145) - fix(electron): resolve CodeQL alerts #22 and #25 in electron.js (#4136) ###### [modules/calendar] - perf(calendar): pre-filter ICS data before parsing (#4168) - perf(calendar): use async ICS parsing to avoid blocking event loop (#4143) ###### [modules/newsfeed] - [newsfeed] add allowBasicHtmlTags option for basic emphasis (#4176) ###### [modules/updatenotification] - fix(updatenotification): don't spawn a child process when running under PM2 (#4166) - fix(updatenotification): use process.argv[0] as restart binary (#4163) - fix(updatenotification): preserve start mode on restart (#4156) - fix(updatenotification): fix ref diff parsing for fetch --dry-run (#4138) - refactor(updatenotification): replace pm2 usage with node logic (#4134) ###### [modules/weather] - feat(weather): add Buienradar provider (#4164) ###### [testing] - remove warning in unit tests (for nodejs >= v25) (#4149) - polish HTTP 304 docs/test/handling (#4129) ### v2.36.0 - Date: 2026-04-30 - Version: v2.36.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.36.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.36.0 - **security** — Disable cors proxy by default and require explicit enablement in config.js - **security** — Prevent SSRF attacks via DNS rebinding in cors endpoint - **security** — Block private and reserved IP addresses from being accessed through the /cors endpoint - **security** — Restrict replaceSecretPlaceholder function to cors with allowWhitelist - **changed** — Allow HTTPFetcher to pass through 304 responses - **fixed** — Fix http-fetcher to fall back to reloadInterval after retries exhausted - **fixed** — Fix config endpoint to handle functions in module configs - **fixed** — Fix replaceSecretPlaceholder function - **fixed** — Prevent crash when config is undefined in socket handler - **fixed** — Fix cors function for alpine linux - **added** — Add option to disable or restrict cors endpoint - **fixed** — Prevent duplicate parse error callback in newsfeed module when using pipeline - **fixed** — Harden git command execution and simplify checkUpdates in updatenotification module - **fixed** — Fix weather module to use nearest openmeteo hourly data - **fixed** — Fix weather module to avoid loading state after reconnect - **fixed** — Fix UV index display in weather module and add WeatherFlow precipitation - **fixed** — Restore OpenWeatherMap v2.5 support in weather module - **fixed** — Fix weather module to use stable instanceId to prevent duplicate fetchers - **changed** — Migrate SMHI weather provider to SNOW1gv1 API replacing deprecated PMP3gv2 ##### 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](https://github.com/MagicMirrorOrg/MagicMirror/compare/v2.35.0...v2.36.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](https://docs.magicmirror.builders/configuration/cors.html). ###### ⚠️ 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) ### v2.35.0 - Date: 2026-04-01 - Version: v2.35.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.35.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.35.0 - **changed** — Simplify internal require() calls - **added** — Allow environment variables in CORS URLs - **fixed** — Fix CORS proxy getting binary data (e.g. png, webp) - **fixed** — Correct secret redaction and optimize loadConfig - **changed** — Change loading config.js to allow variables in config.js and protect sensitive data - **removed** — Remove kioskmode - **added** — Add dark theme logo - **changed** — Move custom.css from css to config - **changed** — Move default modules from /modules/default to /defaultmodules - **fixed** — Fix systeminformation not displaying electron version - **changed** — Update node-ical and support its rrule-temporal changes - **changed** — Change default start scripts from X11 to Wayland - **changed** — Unify favicon for index.html and Electron - **changed** — Run systeminformation in subprocess so the info is always displayed - **changed** — Update electron to v41 - **fixed** — Fix calendar showEnd behavior to be more consistent across time formats - **fixed** — Fix calendar full-day recurrence lookup with node-ical 0.23.1 - **fixed** — Correct day-of-week for full-day recurring events across all timezones - **fixed** — Fix newsfeed full article view and add framing check - **fixed** — Fix openmeteo forecast stuck in the past - **fixed** — Fix weathergov forecast day labels off by one - **added** — Add Weather API Provider for weather module - **changed** — Migrate weather module to server-side providers with centralized HTTPFetcher ##### Release Notes Thanks to: @angeldeejay, @in-voker, @JHWelch, @khassel, @KristjanESPERANTO, @rejas, @sdetweil > ⚠️ This release needs nodejs version >=22.21.1 <23 || >=24 (no change to previous release) [Compare to previous Release v2.34.0](https://github.com/MagicMirrorOrg/MagicMirror/compare/v2.34.0...v2.35.0) > ⚠️ We introduced some internal changes with this release, please read [this forum post](https://forum.magicmirror.builders/topic/20138/upcoming-release-april-1-2026-breaking-changes-some-operational-changes) before upgrading! ###### [core] - Prepare Release 2.35.0 (#4071) - docs: add security policy and vulnerability reporting guidelines (#4069) - refactor: simplify internal `require()` calls (#4056) - allow environment variables in cors urls (#4033) - fix cors proxy getting binary data (e.g. png, webp) (#4030) - fix: correct secret redaction and optimize loadConfig (#4031) - change loading config.js, allow variables in config.js and try to protect sensitive data (#4029) - remove kioskmode (#4027) - Add dark theme logo (#4026) - move custom.css from css to config (#4020) - move default modules from /modules/default to /defaultmodules (#4019) - update node versions in workflows (#4018) - [core] refactor: extract and centralize HTTP fetcher (#4016) - fix systeminformation not displaying electron version (#4012) - Update node-ical and support it's rrule-temporal changes (#4010) - Change default start scripts from X11 to Wayland (#4011) - refactor: unify favicon for index.html and Electron (#4006) - [core] run systeminformation in subprocess so the info is always displayed (#4002) - set next release dev number (#4000) ###### [dependencies] - update dependencies (#4068) - update dependencies incl. electron to v41 (#4058) - chore: upgrade ESLint to v10 and fix newly surfaced issues (#4057) - chore: update ESLint and plugins, simplify config, apply new rules (#4052) - chore: update dependencies + add exports, files, and sideEffects fields to package.json (#4040) - [core] refactor: enable ESLint rule require-await and handle detected issues (#4038) - Update node-ical and other deps (#4025) - chore: update dependencies (#4021) - chore(eslint): migrate from eslint-plugin-vitest to @vitest/eslint-plugin and run rules only on test files (#4014) - Update deps as requested by dependabot (#4008) - update Collaboration.md and dependencies (#4001) ###### [logging] - refactor: further logger clean-up (#4050) - Fix Node.js v25 logging prefix and modernize logger (#4049) ###### [modules/calendar] - fix(calendar): make showEnd behavior more consistent across time formats (#4059) - test(calendar): fix hardcoded date in event shape test (#4055) - [calendar] refactor: delegate event expansion to node-ical's expandRecurringEvent (#4047) - calendar.js: remove useless hasCalendarURL function (#4028) - fix(calendar): update to node-ical 0.23.1 and fix full-day recurrence lookup (#4013) - fix(calendar): correct day-of-week for full-day recurring events across all timezones (#4004) ###### [modules/newsfeed] - fix(newsfeed): fix full article view and add framing check (#4039) - [newsfeed] refactor: migrate to centralized HTTPFetcher (#4023) ###### [modules/weather] - fix(weather): fix openmeteo forecast stuck in the past (#4064) - fix(weather): fix weathergov forecast day labels off by one (#4065) - weather: fixes for templates (#4054) - weather: add possibility to override njk's and css (#4051) - Use getDateString in openmeteo (#4046) - [weather] refactor: migrate to server-side providers with centralized HTTPFetcher (#4032) - [weather] feat: add Weather API Provider (#4036) ###### [testing] - chore: remove obsolete Jest config and unit test global setup (#4044) - replace template_spec test with config_variables test (#4034) - refactor(clientonly): modernize code structure and add comprehensive tests (#4022) - Switch to undici Agent for HTTPS requests (#4015) - _[Truncated at 4000 characters — full notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.35.0]_ ### v2.34.0 - Date: 2026-01-01 - Version: v2.34.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.34.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.34.0 - **changed** — Require Node.js version >=22.21.1 <23 || >=24 - **added** — Add server:watch script with automatic restart on file changes - **added** — Add configurable forecast date format option for weather module - **added** — Add ESlint rule no-sparse-arrays for config check - **fixed** — Allow browser globals in config files - **fixed** — Restore --ozone-platform=wayland flag for reliable Wayland support - **fixed** — Prevent excessive calendar fetching on client reload - **fixed** — Show repeatingCountTitle only if yearDiff > 0 in calendar module - **fixed** — Set compliments remote file minimum delay to 15 minutes - **fixed** — Fix duplicate query param in compliments module refresh url - **fixed** — Fix newsfeed header layout issue - **fixed** — Fix wind-icon not showing in pirateweather - **fixed** — Add error handling to weather fetch functions including cors - **fixed** — Fix daylight-saving-time problems in openmeteo weather provider - **fixed** — Update Env Canada URL in envcanada weather provider - **removed** — Remove deprecated ukmetoffice datapoint provider - **changed** — Migrate CalendarFetcher to ES6 class and improve error handling - **changed** — Replace express-ipfilter with lightweight custom middleware - **changed** — Replace module-alias dependency with internal alias resolver - **changed** — Replace XMLHttpRequest with fetch and migrate e2e tests to Playwright - **changed** — Migrate from jest to vitest for testing ##### Release Notes Thanks to: @Blackspirits, @Crazylegstoo, @jarnoml, @jboucly, @JHWelch, @khassel, @KristjanESPERANTO, @rejas, @sdetweil, @xsorifc28 > ⚠️ This release needs nodejs version >=22.21.1 <23 || >=24 [Compare to previous Release v2.33.0](https://github.com/MagicMirrorOrg/MagicMirror/compare/v2.33.0...v2.34.0) ###### [core] - Merge branch 'master' into develop - Prepare Release 2.34.0 (#3998) - dependency update + adjust Playwright setup + fix linter issue (#3994) - demo with gif (#3995) - [core] fix: allow browser globals in config files (#3992) - [core] fix: restore `--ozone-platform=wayland` flag for reliable Wayland support (#3989) - [core] auto create release notes with every push on develop (#3985) - [core] chore: simplify Wayland start script (#3974) - [gitignore] restore the old Git behavior for the default modules (#3968) - [core] configure cspell to check default modules only and fix typos (#3955) - [gitignore] restoring the old Git behavior for the CSS directory (#3954) - feat(core): add `server:watch` script with automatic restart on file changes (#3920) - [check_config] refactor: improve error handling (#3927) - refactor: replace `express-ipfilter` with lightweight custom middleware (#3917) - refactor: replace `module-alias` dependency with internal alias resolver (#3893) - Release 2.33.0 (#3903) ###### [dependencies] - [chore] update dependencies and min. node version (#3986) - [core] bump dependencies into december (#3982) - Bump actions/checkout from 5 to 6 (#3972) - Update deps, unpin parse5 (#3934) - [core] Update deps and pin jsdom to v27.0.0 (#3925) - chore: update dependencies (#3921) - update deps, exclude node v23 (#3916) - remove eslint warnings, add npm publish process to Collaboration.md (#3913) - feat: add ESlint rule `no-sparse-arrays` for config check (#3911) - chore: bump dependencies into october (#3909) ###### [logging] - logger: add calling filename as prefix on server side (#3926) - [logger] Add prefixes to most Log messages (#3923) ###### [modules/alert] - Add new pt and pt-BR translations for Alert module and update global PT strings (#3965) ###### [modules/calendar] - add checksum to test whether calendar event list changed (#3988) - [calendar] fix: prevent excessive fetching on client reload and refactor `calendarfetcherutils.js` (#3976) - [calendar] refactor: migrate CalendarFetcher to ES6 class and improve error handling (#3959) - [calendar] Show `repeatingCountTitle` only if `yearDiff` > 0 (#3949) - [tests] suppress debug logs in CI environment + improve calendar symbol test stability (#3941) - [calendar] chore: remove `requiresVersion: "2.1.0"` (#3932) - [calendar] test: remove "Recurring event per timezone" test (#3929) ###### [modules/compliments] - [compliments] refactor: optimize `loadComplimentFile` method and add unit tests (#3969) - fix: set compliments remote file minimum delay to 15 minutes (#3970) - [compliments] fix: duplicate query param "?" in compliments module refresh url (#3967) ###### [modules/newsfeed] - [newsfeed] fix header layout issue (#3946) ###### [modules/weather] - [weatherprovider] update subclass language use override (#3914) - [weather] fix wind-icon not showing in pirateweather (#3957) - [weather] add error handling to weather fetch functions, including cors (#3791) - remove deprecated ukmetoffice datapoint provider, cleanup .gitignore (#3952) - fixes problems with daylight-saving-time in weather provider `openmeteo` (#3931) - Fix for envcanada Provider to use updated Env Canada URL (#3919) - [weather] feat: add configurable forecast date format option (#3918) ###### [testing] - testing: update "Enforce Pull-Request Rules" workflow (#3987) - [core] refactor: replace `XMLHttpRequest` with `fetch` and migrate e2e tests to Playwright (#3950) - [test] replace `node-libgpiod` with `serialport` in electron-rebuild workflow (#3945) - [ci] Add concurrency to automated _[Truncated at 4000 characters — full notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.34.0]_ ### v2.33.0 - Date: 2025-09-30 - Version: v2.33.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.33.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.33.0 - **added** — Add configuration option for User-Agent, used by calendar & news module - **added** — Add prettier plugin for nunjuck templates in linter - **added** — Add clear log for occupied port at startup - **changed** — Add CSS to prevent line breaking of sunset/sunrise time display in clock module - **changed** — Enhance system information logging format and include additional env and RAM details - **changed** — Add new file js/module_functions.js to move code used in several modules to one place - **changed** — Use global.root_path where possible and add tests for config:check - **changed** — Update defaultSymbol name in calendar module and the link to the icon search site - **changed** — Update dependencies including electron to v38 as well as github actions - **changed** — Update feels_like temperature calculation formula in weather module - **changed** — Update null value handling for weather type in weather module - **changed** — Update styles for weather and calendar in layout - **changed** — Use apparent_temperature data from openmeteo's hourly weather for current feelsLikeTemp in weather module - **changed** — Update envcanada Provider to use new database/URL schema for accessing weather data - **fixed** — Fixed broken unittest in calendar that only broke on the 1st of July and 1st of January - **fixed** — Fixed missing icons in clock when no other modules with icons is loaded - **fixed** — Fixed handling of empty values in weathergov providers handling of precipitationAmount in weather module - **fixed** — Fix regression handling of limit days in calendar module - **fixed** — Fixed regression of calendarfetcherutils.shouldEventBeExcluded in calendar module - **fixed** — Fixed socket.io timeout when server is slow to send notification, notification lost at client ##### [2.33.0] - 2025-10-01 Thanks to: @Crazylegstoo, @dathbe, @m-idler, @plebcity, @khassel, @KristjanESPERANTO, @rejas and @sdetweil! > ⚠️ This release needs nodejs version `v22.18.0 or higher` ###### Added - Add configuration option for `User-Agent`, used by calendar & news module (#3255) - [linter] Add prettier plugin for nunjuck templates (#3887) - [core] Add clear log for occupied port at startup (#3890) ###### Changed - [clock] Add CSS to prevent line breaking of sunset/sunrise time display (#3816) - [core] Enhance system information logging format and include additional env and RAM details (#3839, #3843) - [refactor] Add new file `js/module_functions.js` to move code used in several modules to one place (#3837) - [refactor] Use global.root_path where possible and add tests for config:check (#3883, #3885, #3886, #3889) - [tests] refactor: simplify jest config file (#3844) - [tests] refactor: extract constants for weather electron tests (#3845) - [tests] refactor: add `setupDOMEnvironment` helper function to eliminate repetitive JSDOM setup code (#3860) - [tests] replace `console` with `Log` in calendar `debug.js` to avoid exception in eslint config (#3846) - [tests] speed up e2e tests, cleanup and stabilize weather e2e tests, update snapshot url (#3847, #3848, #3861) - [tests] refactor translation tests (#3866) - Remove `sinon` dependency in favor of Jest native mocking - Unify test helper functions across translation test suites - Rename `setupDOMEnvironment` to `createTranslationTestEnvironment` for consistency - Simplify DOM setup by removing unnecessary Promise/async patterns - Avoid potential port conflicts by using port 3001 for translator unit tests - Improve test reliability and maintainability - [tests] add alert module tests for different welcome_message configurations (#3867) - [lint-staged] use `prettier --write --ignore-unknown` in `lint-staged` to avoid errors on unsupported files (#3888) ###### Updated - [calendar] Update defaultSymbol name and also the link to the icon search site (#3879) - [core] Update dependencies including electron to v38 as well as github actions (#3831, #3849, #3857, #3858, #3872, #3876, #3882, #3891, #3896) - [weather] Update feels_like temperature calculation formula (#3869) - [weather] Update null value handling for weather type (#3892) - [layout] Update styles for weather and calendar (#3894) ###### Fixed - [calendar] Fixed broken unittest that only broke on the 1st of July and 1st of january (#3830) - [clock] Fixed missing icons when no other modules with icons is loaded (#3834) - [weather] Fixed handling of empty values in weathergov providers handling of precipitationAmount (#3859) - [calendar] Fix regression handling of limit days (#3840) - [calendar] Fixed regression of calendarfetcherutils.shouldEventBeExcluded (#3841) - [core] Fixed socket.io timeout when server is slow to send notification, notification lost at client (#3380) - [tests] refactor AnimateCSS tests after jsdom 27 upgrade (#3891) - [weather] Use `apparent_temperature` data from openmeteo's hourly weather for current feelsLikeTemp (#3868). - [weather] Updated envcanada Provider to use new database/URL schema for accessing weather data (#3878). ### v2.32.0 - Date: 2025-06-30 - Version: v2.32.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.32.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.32.0 - **added** — Allow to change module order for final renderer or dynamically with CSS via feature 'order' in config - **added** — Add option 'disableNextEvent' to clock module to hide next sun event - **added** — Implement short syntax for clock week - **changed** — Simplify module loading process - **changed** — Use 'node --run' instead of 'npm run' and adapt 'start:dev' script - **changed** — Replace deprecated constants 'fs.F_OK' and 'fs.R_OK' - **changed** — Replace 'ansis' with built-in function 'util.styleText' - **changed** — Integrate stuff from 'vendor' and 'fonts' folders into main 'package.json' to simplify install and maintaining dependencies - **changed** — Refactor 'calendarfetcherutils' in Calendar module to handle timezones better by removing unnecessary date conversions and using 'moment-timezone' when calculating recurring events - **changed** — Complete translations with the help of translation tools - **changed** — Replace 'eslint-plugin-import' with 'eslint-plugin-import-x' in linter setup - **changed** — Switch Stylelint config to flat format and simplify Stylelint scripts - **changed** — Review and refactor translation tests - **changed** — Review factory code part in logger to use 'switch/case' instead of 'if/else if' - **fixed** — Handle spellcheck issues - **fixed** — Fix fullday event rrule until with timezone offset - **fixed** — Add rule 'no-undef' in config file validation - **fixed** — Fix 'roboto.css' to avoid error message 'Unknown descriptor 'var(' in @font-face rule' in Firefox console - **fixed** — Fix e2e tests newsfeed and calendar to exit without open handles ##### [2.32.0] - 2025-07-01 Thanks to: @bughaver, @bugsounet, @khassel, @KristjanESPERANTO, @plebcity, @rejas, @sdetweil. > ⚠️ This release needs nodejs version `v22.14.0 or higher` > ⚠️ This release uses `express v5` which has [breaking changes](https://expressjs.com/en/guide/migrating-5.html) that may cause problems with third-party modules ###### Added - [config] Allow to change module order for final renderer (or dynamically with CSS): Feature `order` in config (#3762) - [clock] Added option 'disableNextEvent' to hide next sun event (#3769) - [clock] Implement short syntax for clock week (#3775) ###### Changed - [refactor] Simplify module loading process (#3766) - Use `node --run` instead of `npm run` (#3764) and adapt `start:dev` script (#3773) - [workflow] Run linter and spellcheck with LTS node version (#3767) - [workflow] Split "Run test" step into two steps for more clarity (#3767) - [linter] Review linter setup (#3783) - Fix command to lint markdown in `CONTRIBUTING.md` - Re-activate JSDoc linting and fix linting issues - Refactor ESLint config to use `defineConfig` and `globalIgnores` - Replace `eslint-plugin-import` with `eslint-plugin-import-x` - Switch Stylelint config to flat format and simplify Stylelint scripts - [workflow] Replace Node.js version v23 with v24 (#3770) - [refactor] Replace deprecated constants `fs.F_OK` and `fs.R_OK` (#3789) - [refactor] Replace `ansis` with built-in function `util.styleText` (#3793) - [core] Integrate stuff from `vendor` and `fonts` folders into main `package.json`, simplifies install and maintaining dependencies (#3795, #3805) - [l10n] Complete translations (with the help of translation tools) (#3794) - [refactor] Refactored `calendarfetcherutils` in Calendar module to handle timezones better (#3806) - Removed as many of the date conversions as possible - Use `moment-timezone` when calculating recurring events, this will fix problems from the past with offsets and DST not being handled properly - Added some tests to test the behavior of the refactored methods to make sure the correct event dates are returned - [linter] Enable ESLint rule `no-console` and replace `console` with `Log` in some files (#3810) - [tests] Review and refactor translation tests (#3792) ###### Fixed - [fix] Handle spellcheck issues (#3783) - [calendar] fix fullday event rrule until with timezone offset (#3781) - [feat] Add rule `no-undef` in config file validation to fix #3785 (#3786) - [fonts] Fix `roboto.css` to avoid error message `Unknown descriptor 'var(' in @font-face rule.` in firefox console (#3787) - [tests] Fix and refactor e2e test `Same keys` in `translations_spec.js` (#3809) - [tests] Fix e2e tests newsfeed and calendar to exit without open handles (#3817) ###### Updated - [core] Update dependencies including electron to v36 (#3774, #3788, #3811, #3804, #3815, #3823) - [core] Update package type to `commonjs` - [logger] Review factory code part: use `switch/case` instead of `if/else if` (#3812) ### v2.31.0 — v2.31.0 - 2025-04-01 - Date: 2025-04-01 - Version: v2.31.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.31.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.31.0 - **added** — Add CSS support to the digital clock hour/minute/second through the use of the classes clock-hour-digital, clock-minute-digital, and clock-second-digital - **added** — Add Arabic and Esperanto translation - **added** — Add Greek translation to Alerts module - **added** — Add specific ignoreOlderThan value per feed in newsfeed module - **added** — Add Humidity option to weather module hourly view - **added** — Add option to hide hourly weather entries that are zero, hiding the entire column if empty - **added** — Add option to iterate over modules directory instead of using modules defined in config.js in updatenotification module - **changed** — Starting clientonly now checks for needed env var WAYLAND_DISPLAY or DISPLAY and starts electron with needed parameters, using wayland if both are set - **changed** — Optimize systeminformation calls and output - **changed** — Adapt start:x11:dev script - **changed** — Yr weather provider now enforces a minimum updateInterval of 600 000 ms (10 minutes) to comply with terms of service, automatically increasing lower values to this minimum - **changed** — Weatherflow weather provider fixed icons and added hourly support as well as UV, precipitation, and location name support - **deprecated** — Mark option secondsColor as deprecated in clock module - **fixed** — Fix clipping events being broadcast in calendar module - **fixed** — Fix arrayed symbols in calendar module and add testcases - **fixed** — Fix wrong weatherCondition name in openmeteo provider which led to n/a icon - **fixed** — Fix wrong port in log message when starting server only - **fixed** — Fix NewYork event processed on system in Central timezone showing wrong time - **fixed** — Yr weather provider is now able to recover from bad API responses instead of freezing - **fixed** — Fix evening events being shown during the day in compliments module - **fixed** — Fix minor spacing issues when using UV Index in hourly weather view Thanks to: @Developer-Incoming, @eltociear, @geraki, @khassel, @KristjanESPERANTO, @MagMar94, @mixasgr, @n8many, @OWL4C, @rejas, @savvadam, @sdetweil. > ⚠️ This release needs nodejs version `v22.14.0 or higher` ###### Added - Add CSS support to the digital clock hour/minute/second through the use of the classes `clock-hour-digital`, `clock-minute-digital`, and `clock-second-digital`. - Add Arabic (#3719) and Esperanto translation. - Mark option `secondsColor` as deprecated in clock module. - Add Greek translation to Alerts module. - [newsfeed] Add specific ignoreOlderThan value (override) per feed (#3360) - [weather] Added option Humidity to hourly View - [weather] Added option to hide hourly entries that are Zero, hiding the entire column if empty. - [updatenotification] Added option to iterate over modules directory instead using modules defined in `config.js` (#3739) ###### Changed - [core] starting clientonly now checks for needed env var `WAYLAND_DISPLAY` or `DISPLAY` and starts electron with needed parameters (if both are set wayland is used) (#3677) - [core] Optimize systeminformation calls and output (#3689) - [core] Add issue templates for feature requests and bug reports (#3695) - [core] Adapt `start:x11:dev` script - [weather/yr] The Yr weather provider now enforces a minimum `updateInterval` of 600 000 ms (10 minutes) to comply with the terms of service. If a lower value is set, it will be automatically increased to this minimum. - [weather/weatherflow] Fixed icons and added hourly support as well as UV, precipitation, and location name support. - [workflow] Run `sudo apt-get update` before installing packages to avoid install errors - [workflow] Exclude issues with label `ready (coming with next release)` from stale job ###### Removed ###### Updated - [core] Update requirements and dependencies including electron to v35 and formatting (#3593, #3693, #3717) - [core] Update prettier, ESLint and simplify config - Update Greek translation ###### Fixed - [calendar] Fix clipping events being broadcast (#3678) - [tests] Fix Electron tests by running them under new github image ubuntu-24.04, replace xserver with labwc, running under xserver and labwc depending on env variable WAYLAND_DISPLAY is set (#3676) - [calendar] Fix arrayed symbols, #3267, again, add testcase, add testcase for #3678 - [weather] Fix wrong weatherCondition name in openmeteo provider which lead to n/a icon (#3691) - [core] Fix wrong port in log message when starting server only (#3696) - [calendar] Fix NewYork event processed on system in Central timezone shows wrong time #3701 - [weather/yr] The Yr weather provider is now able to recover from bad API responses instead of freezing (#3296) - [compliments] Fix evening events being shown during the day (#3727) - [weather] Fixed minor spacing issues when using UV Index in Hourly - [workflow] Fix command to run spellcheck ### v2.30.0 — v2.30.0 - 2025-01-01 Another New year with exciting changes - Date: 2025-01-01 - Version: v2.30.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.30.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.30.0 - **added** — Add wayland and windows start options to package.json - **added** — Add test flag to index.html to pass to module js for test mode detection - **added** — Add export on animation names - **added** — Add support for refreshing remote compliments file - **added** — Re-add eslint-plugin-import now that it supports ESLint v9 - **added** — Re-activate eslint-plugin-package-json to lint package.json - **added** — Add linting for markdown files - **added** — Add some handy ESLint rules - **added** — Add ability to display end date for full date events where end is not same day with showEnd=true - **added** — Add text to the config.js.sample file about the locale variable - **added** — Add fetch timeout for all node_helpers through undici to help on slower systems - **changed** — Run code style checks in workflow only once - **changed** — Use project URL in fallback config - **changed** — Switch to npx for lint-staged in pre-commit hook - **changed** — Update electron dependency to v32 - **removed** — Remove node-pty and drivelist from rebuilded test - **removed** — Remove @eslint/js dependency - **fixed** — Fix pm2 using detection when pm2 script is inside or outside MagicMirror root folder - **fixed** — Fix loading node_helper of modules to avoid black screen, display errors and continue loading with next module - **fixed** — Change default value for weatherEndpoint of provider openweathermap to /onecall Thanks to: @xsorifc28, @HeikoGr, @bugsounet, @khassel, @KristjanESPERANTO, @rejas, @sdetweil. > ⚠️ This release needs nodejs version `v20` or `v22 or higher`, minimum version is `v20.18.1` ###### Added - [core] Add wayland and windows start options to `package.json` (#3594) - [docs] Add step for npm publishing in release process (#3595) - [core] Add GitHub workflow to run spellcheck a few days before each release (#3623) - [core] Add test flag to `index.html` to pass to module js for test mode detection (needed by #3630) - [core] Add export on animation names (#3644) - [compliments] Add support for refreshing remote compliments file, and test cases (#3630) - [linter] Re-add `eslint-plugin-import`now that it supports ESLint v9 (#3586) - [linter] Re-activate `eslint-plugin-package-json` to lint `package.json` (#3643) - [linter] Add linting for markdown files (#3646) - [linter] Add some handy ESLint rules. - [calendar] Add ability to display end date for full date events, where end is not same day (showEnd=true) (#3650) - [core] Add text to the config.js.sample file about the locale variable (#3654, #3655) - [core] Add fetch timeout for all node_helpers (thru undici, forces node 20.18.1 minimum) to help on slower systems. (#3660) (3661) ###### Changed - [core] Run code style checks in workflow only once (#3648) - [core] Fix animations export #3644 only on server side (#3649) - [core] Use project URL in fallback config (#3656) - [core] Fix Access Denied crash writing js/positions.js (on synology nas) #3651. new message, MM starts, but no modules showing (#3652) - [linter] Switch to 'npx' for lint-staged in pre-commit hook (#3658) ###### Removed - [tests] Remove `node-pty` and `drivelist` from rebuilded test (#3575) - [deps] Remove `@eslint/js` dependency. Already installed with `eslint` in deep (#3636) ###### Updated - [repo] Reactivate `stale.yaml` as GitHub action to mark issues as stale after 60 days and close them 7 days later (if no activity) (#3577, #3580, #3581) - [core] Update electron dependency to v32 (test electron rebuild) and all other dependencies too (#3657) - [tests] All test configs have been updated to allow full external access, allowing for easier debugging (especially when running as a container) - [core] Run and test with node 23 (#3588) - [workflow] delete exception `allow-ghsas: GHSA-8hc4-vh64-cxmj` in `dep-review.yaml` (#3659) ###### Fixed - [updatenotification] Fix pm2 using detection when pm2 script is inside or outside MagicMirror root folder (#3576) (#3605) (#3626) (#3628) - [core] Fix loading node_helper of modules: avoid black screen, display errors and continue loading with next module (#3578) - [weather] Change default value for weatherEndpoint of provider openweathermap to "/onecall" (#3574) - [tests] Fix electron tests with mock dates, the mock on server side was missing (#3597) - [tests] Fix testcases with hard coded Date.now (#3597) - [core] Fix missing `basePath` where `location.host` is used (#3613) - [compliments] croner library changed filenames used in latest version (#3624) - [linter] Fix ESLint ignore pattern which caused that default modules not to be linted (#3632) - [core] Fix module path in case of sub/sub folder is used and use path.resolve for resolve `moduleFolder` and `defaultModuleFolder` in app.js (#3653) - [calendar] Update to resolve issues #3098 #3144 #3351 #3422 #3443 #3467 #3537 related to timezone changes - [calendar] Fix #3267 (styles array), also fixes event with both exdate AND recurrence(and testcase) - [calendar] Fix showEndsOnlyWithDuration not working, #3598, applies ONLY to full day events - [calendar] Fix showEnd for Full Day events (#3602) - [tests] Suppress "module is not defined" in e2e tests (#3647) - [calendar] Fix #3267 (styles array, really this time!) - [core] Fix #3662 js/positions.js created incorrectly ### v2.29.0 — Summer is over - Date: 2024-09-30 - Version: v2.29.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.29.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.29.0 - **added** — compliments module now supports cron type date/time format entries with minutes, hours, days, months, and day of week - **added** — core checks config at every start of MagicMirror - **added** — core adds spelling check via npm run test:spelling - **added** — core renamed config.paths.modules to config.foreignModulesDir and added MM_CUSTOMCSS_FILE and MM_MODULES_DIR environment variables to override configuration - **added** — core removes elements from index.html when loading script or stylesheet files fails - **added** — core adds MODULE_DOM_UPDATED notification each time the DOM is re-rendered via updateDom - **added** — tests added minimal required node version to tests (v20.9.0) - **added** — tests added node-libgpiod library to electron-rebuild tests - **removed** — core removed installer only files - **removed** — core removed raspberry object from systeminformation - **removed** — linter removed eslint-plugin-import due to ESLint v9 incompatibility - **removed** — tests removed onoff library from electron-rebuild tests - **changed** — weather module updated apiVersion default from 2.5 to 3.0 - **changed** — core updated dependencies including stylistic-eslint - **changed** — core pinned node-ical version to 0.18.0 with security exception - **changed** — core updated SocketIO catch all to new API - **changed** — core now allows custom modules positions by scanning index.html for defined regions instead of using hardcoded positions - **changed** — core updated minimal required node version to v20.9.0 and excluded v21 - **changed** — linter switched to ESLint v9 with flat config and replaced eslint-plugin-unicorn with @eslint/js - **fixed** — weather module fixed issue with UK Met Office provider following API path and header changes - **fixed** — core added check for node_helper loading for multiple instances of the same module - **fixed** — weather module now respects unit config on broadcasted notifications - **fixed** — calendar fixed sliceMultiDayEvents getting wrong count and displaying incorrect entries for Europe/Berlin timezone - **fixed** — calendar fixed sliceMultiDayEvents showing previous day without config enabled ##### [2.29.0] - 2024-10-01 Thanks to: @bugsounet, @dkallen78, @jargordon, @khassel, @KristjanESPERANTO, @MarcLandis, @rejas, @ryan-d-williams, @sdetweil, @skpanagiotis. > ⚠️ This release needs nodejs version `v20` or `v22`, minimum version is `v20.9.0` ###### Added - [compliments] Added support for cron type date/time format entries mm hh DD MM dow (minutes/hours/days/months and day of week) see https://crontab.cronhub.io for construction (#3481) - [core] Check config at every start of MagicMirror² (#3450) - [core] Add spelling check (cspell): `npm run test:spelling` and handle spelling issues (#3544) - [core] removed `config.paths.vendor` (could not work because `vendor` is hardcoded in `index.html`), renamed `config.paths.modules` to `config.foreignModulesDir`, added variable `MM_CUSTOMCSS_FILE` which - if set - overrides `config.customCss`, added variable `MM_MODULES_DIR` which - if set - overrides `config.foreignModulesDir`, added test for `MM_MODULES_DIR` (#3530) - [core] elements are now removed from `index.html` when loading script or stylesheet files fails - [core] Added `MODULE_DOM_UPDATED` notification each time the DOM is re-rendered via `updateDom` (#3534) - [tests] added minimal needed node version to tests (currently v20.9.0) to avoid releases with wrong node version info - [tests] Added `node-libgpiod` library to electron-rebuild tests (#3563) ###### Removed - [core] removed installer only files (#3492) - [core] removed raspberry object from systeminformation (#3505) - [linter] removed `eslint-plugin-import`, because it doesn't support ESLint v9. We will reenter it later when it does. - [tests] removed `onoff` library from electron-rebuild tests (#3563) ###### Updated - [weather] Updated `apiVersion` default from 2.5 to 3.0 (#3424) - [core] Updated dependencies including stylistic-eslint - [core] nail down `node-ical` version to `0.18.0` with exception `allow-ghsas: GHSA-8hc4-vh64-cxmj` in `dep-review.yaml` (which should removed after next `node-ical` update) - [core] Updated SocketIO catch all to new API - [core] Allow custom modules positions by scanning index.html for the defined regions, instead of hard coded (PR #3518 fixes issue #3504) - [core] Detail optimizations in `config_check.js` - [core] Updated minimal needed node version in `package.json` (currently v20.9.0) (#3559) and except for v21 (no security updates) (#3561) - [linter] Switch to ESLint v9 and flat config and replace `eslint-plugin-unicorn` by `@eslint/js` - [core] fix discovering module positions twice after #3450 ###### Fixed - Fixed `checks` badge in README.md - [weather] Fixed issue with the UK Met Office provider following a change in their API paths and header info. - [core] add check for node_helper loading for multiple instances of same module (#3502) - [weather] Fixed issue for respecting unit config on broadcasted notifications - [tests] Fixes calendar test by moving it from e2e to electron with fixed date (#3532) - [calendar] fixed sliceMultiDayEvents getting wrong count and displaying incorrect entries, Europe/Berlin (#3542) - [tests] ignore `js/positions.js` when linting (this file is created at runtime) - [calendar] fixed sliceMultiDayEvents showing previous day without config enabled ### v2.28.0 — Weather Fixes in Summer Heat - Date: 2024-06-30 - Version: v2.28.0 - Original notes: https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.28.0 - Permalink: https://whatsnew.fyi/product/magicmirror/releases/v2.28.0 - **added** — Added config option showEndsOnlyWithDuration for default calendar - **added** — Added specialDayUnique config option for compliments module, defaults to false - **added** — Use precipitationLast3Hours if precipitationLastHour is null in weather provider weathergov - **removed** — Removed node v18 support - **changed** — Update dependencies including electron to v31 - **changed** — Require node >= v20 - **changed** — Update config.js.sample to use openmeteo as weather provider which needs no API key - **changed** — Use latest version of node for automated tests - **changed** — Avoid using pm2 when running updatenotification in docker container - **fixed** — Fixed crash possibility if module name is not defined and position is misspelled - **fixed** — Fixed precipitationProbability in forecast for weather provider openmeteo - **fixed** — Fixed type=daily for weather provider openmeteo having no data when running after 23:00 - **fixed** — Fixed type=daily for weather provider openmeteo showing nightly icons in forecast when current time is nightly - **fixed** — Fixed forecast and hourly weather for weather provider openmeteo to use real temperatures instead of apparent temperatures - **fixed** — Fixed e2e tests running in docker container which needs address 0.0.0.0 ##### [2.28.0] - 2024-07-01 Thanks to: @btoconnor, @bugsounet, @JasonStieber, @khassel, @kleinmantara and @WallysWellies. > ⚠️ This release needs nodejs version >= v20.9.0 ###### Added - [calendar] Added config option "showEndsOnlyWithDuration" for default calendar - [compliments] Added `specialDayUnique` config option, defaults to `false` (#3465) - [weather] Provider weathergov: Use `precipitationLast3Hours` if `precipitationLastHour` is `null` (#3124) ###### Removed - [tests] delete node v18 support (#3462) ###### Updated - [core] Update dependencies including electron to v31 - [core] use node >= v20 (#3462) - [core] Update `config.js.sample` to use openmeteo as weather provider which needs no api key - [tests] Use latest@version of node for `automated-tests.yaml` (#3483) - [updatenotification] Avoid using pm2 when running in docker container ###### Fixed - [core] Fixed crash possibility if `module: ` is not defined and on `postion: ` mistake (#3445) - [weather] Fixed precipitationProbability in forecast for provider openmeteo (#3446) - [weather] Fixed type=daily for provider openmeteo having no data when running after 23:00 (#3449) - [weather] Fixed type=daily for provider openmeteo showing nightly icons in forecast when current time is "nightly" (#3458) - [weather] Fixed forecast and hourly weather for provider openmeteo to use real temperatures, not apparent temperatures (#3466) - [tests] Fixed e2e tests running in docker container which needs `address: "0.0.0.0"` (#3479)