--- title: Alert template syntax description: Every variable you can put in an alert title, from the event name to how long is left before it starts. order: 2 --- # Alert template syntax Variables for customising alert titles and notifications in templates. See [Reminders and alerts](/docs/everyday-use/reminders-and-alerts.html) for where these templates are set and when they fire. **Format:** `%` --- ## Event identity | Code | Result | Example | |------|--------|---------| | `%t` | Event title | `"Team Standup"` | | `%T` | Alert title | `"10 min reminder"` | --- ## Time to event Time relative to the event, adapting to whichever phase the alert fires in: - **Before** the event starts: time remaining *until* it starts. - **During** the event (after it starts, before it ends): time elapsed *since* it started. - **After** the event ends: time elapsed *since* it ended. The same variables work whether the alert is configured to fire before, during, or after the event; no separate codes are needed for each phase. These come in two flavours: a **bare value** (just a number) and a **sentence form**, whose code ends in `l`, that reads as a phrase and picks its own tense — see [Sentence forms](#sentence-forms) below. | Code | Result | Example | |------|--------|---------| | `%tm` | Minutes until/since | `15` | | `%ts` | Seconds until/since | `900` | | `%th` | Hours until/since | `0.25` | | `%td` | Days until/since | `1` | | `%tf` | Broken into units | `"1 day, 3 hours, 10 minutes"` | `%tf` accepts a [style parameter](#style-parameter): `%tf{compact}` → `"1d 3h 10m"`. With the bare values you write the connecting words yourself, and you must phrase each phase separately — the number adapts, but "in"/"ago" won't: ``` "%t in %tm minutes" (before) -> "Client call in 45 minutes" "%t started %tm minutes ago" (during) -> "Client call started 12 minutes ago" "%t ended %tm minutes ago" (after) -> "Client call ended 5 minutes ago" ``` To have one code do all three, use the sentence form `%tml` instead. **Live updates:** an alert whose title contains any time-relative code (`%tm`, `%ts`, `%th`, `%td`, `%tf`, or a sentence form) is re-rendered **once a minute** while it is showing, so the value counts down/up rather than freezing at its fire-time snapshot. Updates pause while the phone is asleep and catch up the moment the screen comes back on. Note this cadence means the seconds codes (`%ts`, `%tsl`) still only refresh once a minute — they show exact seconds, not a ticking countdown. --- ## Event duration How long the event lasts. Duration isn't relative to "now", so its sentence forms carry no tense — they just add the unit word. | Code | Result | Example | |------|--------|---------| | `%dm` | Duration in minutes | `90` | | `%ds` | Duration in seconds | `5400` | | `%dh` | Duration in hours | `1.5` | | `%df` | Broken into units | `"1 hour, 30 minutes"` | | `%dml` | Minutes, worded | `"90 minutes"` | | `%dsl` | Seconds, worded | `"5400 seconds"` | | `%dhl` | Hours, worded | `"1.5 hours"` | | `%dfl` | Broken into units, worded | `"1 hour, 30 minutes"` | `%df`, `%dfl` and the worded forms all accept the [style parameter](#style-parameter): `%df{compact}` → `"1h 30m"`, `%dml{short}` → `"90 mins"`. --- ## Sentence forms Add `l` to any time code to get its **sentence form**: a ready-made phrase that picks the right tense automatically from the phase the alert fires in. No need to write separate templates for before, during and after. | Code | Before | During | After | |------|--------|--------|-------| | `%tml` | `in 15 minutes` | `started 15 minutes ago` | `ended 15 minutes ago` | | `%tsl` | `in 900 seconds` | `started 900 seconds ago` | `ended 900 seconds ago` | | `%thl` | `in 3 hours` | `started 3 hours ago` | `ended 3 hours ago` | | `%tdl` | `in 1 day` | `started 1 day ago` | `ended 1 day ago` | | `%tfl` | `in 1 day, 3 hours` | `started 1 day, 3 hours ago` | `ended 1 day, 3 hours ago` | ``` "%t %tml" (before) -> "Client call in 15 minutes" (during) -> "Client call started 15 minutes ago" (after) -> "Client call ended 15 minutes ago" ``` Words are pluralised for you (`1 minute` vs `15 minutes`). --- ## Style parameter The broken-into-units and sentence forms accept an optional `{…}` parameter that sets how verbose the unit words are. The default is `long`. | Style | second | minute | hour | day | |-------|--------|--------|------|-----| | `{long}` *(default)* | seconds | minutes | hours | days | | `{short}` | secs | mins | hrs | days | | `{compact}` | s | m | h | d | | `{clock}` | digits-only stopwatch reading — see below | | | | ``` "%tml" -> "in 15 minutes" "%tml{short}" -> "in 15 mins" "%tml{compact}" -> "in 15m" "%tf{compact}" -> "1d 3h 10m" "%df{short}" -> "1 hr, 30 mins" ``` An unrecognised style (e.g. `%tml{huge}`) is left in the text untouched, so typos are easy to spot. ### `{clock}` Renders `%tf`/`%df` as a stopwatch: `MM:SS` under an hour, `H:MM:SS` beyond it. Days roll up into hours, so a day and a half reads `36:00:00`. ``` "%tf{clock}" -> "04:59" "%tfl{clock}" -> "in 04:59" "%df{clock}" -> "1:30:00" ``` `{clock}` needs at least two fields to be a clock, so on a single-unit code (`%tm`, `%tml`, …) it falls back to the default wording rather than emitting a bare number. **Where seconds actually tick.** The ringing alarm screen re-resolves every second when the template asks for second-level detail (`%ts` or `{clock}`). **Notifications still refresh only once a minute**, so a `{clock}` there shows an exact value that then holds for a minute before jumping. For a genuinely ticking notification countdown, use a **Countdown** alert instead — the system ticks that one natively, at no battery cost. --- ## Event date and time Date and time of the event. | Code | Result | Example | |------|--------|---------| | `%Ed` | Event date (locale format) | `"29 May 2026"` | | `%ED` | Event date short | `"29/05/26"` | | `%Ei` | Event date ISO | `"2026-05-29"` | | `%Ew` | Day of week | `"Thursday"` | | `%EW` | Day of week short | `"Thu"` | | `%Et` | Event time 24-hour | `"14:00"` | | `%ET` | Event time AM/PM | `"2:00 PM"` | | `%Ee` | Event end time | `"15:00"` | --- ## Event properties | Code | Result | Example | |------|--------|---------| | `%l` | Location | `"Meeting Room A"` | | `%L` | Location short (before comma) | `"Meeting Room"` | | `%g` | Tag name | `"Work"` | | `%G` | Tag colour (hex) | `"#9C6B2E"` | --- ## System | Code | Result | Example | |------|--------|---------| | `%n` | Current time | `"09:45"` | | `%N` | Current date | `"29 May 2026"` | --- ## Examples ### Simple reminders ``` "%t alert" → "Team Standup alert" "%t in %tm minutes" → "Client call in 45 minutes" ``` ### Full descriptions ``` "%t - %tf to start" → "Q2 Planning - 1 day, 3 hours to start" "%t (%df{compact} total)" → "Sprint Review (2h 30m total)" ``` ### With date and time ``` "%t at %Et on %Ew" → "Conference trip at 09:00 on Saturday" "%t %Ew %Ed %ET" → "Board meeting Thursday 29 May 2:00 PM" ``` ### With location ``` "%t at %l" → "Team Standup at Meeting Room B" "%t @ %L" → "Client call @ Conference Room" ``` ### Complex example ``` "%t tomorrow at %Et (%tf away)" → "Project kickoff tomorrow at 14:00 (1 day, 2 hours away)" ``` --- ## Escaping To include a literal `%`, use `%%`: ``` "100%% done with %t" → "100% done with Team Standup" ``` --- ## Unknown variables If a variable is used but not available (e.g., `%l` when no location is set), it resolves to an empty string. ``` "%t at %l" → "Team Standup at " (if location not set) ```