Skip to content

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.

Chatto creates persistent notifications for attention-worthy events:

EventDefault behavior
DM messagesNotify the recipient.
Direct @username mentionsNotify the mentioned user.
Role, @all, and @here mentionsNotify matching recipients, with confirmation for broad sends.
Replies to your messageNotify you.
Followed thread repliesNotify followers.
Rooms set to all messagesNotify 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.

Members can choose notification levels per room:

LevelEffect
DefaultInherit the parent/default behavior.
MutedSuppress notifications and unread sidebar state for that room.
NormalNotify for mentions, DMs, and thread replies.
All messagesNotify 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 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.

Web Push is disabled until you provide VAPID keys. Without push config, Chatto hides the push UI entirely.

Generate VAPID keys:

Terminal window
npx web-push generate-vapid-keys

Then configure Chatto:

[push]
enabled = true
vapid_public_key = "<generate-me>"
vapid_private_key = "<generate-me>"
vapid_subject = "mailto:admin@example.com"

Use a mailto: or HTTPS contact URI for vapid_subject. Keep the private key secret and stable; changing it can invalidate existing browser subscriptions.

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.

  1. Set webserver.url to the public HTTPS origin.
  2. Enable Web Push with stable VAPID keys.
  3. Keep the service worker path reachable through your proxy.
  4. Test from a normal member account, not only an owner account.
  5. Test one desktop browser and one mobile installed PWA if mobile push matters.
  6. Explain to members that push is per device and opt-in.