caiquebispo/notification-bell
An elegant, framework-agnostic Laravel notification bell for Livewire with per-user preferences, sound and category controls, dark mode, and a zero-build delivery pipeline. No Tailwind, Bootstrap, or npm needed—install via Composer, drop the component in your layout, done.
Verdict: A feature-dense, single-maintainer package that is attractive as a UI layer for in-app notifications but unsuitable, as-is, to become the notification backbone of a revenue-critical system. Two stars and zero dependents mean we would be the de facto first production reference — our incident reports become the project's bug tracker.
Architecture fit
Notifiable / DatabaseNotification pipeline. It ships its own model, table(s), dispatcher (NotificationHelper), preferences store, REST API, admin panel and history page. Adopting it means either (a) dual-writing from every existing notify() call site, or (b) migrating existing database notifications into its schema. Neither is free, and both create two sources of truth for "unread count."Integration feasibility
composer require, migrate, one trait, one Blade tag, optional publishing). Publishing is opt-in, which is the right call — it preserves a clean upgrade path as long as we resist customizing views.vendor/ via a package route is the most under-appreciated integration decision. It bypasses the asset pipeline (no Vite, no cache-busting hash, no CDN), adds a per-page HTTP request to PHP for a static file, and makes styling a package concern rather than ours. Fine for an internal tool; awkward for a high-traffic public surface.composer update is the single biggest deploy-pipeline hazard. Composer runs in CI images, build containers and read-only environments with no database. A guard that inspects or mutates schema at composer time is exactly the kind of thing that fails builds or, worse, half-migrates production. Must be read/verified before any deploy.Technical risk
notifications table collides conceptually (and possibly literally) with Laravel's default notifications table from php artisan notifications:table. If we already use the database channel, this is a hard stop until confirmed./notifications and a history page at /notifications/history. Default middleware is not evidenced in the README — the example shows role:admin, which implies a Spatie-style gate we may not have. A misconfigured default could expose cross-user notification data. Verify defaults, then disable both routes we don't want via config.notifications.{user_id} is a generic name likely to clash with host conventions; authorization must be registered in routes/channels.php or real-time silently degrades to polling.v/unstable badge), and a truncated "deploy safety" section — the documentation itself is unfinished at the point where it matters most.Key questions to resolve before adoption
notifications / any existing schema?boot, composer script, migration)? Does it no-op safely with no DB connection?Notifiable notifications, or is dual-write the only path?Stack fit
Migration path
App\Notifications\BellDispatcher) that wraps NotificationHelper so call sites depend on our interface, not the package's static helper. This is cheap now and is the difference between a two-week swap and a rewrite later.Compatibility
composer.json (no ^), and commit the lock. Pre-1.0 with one maintainer means minor bumps can be breaking.php artisan config:cache) — config-driven theming must survive it.auth:sanctum-grade, not web alone, before enabling.Sequencing
packages/ if upstream goes quiet).Maintenance
notifications:cleanup must be scheduled (daily) or the table grows unbounded. This is a silent-failure class — nothing breaks until queries and storage do.Support
Scaling
notifications:send-bulk --all-users fans out to the entire user base with a per-user rate cap of 30/min — that cap protects the user, not the queue. Bulk sends need batching/backpressure planning; use --dry-run patterns and schedule off-peak.user_id, read_at). If we enable broadcasting, we now own Reverb/Pusher channel authorization and an additional failure surface.Failure modes to instrument
composer install in CI/build → blocked deploys or partial migration. Mitigation: verify it no-ops without a DB; run composer with --no-scripts in build stages if needed.Ramp-up
How can I help you explore Laravel packages today?