notifier
By Piet de Vries · created 14 Apr 2025, 08:30 UTC · last updated 22 Oct 2026, 15:40 UTC · version 15
notifiermailcresttextbridgenoticesarchitecture
Repository: Emargen/acme-notifier · Owner: Elif Yildiz (since June 2026; Piet de Vries before) · Stack: TypeScript on Node.js 20
notifier tells people things. It sends notice emails through Mailcrest, SMS codes through Textbridge, and in-app notices to the bell in the portal. It decides nothing about access: it reacts to identity-service's events. This page replaces the 2021 notes.
What it sends
| Notice | Trigger | In-app | SMS | |
|---|---|---|---|---|
| Request waiting | access_request.created | to the approver | yes | – |
| Reminder | identity-service's reminder job | to the approver | yes | – |
| Decision made | access_request.decided | to the person who asked | yes | – |
| Single sign-on switched on for a depot | depot.sso_enabled | to the client's administrators | yes | – |
| Requests moved to you | access_request.moved (since 22 October) | one email per new approver | yes | – |
| Phone code | direct call from identity-service | – | – | yes |
The wording of each notice lives in src/templates/; Leo checks new templates for tone.
Mail: Mailcrest
Until 16 October, every client's email went through one Mailcrest account (src/send/sendNotice.ts used DEFAULT_ACCOUNT). That account is in Mailcrest's US region, and Mailcrest keeps message logs for 30 days where the account is. ACM-305 found this on 12 October while building Halden's EU notices: every notice to an EU client's people left a log in the US. Mira chose option b on 13 October: a second account in Mailcrest's EU region.
Since 16 October (ACM-304, switched over in OPS-50):
// src/send/sendNotice.ts
const account = provider.account(accountForRegion(client.region));
| Client region | Mailcrest account | Message logs kept |
|---|---|---|
| EU | EU account | in the EU, 30 days |
| UK | US account | in the US, 30 days |
| US | US account | in the US, 30 days |
Bounces and complaints come back by webhook per account. Both accounts share one suppression list, synced hourly. If mail stops: Runbook: notice emails not arriving.
SMS: Textbridge
Phone codes go out through Textbridge. identity-service calls POST /codes on notifier directly rather than through the queue, so a code leaves within a second. Delivery receipts come back by webhook; since OPS-33 an alarm fires when receipts lag more than five minutes. There is one SMS provider (ADR-013). If codes stop: Runbook: SMS codes not arriving.
In-app notices
Since 4 August the same events also make in-app notices, stored in notifier's own table per region and served to the portal's bell. They are kept 90 days. Read state is per person.
Events and idempotency
notifier reads the region's queue. Every event carries an id; notifier stores handled ids for seven days and drops repeats, because the outbox delivers at least once.
Change history
| Version | Date | Who | What |
|---|---|---|---|
| 9 | 28 May 2026 | Piet | SMS codes through Textbridge |
| 10 | 24 Jun 2026 | Elif | Ownership; receipt-lag alarm after OPS-33 |
| 11 | 5 Aug 2026 | Elif | In-app notices |
| 12 | 17 Sep 2026 | Elif | Mail library brought up to its latest release |
| 13 | 13 Oct 2026 | Elif | Mailcrest's US logs (ACM-305) |
| 14 | 16 Oct 2026 | Elif | EU account live; account picked by region |
| 15 | 22 Oct 2026 | Elif | Requests moved to you (ACM-320) |