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.

    65 Topics
    426 Posts
    karsten13K
    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 ⚠️ We introduced some internal changes with this release, please read this forum post 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) chore: migrate CI workflows to ubuntu-slim for faster startup times (#4007) see https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.35.0
  • 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
    I’ve found that going a bit larger than the monitor actually looks a lot more ‘natural’ as a piece of furniture, even if the UI only covers a portion of it. It gives you that nice clean border without feeling cramped.
  • Add exciting new features to your mirror.

    6k Topics
    58k Posts
    KristjanESPERANTOK
    @iamktothek You don’t need node-fetch. The fetch API is built-in meanwhile :-)
  • Make your mirror your own but modifying its appearance.

    432 Topics
    3k Posts
    S
    @megagprime try this module position:"bottom_left", no custom.css setting [image: 1775784183168-screenshot-at-2026-04-09-20-22-39-resized.png] custom.css .MMM-CalendarExt3 .module-content { width:175%; } adjust % as you need [image: 1775784059927-screenshot-at-2026-04-09-20-18-22-resized.png]
  • Share your project story with pictures.

    577 Topics
    5k Posts
    M
    @pocketknife Here you go. It’s pretty untidy (could do with a good bit of pruning!) but hope it helps: /* Config Sample * * For more information on how you can configure this file * see https://docs.magicmirror.builders/configuration/introduction.html * and https://docs.magicmirror.builders/modules/configuration.html * * You can use environment variables using a `config.js.template` file instead of `config.js` * which will be converted to `config.js` while starting. For more information * see https://docs.magicmirror.builders/configuration/introduction.html#enviromnent-variables */ let config = { address: "localhost", // Address to listen on, can be: // - "localhost", "127.0.0.1", "::1" to listen on loopback interface // - another specific IPv4/6 to listen on a specific interface // - "0.0.0.0", "::" to listen on any interface // Default, when address config is left out or empty, is "localhost" port: 8080, basePath: "/", // The URL path where MagicMirror² is hosted. If you are using a Reverse proxy // you must set the sub path here. basePath must end with a / ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], // Set [] to allow all IP addresses // or add a specific IPv4 of 192.168.1.5 : // ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.1.5"], // or IPv4 range of 192.168.3.0 --> 192.168.3.15 use CIDR format : // ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.3.0/28"], useHttps: false, // Support HTTPS or not, default "false" will use HTTP httpsPrivateKey: "", // HTTPS private key path, only require when useHttps is true httpsCertificate: "", // HTTPS Certificate path, only require when useHttps is true language: "en", locale: "en-US", // this variable is provided as a consistent location // it is currently only used by 3rd party modules. no MagicMirror code uses this value // as we have no usage, we have no constraints on what this field holds // see https://en.wikipedia.org/wiki/Locale_(computer_software) for the possibilities logLevel: ["INFO", "LOG", "WARN", "ERROR"], // Add "DEBUG" for even more logging timeFormat: 24, units: "metric", modules: [ // Base WallberryTheme adds new font, styles, and a rotating background image pulled from Unsplash.com { module: "WallberryTheme", position: "fullscreen_below", // Required Position config: { unsplashAccessKey: "YOUR_API_KEY_HERE", // REQUIRED collections: "XXXX" // optional - leave empty for a random photo } }, // WB-clock adds local time (Optional Module) { module: "WallberryTheme/WB-clock", position: "top_bar", // highly suggest using top_bar position config: { //localCityName: "Seattle", // optional //otherCities: [ //{name: "DC", timezone: "US/Eastern"}, // optional //{name: "Anchorage", timezone: "US/Alaska"} // optional //] } }, // WB-weather adds weather (Optional Module) { module: "WallberryTheme/WB-weather", position: "bottom_bar", // Highly suggested location config: { // See "Configuration options" for more information. apiKey: "YOUR_API_KEY_HERE", // REQUIRED latitude: YOUR_LATITUDE, // REQUIRED longitude: YOUR_LONGITUDE // REQUIRED } }, { module: 'MMM-BackgroundSlideshow', position: 'fullscreen_below', config: { imagePaths: ['/mnt/XXX/'], recursiveSubDirectories: true, transitionImages: false, randomizeImageOrder: true, showImageInfo: true, showProgressBar: false, imageInfoNoFileExt: true, showAllImagesBeforeRestart: true, slideshowSpeed: 600000, } }, { module: 'MMM-auto-refresh', config: { // See below for configurable options refreshInterval: 21600000 //6 hours } }, { module: 'MMM-CountDown', disabled: true, position: 'bottom_right', config: { event: "SOMEONES Birthday:", date: "2026-01-01 00:00:00", daysLabel: " days", showHours: false, showMinutes: false, showSeconds: false } }, { module: 'MMM-HomeAssistant', config: { mqttServer: 'mqtt://192.XXX.X.XX', mqttPort: XXXX, username: 'XXXXXX', password: 'XXXXXXXXXXXXXXXXXXXXX', deviceName: 'XXXMagicMirror', autodiscoveryTopic: 'homeassistant', monitorControl: false, brightnessControl: true, moduleControl: true, monitorStatusCommand: 'wlr-randr | awk \'/HDMI-A-1/ {found=1} found && /Enabled:/ {print ($2 == "yes") ? "true" : "false"; exit} END {if(!found) print "false"}\'', monitorOnCommand: 'wlr-randr --output HDMI-A-1 --on', monitorOffCommand: 'wlr-randr --output HDMI-A-1 --off', pm2ProcessName: 'mm', refreshBrowser: true } }, { module: "alert", }, { module: "updatenotification", position: "top_bar" }, { module: "clock", disabled: true, position: "top_left" }, { module: "calendar", header: "US Holidays", //position: "top_left", config: { calendars: [ { fetchInterval: 7 * 24 * 60 * 60 * 1000, symbol: "calendar-check", url: "https://calendar.google.com/calendar/ical/YOUR_GOOGLE_CAL_URL.ics", //url: "https://ics.calendarlabs.com/76/mm3137/US_Holidays.ics" } ] } }, { module: "MMM-MonthlyCalendar", position: "top_bar", config: { // See "Configuration options" for more information. mode: "twoWeeks", firstDayOfWeek: "monday", } }, { module: "helloworld", position: "bottom_bar", // This can be any of the regions. disabled: true, config: { // See 'Configuration options' for more information. text: "Happy birthday!", }, }, { module: "compliments", disabled: true, position: "lower_third" }, { module: "weather", disabled: true, position: "top_right", config: { weatherProvider: "openmeteo", type: "current", lat: YOUR LATITUDE, lon: YOUR LONGITUDE } }, { module: "weather", disabled: true, position: "top_right", header: "Weather Forecast", config: { weatherProvider: "openmeteo", type: "forecast", lat: YOUR LATITUDE, lon: YOUR LONGITUDE } }, { module: "newsfeed", disabled: true, position: "bottom_bar", config: { feeds: [ { title: "New York Times", url: "https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml" } ], showSourceTitle: true, showPublishDate: true, broadcastNewsFeeds: true, broadcastNewsUpdates: true } }, ] }; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { module.exports = config; }
  • You have a problem with your mirror? Ask for help.

    5k Topics
    36k Posts
    KristjanESPERANTOK
    @Phantomkommander said: Currently, if a client reconnects during the backend’s “protection phase,” it stays on “Loading…” until the next scheduled fetch. It would be the icing on the cake if the module could immediately push the cached data to a newly connected client, instead of making it wait for the next real API call. Good suggestion. I’ve opened a PR (https://github.com/MagicMirrorOrg/MagicMirror/pull/4121) to implement that :)
  • A place to talk about whatever you want.

    1k Topics
    10k Posts
    S
    @TX77ConfigMirror its in the Preferences, Control Center , Screens [image: 1776698418697-pi-screen-cfg-resized.jpeg]