Notifications & Web Push
Chatto has persistent in-app notifications and optional browser Web Push. Operators configure whether push is available; members decide which rooms, threads, and devices should alert them.
How Notifications Work
Section titled “How Notifications Work”Chatto creates persistent notifications for attention-worthy events:
| Event | Default behavior |
|---|---|
| DM messages | Notify the recipient. |
Direct @username mentions | Notify the mentioned user. |
Role, @all, and @here mentions | Notify matching recipients, with confirmation for broad sends. |
| Replies to your message | Notify you. |
| Followed thread replies | Notify followers. |
| Rooms set to all messages | Notify for every root message in that room. |
Notifications are stored for the user, survive browser restarts, sync across tabs and devices, and expire after 90 days. Dismissing a notification clears it everywhere for that user.
Notification Levels
Section titled “Notification Levels”Members can choose notification levels per room:
| Level | Effect |
|---|---|
| Default | Inherit the parent/default behavior. |
| Muted | Suppress notifications and unread sidebar state for that room. |
| Normal | Notify for mentions, DMs, and thread replies. |
| All messages | Notify for mentions, DMs, thread replies, and every root message. |
Muted rooms suppress mentions too. Treat mute as “leave this room out of my attention surface.”
Do Not Disturb
Section titled “Do Not Disturb”Do Not Disturb does not discard notifications. Chatto still records the pending notification and updates counts, but suppresses interruptive delivery while the user is in DND:
- no notification sound
- no Web Push delivery
- no active interruption
This preserves “review later” behavior without waking the user’s devices.
Enable Web Push
Section titled “Enable Web Push”Web Push is disabled until you provide VAPID keys. Without push config, Chatto hides the push UI entirely.
Generate VAPID keys:
npx web-push generate-vapid-keysThen configure Chatto:
[push]enabled = truevapid_public_key = "<generate-me>"vapid_private_key = "<generate-me>"vapid_subject = "mailto:admin@example.com"CHATTO_PUSH_ENABLED=trueCHATTO_PUSH_VAPID_PUBLIC_KEY=<generate-me>CHATTO_PUSH_VAPID_PRIVATE_KEY=<generate-me>CHATTO_PUSH_VAPID_SUBJECT=mailto:admin@example.comUse a mailto: or HTTPS contact URI for vapid_subject. Keep the private key secret and stable; changing it can invalidate existing browser subscriptions.
Device Behavior
Section titled “Device Behavior”Each browser or installed PWA creates its own subscription. A user can have multiple subscribed devices, and each device receives the same push notification.
When a user reopens Chatto, the app refreshes the server’s stored subscription for that browser. Expired subscriptions are cleaned up automatically when push providers report them as gone.
Chatto sends regular notifications in a declarative-compatible Web Push format, with service-worker reconciliation where available and declarative display/badge fallback where supported. Operators do not need to change VAPID keys or push configuration for this behavior.
On iOS and iPadOS, Web Push works only for supported Home Screen web apps. Safari tabs that are not installed as an app may not receive native push.
Operator Checklist
Section titled “Operator Checklist”- Set
webserver.urlto the public HTTPS origin. - Enable Web Push with stable VAPID keys.
- Keep the service worker path reachable through your proxy.
- Test from a normal member account, not only an owner account.
- Test one desktop browser and one mobile installed PWA if mobile push matters.
- Explain to members that push is per device and opt-in.