Designing Actionable Notification UX
Use this page to build a notification center that drives actions, not noise.What to build
- Inbox list with scope/severity/read filters.
- Per-item actions (read, unread, archive, star).
- Bulk actions (mark-all-read, archive-all-read).
- Realtime stream for new notifications.
API and hook surface you already have
Fromuse-notifications.ts and use-notification-stream.ts:
GET /notificationsPOST /notifications/:id/readPOST /notifications/:id/unreadPOST /notifications/:id/archivePOST /notifications/:id/starPOST /notifications/mark-all-readPOST /notifications/archive-all-read- WebSocket
/realtime/notifications
Step 1: build inbox list with useful filters
is_archived: false- newest first
- unread highlighted
Step 2: wire item-level actions
useNotifications already exposes mutation actions:
markAsRead(notificationId)markAsUnread(notificationId)archiveNotification(notificationId)starNotification(notificationId)
Step 3: add bulk actions
Use existing handlers from the same hook:markAllAsRead()archiveAllRead()
Step 4: enable realtime updates
useNotifications internally wires useNotificationStream and prepends new notifications into first page.
Step 5: make notifications consistently actionable
Every template should include:- Clear title with cause.
- Body with affected entity.
- CTA that opens exact problem location.
- Severity aligned with urgency.
Related docs
Validation checklist
- Read/unread/archive/star states stay correct after reload.
- New notifications appear without manual refresh.
- Channel/scope filters constrain stream and list correctly.
- Bulk actions affect only currently filtered set.
