MagicMirrorOrg/MagicMirror · warning

[calendar] Deprecation warning: Please update your calendar

Error message

[calendar] Deprecation warning: Please update your calendar authentication configuration.

What it means

Old calendar configs put authentication directly on the calendar entry as `user` and `pass`. The module now expects them nested under an `auth` object. For backwards compatibility the module still copies user/pass into calendar.auth and logs this deprecation warning (plus a docs link) so users update their config before support is dropped.

Source

Thrown at defaultmodules/calendar/calendar.js:144

				broadcastPastEvents: calendar.broadcastPastEvents,
				selfSignedCert: calendar.selfSignedCert,
				excludedEvents: calendar.excludedEvents,
				fetchInterval: calendar.fetchInterval
			};

			if (typeof calendar.symbolClass === "undefined" || calendar.symbolClass === null) {
				calendarConfig.symbolClass = "";
			}
			if (typeof calendar.titleClass === "undefined" || calendar.titleClass === null) {
				calendarConfig.titleClass = "";
			}
			if (typeof calendar.timeClass === "undefined" || calendar.timeClass === null) {
				calendarConfig.timeClass = "";
			}

			// we check user and password here for backwards compatibility with old configs
			if (calendar.user && calendar.pass) {
				Log.warn("[calendar] Deprecation warning: Please update your calendar authentication configuration.");
				Log.warn("https://docs.magicmirror.builders/modules/calendar.html#configuration-options");
				calendar.auth = {
					user: calendar.user,
					pass: calendar.pass
				};
			}

			/*
			 * tell helper to start a fetcher for this calendar
			 * fetcher till cycle
			 */
			this.addCalendar(calendar.url, calendar.auth, calendarConfig);
		});

		// for backward compatibility titleReplace
		if (typeof this.config.titleReplace !== "undefined") {
			Log.warn("[calendar] Deprecation warning: Please consider upgrading your calendar titleReplace configuration to customEvents.");
			for (const [titlesearchstr, titlereplacestr] of Object.entries(this.config.titleReplace)) {

View on GitHub (pinned to 4b4a59534f)

Solutions

  1. Move user and pass into an `auth: { user, pass }` object within the calendar entry
  2. Remove the top-level user/pass fields once auth is in place
  3. If using bearer-token auth instead of basic auth, use `auth: { mode: "bearer", ... }` per current docs
  4. Consider referencing **SECRET_*** env placeholders instead of hardcoding the password

Example fix

// before
{ url: "https://example.com/cal.ics", user: "bob", pass: "secret" }
// after
{ url: "https://example.com/cal.ics", auth: { user: "bob", pass: "secret" } }
Defensive patterns

Strategy: validation

Validate before calling

if (("user" in calendarEntry || "pass" in calendarEntry) && !("auth" in calendarEntry)) {
  console.warn("Move user/pass into auth: { user, pass }");
}

Type guard

function usesInlineCredentials(entry) {
  return typeof entry === "object" && entry !== null && "user" in entry && "pass" in entry && !("auth" in entry);
}

Prevention

When it happens

Trigger: A calendars array entry in the calendar module config contains both `user` and `pass` at the top level (calendar.user && calendar.pass both truthy), triggering the warning at defaultmodules/calendar/calendar.js:144 in start().

Common situations: Configs created before the auth option was introduced (Basic-auth protected ICS feeds); copied example configs with inline credentials; credentials set via **SECRET_** placeholders directly on user/pass.

Understand the failure class

Related errors


AI-assisted analysis of MagicMirrorOrg/MagicMirror@4b4a59534f (2026-08-31). Data as JSON: /api/errors/b437f36018279525. Report an issue: GitHub.