← All privacy impact assessments
PIA: message text, and task and event titles, in notifications
Status: this assessment is HQ's PIA-010, approved with conditions N1–N20 by the founder on 25 October 2026 (F1–F3 as recommended), restated as built. Nothing here reaches anyone yet. It stays dark until three things are true together: the app on the phone carries privacy policy v3.15, which describes it; the phone has reported that it can show text (an Android phone has created the two private channels, an iPhone has sent a marker); and we have turned the server's switch on. Any one of them missing means every notification stays generic. Nothing here is legal advice.
It amends, dated, the content encryption assessment §3.9 ("every push generic"), targeted notices ("no title") and member and group types (the preview switch).
1. Purpose and scope
The founder's request, 25 October 2026: "Restore the ability of previews of messages etc to be shown in the pop up notifications. Default on." Showing someone what was said to them, in their own group, is the purpose of a chat message and of a task's title. It is a choice about display, not a new use.
In scope: a chat notification shows "Sam: " and the start of the message (about 140 characters), or "Sam sent a photo"; a new-task notification, a task or event reminder and the "added a task for you" notice show the task's or event's title. Out of scope, and generic as before: encrypted groups (no notification extension now), Device-only groups, baby handoffs and notes, Mail Sifter, the assistant, ceremonies, routines, event confirmations, cross-group events, glances and Live Activities. Notes, places and descriptions never appear in any notification.
2. Data involved
| Item | Holds | Leaves us to | Kept |
|---|---|---|---|
| Chat text | the start of a message or of a photo's caption (at most 140 characters, cut between whole characters), the sender's and the group's names | Expo (650 Industries, Inc., United States), then Apple's or Google's notification service (United States); the recipient's phone, lock screen, notification history, paired watch, car | Expo, Apple, Google: while delivering, and for an offline phone up to one day (§5); the phone: until dismissed |
| A title | a task's or event's title, at most 140 characters | the same | the same |
Nothing new is stored by us. The database already holds this text, unencrypted, for every group whose chat isn't encrypted (all groups made after 18 October 2026). What's new is the disclosure to three processors overseas and the display on surfaces outside the app. The database trigger sends the notification function ids only, and the function reads the row when the notification goes: no message text sits in the database's outgoing-request queue, its responses, our logs, our delivery record or the function's replies.
3. Who gets text (the gates)
Text appears only when every one of these holds at the moment of sending. If any can't be read, the notification is generic: it is never dropped for that reason, and it never carries text.
- The message, task or event is not encrypted, the group's chat encryption is off, and the group's privacy level can be read and isn't Device-only.
- The recipient has "Show message text in notifications" on. It's on unless they turned it off.
- The recipient is 16 or over, and isn't a child account with no birth month on record. The database checks this at every send, not only the switch: an older child account can still hold "on".
- The recipient is a person, not a wall (shared display) or a profile.
- The recipient's phone reported that it can show text (§4).
- The mute and block checks for that send succeeded. A muted member gets nothing, as before; a member who blocked the sender gets nothing, as before. If the mute check fails, nobody is muted (as before) and everybody gets the generic notification. If the block check fails, nobody is sent anything.
- Whoever wrote the words is 16 or over and isn't a child account with no birth month (F1): a message from such a child shows "Sam sent a message in Home". For a title, that's both the person who wrote the task or event and the person sending the notification about it.
- Our switch is on (§6).
Who gets a notification at all is unchanged: active members except the sender, minus mutes and blocks.
What the text is: the message's own words, with spaces and line breaks collapsed. Never the quote a reply carries, an attachment's name, a link to our storage, a signed link or an image. A photo with no caption is "Sam sent a photo"; a card, a shared plan, a reminder line or anything that isn't plain words gets the usual sentence. A title is the title only, read from the task or event itself when the notification goes, never from what the sender's phone said it was. A routine's title never shows, in any of the three title notifications.
4. Old phones and Android lock screens
Older app versions never get text. A phone reports what it can show when it registers for notifications: an Android phone lists the two new channels once it has created them, an iPhone adds a marker. The app creates the channels and sends the marker only once its bundled privacy policy is v3.15. So the switch, its explanation and the private channels are on a phone before any text can reach it, whatever order the server and the app are updated in.
On Android, words only once the phone is unlocked. Text goes only on the new "Messages that show the words"
and "Tasks and reminders that show titles" channels (names proposed), never on the existing channels, one of
which shows everything on the lock screen. A member's own Android setting wins: a phone reports a
private channel only while neither it nor the channel it mirrors is switched off, so someone who
turned off "Group Messages" doesn't start getting messages again, now with the words, and someone who
turns off a private channel still gets the generic notification on the old one. The phone reports
again every time the app comes back to the foreground, not only at launch, and our server trusts a
report for at most seven days: a phone that hasn't reported within a week gets the generic
notification until it does. So a channel switched off in Android settings while GroupApp is never
reopened can still get words for up to seven days (accepted by the founder, 29 October 2026; §9). Their lock-screen setting is permanent once a phone creates
them. PRIVATE hides the words on a locked phone only when the phone's own "sensitive content"
setting allows. On an Android 15 emulator at factory settings, with a PIN set, a PRIVATE
notification showed its whole text on the locked screen (checked 29 October 2026). So both channels
use SECRET, which shows nothing on a locked screen until the phone is unlocked (F3). That hides
the whole notification, not only its words: with text on, an Android member's task and event
reminders make their sound but don't appear on the lock screen until unlock, and the switch's helper
says so. The founder's physical-phone check confirms this before the release. On an iPhone, the phone's own Show Previews setting decides.
5. Overseas disclosure and the processors (APP 8)
Expo, Apple and Google already carry every notification we send and are named in the privacy policy. What changes is that some notifications now carry words. None of the three gives a retention commitment we can verify, so nothing we say claims the words "aren't stored" (R1).
- Expo (checked 29 October 2026): its Terms of Service (effective 30 June 2025, last updated
29 May 2025) say the app's operator is the controller of personal data in what it sends and Expo acts
as a processor for it, under the EU standard contractual clauses (module two), with a licence "solely
for the purposes of providing, developing, and improving the Services". Its push documentation says a
message is kept for redelivery for its
ttl, and that leavingttlout uses each provider's default of 4 weeks. - Google's Firebase Cloud Messaging (checked 29 October 2026): without a time to live a message lasts "a maximum period of four weeks"; the maximum is 2,419,200 seconds (28 days); a time to live of 0 discards a message that can't be delivered immediately.
- Apple's notification service: holds a notification for an offline device until its expiry and, per Apple's documentation as we understood it in writing PIA-010, keeps only the latest one per app. Apple's pages couldn't be re-read outside a browser on 29 October 2026; the expiry we set (below) bounds it either way.
So every notification carrying words sets a time to live of at most one day (a reminder: until one hour after its time, never more than a day), and Apple and Google drop it rather than hold it for weeks.
6. Turning it off without a release
A value in the database's Vault, read only by the notification functions, turns text on. Only the exact value "on" does; a missing, unreadable or different value means every notification is generic. It isn't set at release. We set it once the release is out; removing or changing it turns every notification back to generic within the next send. If text ever reaches anyone §3 excludes, we turn it off the same day, add an entry to this register, and fix the cause before turning it on again.
7. Children
Under 16: never text, whatever the switch holds; the switch shows as off with "Off. This is the same for every account under 16.", and the child's "What your parent can see" page lists it with the other settled settings. A child account with no birth month on record is treated as under 16. 16 and 17: on by default with their own switch (founder, 25 October 2026), as the Children's Code allows for older children given a clear notice in their own policy. A child who turns 16 keeps what the switch held (F2): nothing turns it on for them. A message from anyone under 16 shows only that they sent one (F1), so a child's words don't reach overseas processors or other people's lock screens.
8. Structural versus conventional
| Property | How it holds | Pinned by |
|---|---|---|
| The trigger sends ids only | the trigger's body | the database tests over the outgoing-request queue |
| Recipient gates (switch, age, child with no month, wall or profile) | one database function, service role only, booleans only | the recipient-gate database tests |
| Our switch fails closed | only the exact value "on" is true | the same tests |
| Every other gate fails closed, per recipient and per device | one shared gate every sender asks | the gate's unit matrix; each sender's handler tests |
| Only the four named senders may carry words, and each calls the gate | a register of senders in two lists | the generic-pushes check, with fixtures it must catch |
| No words in logs, replies or the delivery record | log lines carry codes, counts and error class names | the same check's log scan; handler tests with failing Expo and database fakes |
| Old app versions get no words | the phone reports the capability only under policy v3.15 | the phone's gate tests; the server's capability tests |
| Words after unlock on Android | the private channels' visibility, SECRET |
device check: the emulator showed PRIVATE leaks at factory settings; physical phone before release |
| The words shown on watches, cars and shared tablets | not ours to control (R2) | — |
9. Residual risks accepted (PIA-010 §7)
- R1 Processors. Expo, Apple and Google handle the words in the United States; their logs and offline queues aren't verifiable by us. Bounded by the one-day time to live and the policy's plain statement.
- R2 Surfaces we don't control. iOS lock screens, watches, CarPlay, Siri announcements, Android Auto, notification history, and a shared tablet signed in as a member show what arrives. A reminder keeps its time-sensitive delivery, so on an iPhone its title can break through a Focus.
- R3 No recall. A notification already delivered stays after the message is deleted or the member is removed. A message deleted before the notification goes isn't sent.
- R4 People who chose nothing. Children and others named in adults' messages and titles reach the processors and lock screens; a sender can't keep their own words out of others' notifications except by Device-only.
- R5 Secrets typed in chat. A password, safety words or a bank detail typed into a chat that isn't encrypted shows on lock screens; it can't be filtered.
- R6 Default on for existing members. Everyone who never turned previews off gets text after the update, told by the what-changed sheet rather than asked.
- R7 A channel switched off outside the app, for up to a week. A member who switches off a channel in Android settings and never reopens GroupApp can still get message text on it for up to seven days, until the phone's last report ages out; reopening the app closes it at once. Android offers no notice of a channel change. Accepted by the founder, 29 October 2026.
- Also: an Android phone keeps the private channels if a later app version is rolled back below this one; this version stops reporting them under the policy gate, but an older one would still list them. Our switch covers that case.
Amended 31 October 2026 (HQ PIA-016, reactions and deleting your own message). The read at send time (N2) now treats a deleted message as gone: a message deleted before its notification is sent gets no notification, the same answer as a message that is no longer there, and its "Message deleted" placeholder is never sent as text. A notification already delivered can't be withdrawn: notifications carry no id that would let us replace or remove one, so a phone may still show the start of a message its author has since deleted. The delete confirmation says so wherever a notification could have carried the words.
10. Review trigger
Reassess before: encrypted groups getting words (a notification extension, which needs its own assessment); any note, place, description, baby note, Mail Sifter or assistant text in a notification; a longer time to live; a group-level switch; any change to who gets a notification.
11. Sources
- HQ PIA-010,
pias/pia-010-notification-previews.md, approved 25 October 2026; HQ decision D96 (policy v3.15). - Migration
supabase/migrations/20261029012158_notification_previews.sql. supabase/functions/_shared/pushText.ts(the gate, the body, the time to live),supabase/functions/send-message-notification/handler.ts,supabase/functions/send-message-notification/payload.ts; for titles,supabase/functions/send-action-notification/handler.ts,supabase/functions/dispatch-task-reminders/index.tsandreminders.ts,supabase/functions/send-targeted-notice/handler.tsanddelivery.ts.lib/notificationPreviews.ts(the v3.15 gate, the channels, the capability),lib/notifications.ts,constants/chatPrivacy.ts,constants/privacyPromises.ts(P9).- Tests:
__tests__/push_text_gates.test.ts,__tests__/chat_sealing_rls.test.ts,supabase/functions/_shared/__tests__/pushText.test.ts,supabase/functions/send-message-notification/__tests__/handler.test.ts,lib/__tests__/notificationPreviews.test.ts,__tests__/app/settings-message-previews.test.tsx, the action and targeted-notice handler tests,supabase/functions/dispatch-task-reminders/__tests__/reminderTitles.test.ts;agent-server/checks/genericPushes.check.ts. - Expo Terms of Service, https://expo.dev/terms (effective 30 June 2025), and "Send notifications with the Expo Push Service", https://docs.expo.dev/push-notifications/sending-notifications/, both read 29 October 2026.
- Firebase Cloud Messaging, "Setting the lifespan of a message", https://firebase.google.com/docs/cloud-messaging/customize-messages/setting-message-lifespan, read 29 October 2026.
- Apple, "Sending notification requests to APNs" (the
apns-expirationheader), https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns; not re-read on 29 October 2026 (the page needs a browser).