Skip to content

[Feature] In-app notification inbox and per-project notification recipients #91

@carlosatta

Description

@carlosatta

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions