What problem does this solve?
Notification channels are all external (email, webhook, Slack). If no channel is configured, events are silently dropped. There is also no way to scope notification recipients to a specific project — all alerts go to the same global channels, regardless of which project triggered them.
Proposed solution
In-app notification inbox
- Bell icon in the dashboard header with unread count badge
- Dropdown/panel listing recent events: icon, title, timestamp, details link
- Mark as read individually or all-at-once
- Persisted per user (not per browser session)
- Retention: configurable (default 30 days or last 200 events)
- Serves as a zero-config fallback: even without external channels, operators see what happened
Per-project notification recipients
- Each project can define its own notification channels, overriding or extending global ones
- Use case: project owner receives budget alerts for their project only; global admin receives everything
- Config:
project.notifications.channels array, same format as global channels
- Project-level rules can also override global cooldowns for that project's events
Alternatives you've considered
Using only external channels. Requires upfront configuration and creates a chicken-and-egg problem: if the first budget alert fires before the admin has configured email, it is lost.
Who would benefit from this?
- The in-app inbox benefits all users, especially during initial setup before external channels are configured
- Per-project recipients benefit multi-tenant deployments where different teams own different projects
Additional context
The in-app inbox can be implemented as a lightweight append-only log in the config layer (or shared state backend when available) without requiring a full database.
What problem does this solve?
Notification channels are all external (email, webhook, Slack). If no channel is configured, events are silently dropped. There is also no way to scope notification recipients to a specific project — all alerts go to the same global channels, regardless of which project triggered them.
Proposed solution
In-app notification inbox
Per-project notification recipients
project.notifications.channelsarray, same format as global channelsAlternatives you've considered
Using only external channels. Requires upfront configuration and creates a chicken-and-egg problem: if the first budget alert fires before the admin has configured email, it is lost.
Who would benefit from this?
Additional context
The in-app inbox can be implemented as a lightweight append-only log in the config layer (or shared state backend when available) without requiring a full database.