MMM-ShulSchedule is a module for the MagicMirror² project. It displays the schedule for your local synagogue, including prayer times, events, and other important information.
It also allows for filtering the events collected, letting you only display what you care about.
The module supports two display modes via the displayMode config option.
A compact, day-sectioned view that collapses repeated services into one row per service per day, interleaves timed special events chronologically, lifts untimed specials to the top of each day, and rolls Omer days into the day header. Today's section gets an amber accent and the next upcoming minyan is highlighted in amber. Past times in today's row fade to ~30% opacity.
The original flat list, one row per event. Useful if you prefer the original layout or want to share the look with downstream forks.
- Navigate to your MagicMirror's
modulesfolder:cd ~/MagicMirror/modules
- Clone the repository:
git clone https://github.com/yourusername/MMM-ShulSchedule.git
- Navigate to the module's folder:
cd MMM-ShulSchedule - Install the dependencies:
npm install
To use this module, add it to the modules array in the config/config.js file of your MagicMirror² installation:
{
module: 'MMM-ShulSchedule',
header: 'Shul Schedule',
position: 'bottom_left',
config: {
displayMode: 'grouped', // or 'rows' for the classic flat list
frameWidth: 400,
fetchInterval: 7200000, // 2 hours
renderRefreshInterval: 300000, // 5 minutes
calendars: [
{
symbol: 'calendar',
url: 'https://www.someshul.org/ical2.php?12,daed,schedule,mitzvah,parsha,holiday'
},
],
excludedEvents: [
'Daf Yomi',
'Siddur',
'Chavruta',
'Ping Pong',
'Ulpan',
'Parshat HaShavua',
'Parent Child Learning',
'Tot',
'Doctor',
],
brightEvents: [
'Shacharit',
'Mincha',
'Maariv',
'Mincha/Maariv',
'Musaf',
'Selichot',
'Kabbalat Shabbat',
],
highlightedEvents: [
'Candle Lighting',
'Havdalah',
]
}
}| Option | Description | Type | Default |
|---|---|---|---|
displayMode |
'grouped' for the compact day-sectioned view, 'rows' for the classic flat list. |
String | 'grouped' |
frameWidth |
Target width (px) of the grouped wrapper. Long rows stay inside this frame instead of expanding the module. Set to 0 to disable. Only applies in grouped mode. |
Number | 400 |
maximumNumberOfDays |
How many days forward to display. | Number | 3 |
maxTitleLength |
Maximum title length before truncation in rows mode. Grouped mode uses CSS ellipsis for long labels. |
Number | 25 |
fade |
Whether to fade out events as they get closer to the end time. Only applies in rows mode. |
Boolean | false |
fadePoint |
Point in the list (0–1) where the fade effect begins. Only applies in rows mode. |
Number | 0.25 |
fetchInterval |
How often the schedule should be updated (in milliseconds). | Number | 14400000 |
renderRefreshInterval |
How often the DOM should re-render without fetching new calendar data, so time-sensitive styling such as past/next times stays current. Set to 0 to disable. |
Number | 300000 |
animationSpeed |
DOM update animation speed (ms). | Number | 2000 |
calendars |
Array of calendar objects to fetch events from. | Array | [] |
excludedEvents |
Array of event filters to exclude certain events from being displayed. Each entry can be a plain string (substring match) or an object with filterBy and regex properties for advanced matching. |
Array | [] |
excludedEvents (string entry) |
A substring to match against event titles. Events containing this string will be excluded. | String | — |
excludedEvents (object entry) .filterBy |
The string or pattern to match against event titles. | String | '' |
excludedEvents (object entry) .regex |
Whether the filterBy string should be treated as a regular expression. |
Boolean | false |
brightEvents |
Array of event filters to render with MagicMirror's brighter text styling. Uses the same string/object matching shape as excludedEvents. |
Array | Service names |
highlightedEvents |
Array of event filters to render in purple. Uses the same string/object matching shape as excludedEvents. |
Array | [] |
calendars.symbol |
The symbol to display next to events from this calendar. | String | 'calendar' |
calendars.url |
The URL of the calendar to fetch events from. | String | '' |
To retrieve the calendar URL, if your Shul uses ShulCloud:
- Log in to your ShulCloud account.
- Navigate to the calendar section.
- Look for an option to export or sync your calendar. This might be labeled as "Export," "ICS," "Subscribe," or something similar.
- Select the ICS format for export.
- Copy the URL.
- If you don't see an option to export directly, you might need to check ShulCloud's help documentation or contact their support for specific instructions.
When displayMode: 'grouped' is active, the module applies a few opinionated rules to compress the schedule:
- Same-name service grouping. Multiple Shacharit/Mincha/Maariv times on the same day collapse into one row, with times joined by
·and a sharedam/pmsuffix at the end of the row. - Bright events. Titles matching
brightEventsrender with MagicMirror's brighter text styling. - Day sections. Each day gets a small-caps header (
Sunday · May 3) with a thin underline. Today's header is prefixed withToday · …and gets an amber left border. - Omer rolled into the header. The daily Omer count (e.g.
31st Day Omer) is appended to the day header rather than rendered as a separate row. - Untimed specials at the top. Date-only specials appear above the day's timed events, italicized and prefixed with
✦. - Timed events interleaved chronologically. Shiurim and other timed events slot between service rows by start time without the untimed
✦marker. - Highlighted events. Titles matching
highlightedEventsrender in purple. - Today-aware coloring. A single amber accent marks the next upcoming time. Past times in today's row fade to ~30% opacity. All other days render at full opacity.
This module is directly built upon the default Calendar module by Michael Teeuw (http://michaelteeuw.nl).
This project is licensed under the MIT License - see the LICENSE file for details.

