Adapts calendar module to node-ical changes and fixes a bug with moved full-day recurring events in eastern timezones. ## Changes ### 1. Update node-ical to 0.23.1 - Includes upstream fixes for UNTIL UTC validation errors from CalDAV servers (reported by @rejas in PR #4010) - Changes to `getDateKey()` behavior for VALUE=DATE events (now uses local date components) - Fixes issue with malformed DURATION values (reported by MagicMirror user here: https://github.com/jens-maus/node-ical/issues/381) ### 2. Remove dead code - Removed ineffective UNTIL modification code (rule.options is read-only in rrule-temporal) - The code attempted to extend UNTIL for all-day events but had no effect ### 3. Fix recurrence lookup for full-day events node-ical changed the behavior of `getDateKey()` - it now uses local date components for VALUE=DATE events instead of UTC. This broke recurrence override lookups for full-day events in eastern timezones. **Why it broke:** - **before node-ical update:** Both node-ical and MagicMirror used UTC → keys matched ✅ - **after node-ical update:** node-ical uses local date (RFC 5545 conform), MagicMirror still used UTC → **mismatch** ❌ **Example:** - Full-day recurring event on October 12 in Europe/Berlin (UTC+2) - node-ical 0.23.1 stores override with key: `"2024-10-12"` (local date) - MagicMirror looked for key: `"2024-10-11"` (from UTC: Oct 11 22:00) - **Result:** Moved event not found, appears on wrong date **Solution:** Adapt to node-ical's new behavior by using local date components for full-day events, UTC for timed events. **Note:** This is different from previous timezone fixes - those addressed event generation, this fixes the lookup of recurrence overrides. ## Background node-ical 0.23.0 switched from `rrule` to `rrule-temporal`, introducing breaking changes. Version 0.23.1 fixed the UNTIL validation issue and formalized the `getDateKey()` behavior for DATE vs DATE-TIME values, following RFC 5545 specification that DATE values represent local calendar dates without timezone context.
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. MagicMirror² is built by the creator of the original MagicMirror with the incredible help of a growing community of contributors.
MagicMirror² focuses on a modular plugin system and uses Electron as an application wrapper. So no more web server or browser installs necessary!
Documentation
For the full documentation including installation instructions, please visit our dedicated documentation website: https://docs.magicmirror.builders.
Links
- Website: https://magicmirror.builders
- Documentation: https://docs.magicmirror.builders
- Forum: https://forum.magicmirror.builders
- Technical discussions: https://forum.magicmirror.builders/category/11/core-system
- Discord: https://discord.gg/J5BAtvx
- Blog: https://michaelteeuw.nl/tagged/magicmirror
- Donations: https://magicmirror.builders/#donate
Contributing Guidelines
Contributions of all kinds are welcome, not only in the form of code but also with regards to
- bug reports
- documentation
- translations
For the full contribution guidelines, check out: https://docs.magicmirror.builders/about/contributing.html
Enjoying MagicMirror? Consider a donation!
MagicMirror² is Open Source and free. That doesn't mean we don't need any money.
Please consider a donation to help us cover the ongoing costs like webservers and email services. If we receive enough donations we might even be able to free up some working hours and spend some extra time improving the MagicMirror² core.
To donate, please follow this link.


