Metro Calendar

Set your family's board up, see it draw, and copy the result into TRMNL.

Let us set up your calendar board

Examples of what this can do no links, no setup

Three complete boards, each a real working configuration with placeholder links. Pick one and it draws in the preview: what comes back is the plugin's own layout code on a device-sized canvas, so it is what the panel would show.

Pick an example:

Paste what you have a configuration, or just ICS links

Already have a configuration in TRMNL, or an answer back from an assistant? Paste it here. Plain ICS links, one per line, work too: each becomes a calendar waiting to be told who it is for.

Loading replaces whatever is in the editor, and the Undo button at the top of the page puts it back. To go back to the three examples, use Examples in the bar above.

Let an AI do it optional, and it reads your calendars

Generates a prompt describing this plugin, its configuration format and what makes a board read well, together with your ICS links and whatever the tool has already read from them. Paste it into an AI assistant and it returns a configuration you paste back into Paste what you have, just above, which loads the whole thing at once.

Draw the map first if you can: the tool then has the real events, and the prompt carries a digest of them so the assistant can spot the patterns without fetching anything. A prompt with no events in it comes back as "I cannot read these feeds", because neither this page nor the assistant can fetch a calendar link.

Your calendars a link, and who it is for

Add one calendar per person. Two answers each: where the calendar lives, and whose day it is. Every new name draws one more line on the map, so this is the whole setup for a household.

A name nobody has used yet becomes a new person. Two people sharing one feed: write both names with a comma between them. A feed where only some events are somebody's -- a school calendar, a household one -- is split by rules, under More options on its card.

Finding the link: in Google Calendar it is that calendar's settings, Secret address in iCal format. On iCloud, share the calendar publicly and copy the webcal:// link. In Outlook, publish the calendar and copy the ICS link. The step-by-step setup spells out every click for five services and checks each link for you.

No calendars yet. Paste a link above and say whose it is.

People on the map one line each, in this order

Nothing to fill in: these are the answers from above. Rename somebody and their calendars and rules follow. A calendar nobody has said anything about belongs to the whole household, so it shows on every line rather than on whoever happens to be first. The order here only decides the dash patterns. Which side of the map a line runs on, and its colour, are the plugin's own choice, balanced once it has counted the day.

Nobody yet. Answer who is this for? on a calendar above and they appear here.

Rules for every calendar optional, and rarely needed

Rules that apply to all of your calendars at once

The same rules as inside a calendar, applied to all of them. For example, "anything called Dentist goes on Sam's line". A calendar's own rule wins over one of these. Where a rule names a person, tick more than one to put the event on each of their lines: that is how a shared event is drawn once, as an interchange.

Your configuration paste this into TRMNL

  1. In TRMNL open the plugin's settings and paste the JSON into Calendars. Leave the box empty and the board shows an example day instead.
  2. Set your Location for weather and rain markers, then save.
Every option, if you would rather write it by hand

The same shape this page produces. lines and rules are both optional: a bare list of calendars already draws one line per calendar.

{
  "version": 1,
  "docs": "https://raw.githubusercontent.com/ExcuseMi/trmnl-metro-calendar-plugin/main/CONFIG.md",   // what every key means
  "timeFormat": "12h" | "24h" | "auto",
  "lines": [
    { "name": "Sam",
      "hideWhenEmpty": true }        // leave the line off on a day it has nothing
  ],
  "rules": [ ... ],                  // applied to every calendar
  "calendars": [
    { "url": "https://.../calendar.ics",   // or webcal://
      "line": "Sam",                 // whose it is, or a list; without it, everyone's
      "name": "Work",                // a label only
      "headers": { "Authorization": "..." },
      "includeDescription": false,   // let rules match DESCRIPTION too
      "keepLine": true,              // keep its line when empty or unreachable
      "holiday": false,              // a holiday feed: its days are named beside the date, on no line
      "ignoreTimezone": false,       // read its times as local time, whatever zone the feed writes
      "mergeSameTime": false,        // things at the same minute on one line are one stop, names joined
      "rules": [
        { "match": { "type": "word", "value": "L6",
                     "field": "title" },  // or location / description / categories / any
          "line": "Bart",            // a name, or a list to share the event
          "rewrite": "",             // replace the matched text ("" cuts it out)
          "title": "Swimming",       // or replace the whole title
          "hide": false,
          "allDay": false,
          "holiday": false }         // a day off: beside the date, or at the head of "line"
      ] }
  ]
}
  • Match types: any, all, exact, word, contains, regex, status, weekday, duration (min/max minutes), time (from/to, "HH:MM", from inclusive and to exclusive), and and/or/not (and/or with matchers, not with matcher).
  • What a matcher reads: a text matcher takes an optional field: title, location, description, categories or any. Left out, it reads the title plus the description, which is what a matcher has always done. Naming description or any switches includeDescription on by itself, so a rule that reads the notes does not also have to remember the switch.
  • Order: rules are checked in order and the last match wins for each effect, except rewrites, which all apply one after another. A calendar's own rules beat the top-level ones.
  • Whose a calendar is: its line. What no rule routes goes there; a calendar with no line is the household's, and what no rule routes goes on every line. A calendar's name is a label, and a line only when there is no lines list at all.
  • Sides, colours and dash patterns are chosen for you, from the day's events and the panel.
  • Version: version says which format the configuration is written in. If the format ever changes, the plugin reads the older one for you.
  • Account settings, not config: timeZone and locale are also accepted at the top level and override your TRMNL account's zone and language. Set them only if the account's own values are wrong; the AI prompt above deliberately leaves them out, because an assistant guessing a zone puts the whole day on the board at the wrong hour.
  • Recurring events show for daily, weekly, monthly and yearly rules, with COUNT, UNTIL, INTERVAL and BYDAY/BYMONTHDAY/BYMONTH/BYSETPOS.