PHPackages                             prodstarter/filament-notification-center - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. prodstarter/filament-notification-center

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

prodstarter/filament-notification-center
========================================

Extend Filament's notification drawer with customizable tabs and notification categories for a cleaner, more organized user experience

v1.0.1(1mo ago)55.8k↑443.4%1[2 PRs](https://github.com/prodstarter/filament-notification-center/pulls)2MITPHPPHP ^8.2CI passing

Since Jul 10Pushed 2w agoCompare

[ Source](https://github.com/prodstarter/filament-notification-center)[ Packagist](https://packagist.org/packages/prodstarter/filament-notification-center)[ Docs](https://github.com/prodstarter/filament-notification-center)[ GitHub Sponsors](https://github.com/prodstarter)[ RSS](/packages/prodstarter-filament-notification-center/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (2)Dependencies (10)Versions (3)Used By (2)

Filament Notification Center
============================

[](#filament-notification-center)

**A smarter notification experience for Filament — categorized tabs for the notification drawer, with zero changes to how you already send notifications.**

[![Latest Version on Packagist](https://camo.githubusercontent.com/2ef9c3226666fc0026c426a5342b2e548f3404dbdd91408e1b175dea8c4e22db/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f70726f64737461727465722f66696c616d656e742d6e6f74696669636174696f6e2d63656e7465722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/prodstarter/filament-notification-center)[![Tests](https://camo.githubusercontent.com/62351f88c24ca524f5fa19a86f3c2d99ce9bf3230011575cbab1f5a8604aff07/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f70726f64737461727465722f66696c616d656e742d6e6f74696669636174696f6e2d63656e7465722f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/prodstarter/filament-notification-center/actions?query=workflow%3Arun-tests+branch%3Amain)[![Code Style](https://camo.githubusercontent.com/2e290ca2a3caa4d3d224258523f4d8cca856d16bb66ce58728a2d1731bd18318/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f70726f64737461727465722f66696c616d656e742d6e6f74696669636174696f6e2d63656e7465722f6669782d7068702d636f64652d7374796c652d6973737565732e796d6c3f6272616e63683d6d61696e266c6162656c3d636f64652532307374796c65267374796c653d666c61742d737175617265)](https://github.com/prodstarter/filament-notification-center/actions?query=workflow%3A%22Fix+PHP+code+styling%22+branch%3Amain)[![Total Downloads](https://camo.githubusercontent.com/11bced6256b233148b60b9052cd1292849b93cf1042e20960cb51457de6fe4c8/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f70726f64737461727465722f66696c616d656e742d6e6f74696669636174696f6e2d63656e7465722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/prodstarter/filament-notification-center)

[Installation](#installation) · [Features](#features) · [Usage](#usage)

---

[![Filament Notification Center](art/notification-center.png)](art/notification-center.png)

Why Filament Notification Center
--------------------------------

[](#why-filament-notification-center)

Filament's built-in notification drawer is intentionally simple: a single, flat, chronological list. That's fine for small apps, but once a panel starts receiving notifications from many different parts of a system — orders, billing, CRM, system alerts — a flat list quickly becomes hard to scan.

Filament Notification Center replaces the drawer's contents with **categorized tabs**, each with its own unread badge, while keeping every existing Filament notification API working exactly as before. There's no new way to send a notification — you just add `->category(...)` to the `Notification::make()` chain you already use.

Features
--------

[](#features)

- 🗂️ **Categorized tabs** in the notification drawer — "All" plus one tab per category you register, each with an unread count badge.
- 🔌 **Drop-in compatible** — `Notification::make()->title(...)->sendToDatabase($user)` keeps working unmodified. Add `->category('orders')` to file it under a tab.
- 🧩 **Per-panel configuration** — register a different set of categories per panel (admin, vendor, customer, ...) via the plugin instance.
- 🏷️ **Enum-friendly** — register categories as plain objects or as `BackedEnum` cases implementing Filament's `HasLabel` / `HasIcon` / `HasColor` contracts.
- 🎯 **No schema changes** — the category is stored in the existing notification `data` payload, so there's no migration to run and no risk to your existing notifications table.
- 🎨 **Looks native** — built entirely from Filament's own UI components (`x-filament::tabs`, `x-filament::modal`, `x-filament::empty-state`), so it matches your panel's theme, including dark mode.
- 📥 **Built-in import/export tabs** — enable dedicated "Imports"/"Exports" tabs in the config for Filament's import and export action completion notifications.
- 🧪 **Fully tested** — Pest test suite covering category filtering, unread counts, and the notification macro.

Requirements
------------

[](#requirements)

- PHP 8.2+
- Filament 5.0+

Installation
------------

[](#installation)

Install the package via Composer:

```
composer require prodstarter/filament-notification-center
```

That's it — there's no migration to publish. Categories are stored inside the same `data` column your `notifications` table already has.

If you want to customize the default category name or override the empty-state text/behavior for every panel, you can publish the config file:

```
php artisan vendor:publish --tag="filament-notification-center-config"
```

This is the contents of the published config file:

```
return [
    // The category ID that notifications sent without an explicit ->category()
    // are grouped under in the notification center drawer.
    'default_category' => 'general',
];
```

Usage
-----

[](#usage)

### 1. Register the plugin on a panel

[](#1-register-the-plugin-on-a-panel)

In your panel provider, register the plugin and define its categories. This replaces Filament's built-in notification drawer component for that panel — make sure `->databaseNotifications()` is enabled.

```
use Filament\Panel;
use Filament\Support\Colors\Color;
use Filament\Support\Icons\Heroicon;
use Prodstarter\FilamentNotificationCenter\FilamentNotificationCenterPlugin;
use Prodstarter\FilamentNotificationCenter\NotificationCenterCategory;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->databaseNotifications()
        ->plugins([
            FilamentNotificationCenterPlugin::make()->categories([
                NotificationCenterCategory::make('system')
                    ->label('System')
                    ->icon(Heroicon::Cog6Tooth)
                    ->color(Color::Gray)
                    ->order(1),
                NotificationCenterCategory::make('orders')
                    ->label('Orders')
                    ->icon(Heroicon::ShoppingBag)
                    ->color(Color::Amber)
                    ->order(2),
                NotificationCenterCategory::make('crm')
                    ->label('CRM')
                    ->icon(Heroicon::Users)
                    ->color(Color::Blue)
                    ->order(3),
                NotificationCenterCategory::make('billing')
                    ->label('Billing')
                    ->icon(Heroicon::CreditCard)
                    ->color(Color::Emerald)
                    ->order(4),
            ]),
        ]);
}
```

Because categories are registered on the plugin *instance*, different panels in the same app (e.g. `admin` and `vendor`) can each have their own set of tabs.

### 2. Send a categorized notification

[](#2-send-a-categorized-notification)

Nothing about sending notifications changes — just add `->category()` to the chain:

```
use Filament\Notifications\Notification;

Notification::make()
    ->title('New order #1042 received')
    ->icon('heroicon-o-shopping-bag')
    ->color('warning')
    ->category('orders')
    ->sendToDatabase($user);
```

Notifications sent **without** a category (including ones sent by other packages, or code written before you installed this plugin) automatically appear under the "General" tab, so nothing existing breaks when you add the plugin.

### 3. Use enums instead of raw strings (optional)

[](#3-use-enums-instead-of-raw-strings-optional)

`->category()` also accepts a `BackedEnum`. If the enum implements Filament's `HasLabel`, `HasIcon`, and/or `HasColor` contracts, the tab's label, icon, and color are read straight from it — no need to also define a `NotificationCenterCategory` for it.

```
use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasIcon;
use Filament\Support\Contracts\HasLabel;

enum NotificationCategory: string implements HasColor, HasIcon, HasLabel
{
    case Orders = 'orders';
    case Crm = 'crm';

    public function getLabel(): string
    {
        return match ($this) {
            self::Orders => 'Orders',
            self::Crm => 'CRM',
        };
    }

    public function getIcon(): string
    {
        return match ($this) {
            self::Orders => 'heroicon-o-shopping-bag',
            self::Crm => 'heroicon-o-users',
        };
    }

    public function getColor(): string
    {
        return match ($this) {
            self::Orders => 'amber',
            self::Crm => 'info',
        };
    }
}
```

```
FilamentNotificationCenterPlugin::make()->categories([
    NotificationCategory::Orders,
    NotificationCategory::Crm,
]);

Notification::make()
    ->title('New order #1042 received')
    ->category(NotificationCategory::Orders)
    ->sendToDatabase($user);
```

### 4. Customizing the default category and empty states

[](#4-customizing-the-default-category-and-empty-states)

```
FilamentNotificationCenterPlugin::make()
    ->categories([...])
    ->defaultCategory('general') // where uncategorized notifications land
    ->emptyStateUsing(fn (string $categoryId): array => [
        'heading' => "Nothing here yet",
        'description' => "You're all caught up in {$categoryId}.",
    ]);
```

### 5. Registering categories globally

[](#5-registering-categories-globally)

If every panel in your app should share the same categories, you can register them once via the `NotificationCenter` facade in a service provider's `boot()` method instead of repeating them per panel. A panel only falls back to this global registration if the plugin instance on that panel has no categories of its own.

```
use NotificationCenter;

NotificationCenter::categories([
    // ...
]);
```

### 6. Categorizing import/export notifications

[](#6-categorizing-importexport-notifications)

Filament's [import](https://filamentphp.com/docs/5.x/actions/import) and [export](https://filamentphp.com/docs/5.x/actions/export) actions send a completion notification to the user once the job finishes. Filament Notification Center can file these under their own "Imports" and "Exports" tabs.

Enable the tab you want in the published config — this alone controls whether the tab exists and how it's labeled/colored/ordered:

```
// config/notification-center.php
'imports' => [
    'enabled' => true,
    'category' => 'imports',
    'label' => 'Imports',
    'icon' => 'heroicon-o-arrow-up-tray',
    'color' => 'info',
    'order' => 90,
],
```

Filament calls `modifyCompletedNotification()` on your own `Importer`/`Exporter` class to let you customize the completion notification — there's no global hook for it, so add the matching trait to each `Importer`/`Exporter` you want tagged:

```
use Filament\Actions\Imports\Importer;
use Prodstarter\FilamentNotificationCenter\Concerns\CategorizesImportNotifications;

class ProductImporter extends Importer
{
    use CategorizesImportNotifications;

    // ...
}
```

```
use Filament\Actions\Exports\Exporter;
use Prodstarter\FilamentNotificationCenter\Concerns\CategorizesExportNotifications;

class ProductExporter extends Exporter
{
    use CategorizesExportNotifications;

    // ...
}
```

The trait's `modifyCompletedNotification()` reads the `enabled`/`category` config at send time, so flipping `enabled` back to `false` stops new notifications from being tagged without touching the Importer/Exporter class. If you already override `modifyCompletedNotification()` for your own customizations (changing the icon, adding actions, etc.), call the helper from inside it instead of using the trait directly:

```
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Notifications\Notification;
use Prodstarter\FilamentNotificationCenter\Concerns\CategorizesImportNotifications;

class ProductImporter extends Importer
{
    use CategorizesImportNotifications;

    public static function modifyCompletedNotification(Notification $notification, Import $import): Notification
    {
        $notification = static::categorizeImportNotification($notification);

        return $notification->icon('heroicon-o-shopping-bag');
    }
}
```

Testing
-------

[](#testing)

```
composer test
```

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details.

Security Vulnerabilities
------------------------

[](#security-vulnerabilities)

Please review [our security policy](.github/SECURITY.md) on how to report security vulnerabilities.

Credits
-------

[](#credits)

- [Stanley Ojadovwa](https://github.com/prodstarter)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

49

—

FairBetter than 94% of packages

Maintenance94

Actively maintained with recent releases

Popularity31

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity47

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

48d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1219663?v=4)[Stanley Ojadovwa](/maintainers/stanwarri)[@stanwarri](https://github.com/stanwarri)

---

Top Contributors

[![stanwarri](https://avatars.githubusercontent.com/u/1219663?v=4)](https://github.com/stanwarri "stanwarri (4 commits)")

---

Tags

laravelfilamentfilament-pluginfilamentphpprodstarterfilament-notification-center

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/prodstarter-filament-notification-center/health.svg)

```
[![Health](https://phpackages.com/badges/prodstarter-filament-notification-center/health.svg)](https://phpackages.com/packages/prodstarter-filament-notification-center)
```

###  Alternatives

[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3915.5k](/packages/rawilk-profile-filament-plugin)[backstage/mails

View logged mails and events in a beautiful Filament UI.

16429.7k](/packages/backstage-mails)[marcelweidum/filament-passkeys

Use passkeys in your filamentphp app

6758.2k2](/packages/marcelweidum-filament-passkeys)[stephenjude/filament-two-factor-authentication

Filament Two Factor Authentication: Google 2FA + Passkey Authentication

85240.3k10](/packages/stephenjude-filament-two-factor-authentication)[relaticle/custom-fields

User Defined Custom Fields for Laravel Filament

16461.2k](/packages/relaticle-custom-fields)[hammadzafar05/mobile-bottom-nav

A thumb-friendly mobile bottom navigation bar for Filament panels. It programmatically integrates with the Filament navigation registry to provide a seamless, ergonomic mobile experience with full support for dark mode and safe-area insets.

1821.3k2](/packages/hammadzafar05-mobile-bottom-nav)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
