Zvessa docs

Notifications

The Notify engine.

Every notification in Zvessa has a topic and goes through the person's own settings.

Topics #

TopicWhatStarts
talk.message, talk.reply, talk.mentionChatson
calls.ring (urgent), calls.missedCallson
social.reply, social.mentionFeedson
social.like, social.follow, social.repostFeedsdigest
reviews.new, reviews.reply, reviews.reportReviewson
apps.<appId>One mini-app's noteson
space.announceManagers' announcementson
your own, e.g. orders.newblueprint.notifications.topicson

A topic's group is the part before the dot. A rule for talk covers every talk topic; * covers all.

What a person chooses #

What a space sets (blueprint, propose → approve → undo) #

"notifications": {
  "topics": [{ "id": "orders.new", "name": "New orders", "about": "…", "mode": "on" }],
  "defaults": { "social": "digest", "orders.new": "on" },
  "digestAt": "18:00",
  "kidsQuiet": { "from": "20:00", "to": "07:00" },
  "inboxPage": "notifications"
}

Blocks #

Kits: Notifications (a page with inbox + settings), Announcements (a page with the send form). Without either, the bell and summaries open the built-in /notifications screen.

Where a tap goes #

link is an app path: /p/<page>, /c/<conversation>?thread=<id>, /dm/<user>, /post/<id>, /u/<handle>, /tag/<tag>, /s/<id>, /ai, /notifications, or the short form page:<pageId>. Anything else is dropped.

AI and MCP #

ToolScopeDoes
my_notificationsmeTopics here with their mode and where it comes from; quiet hours, pause, digest, spaces
change_my_notificationsme{ rules: [{ topic, mode, space? }], quiet, digestAt, pause }; applies now, undoable
undo_my_notificationsmeBack to before the last change
my_inboxmeRecent notifications
send_notificationnotifyManagers only, 10 an hour per space; outside AIs only

The in-app AI has me. Space settings change with propose_change on /notifications.

From a kit (server) #

import { notify } from "convex/notify";
await notify(ctx, { userIds, topic: "orders.new", workspaceId, title, body, link: "page:orders", group: `order:${id}`, from });

Mini-apps: notify.members({ title, body?, to?, page? }) sends on apps.<appId>.