tomatophp/filament-discord
Connects your Filament admin panel to Discord. Send notifications and alerts to Discord channels via webhooks, manage integration settings from a simple Filament page, and keep your team informed without leaving the dashboard.
Architecture fit. The package occupies a deliberately narrow seam: it turns an existing Filament\Notifications\Notification into an outbound Discord webhook POST. There is no new datastore, no queue worker requirement, no auth surface beyond the panel's own settings page. For a Filament panel, that means adoption is additive — it rides on the notification object the panel already constructs, so it does not force a refactor of how resources, hooks, or observers emit signals. The important architectural caveat is that this is the Filament notification object, not Illuminate\Notifications\Notification; there is no via()/toDiscord() channel abstraction here. Any existing Laravel-native notification architecture is a parallel system, not an integration point.
Integration feasibility. High, with a short list of preconditions. The API surface is small enough to read end-to-end in one sitting (src/ plus config/filament-discord.php), and v5.0.0 ships a test suite that fakes Discord HTTP calls — meaning the payload shapes and config keys are documented in executable form rather than prose. Publish the config, set DISCORD_WEBHOOK_URL in .env, verify the exact send method against the tests (not the README, and definitely not the package description), smoke-test from Tinker before wiring lifecycle hooks. A day of effort, not a sprint.
Technical risk. The dominant risk is dependency, not technology. Two stars, zero dependents, no support contract: treat this as unmaintained-by-default, pin the exact version, and wrap every vendor call behind an internal Ops::alert() helper so a rename or abandonment costs an afternoon rather than a migration. Secondary risks: (1) silent failure — v5 skips sends entirely when no webhook is configured, and the error reporter never throws, so a typo'd env key and a working setup are indistinguishable from the UI; (2) coupling to a Filament major — v5.0.0 is Filament v5 / Laravel 12–13 only, with no release spanning both lines; (3) credential exposure — the webhook URL is a bearer token, including the separate error webhook; (4) injection — user-derived content passed verbatim can carry @everyone or <@id> mention sequences.
Key questions.
v3 branch with unfixed PHP 8.4 deprecations.Stack fit. Requires Laravel 12/13 + Filament v5 for the ^5.0 line; PHP 8.4 deprecations are fixed there. The integration expects Filament notifications as the emission mechanism and environment/config for the destination. Nothing about the app's broader stack constrains it.
Migration path. Do not install unconstrained. Resolve the correct line first (composer show -a tomatophp/filament-discord), then pin explicitly — ^5.0 for Filament v5, the v3 tag line for Filament v3 panels. Publish the config rather than committing secrets; webhook URLs live in .env only. Then wrap: create app/Support/Ops.php or similar exposing alert(title, body, severity), and forbid direct vendor-namespace imports elsewhere in the codebase. This is the single highest-value decision in the whole adoption and costs an hour.
Compatibility. Two hard constraints to design around. First, Filament-major compatibility is binary — there is no release that spans v3 and v5, so this cannot be adopted independently of a panel upgrade decision. Second, Discord-side limits are real: ~2000 characters per message (truncate to ~1900 with Str::limit), 10 embeds, and roughly 30 requests/minute per webhook. Anything high-volume needs batching before it needs code.
Sequencing.
.env.Ops wrapper with response-status logging and mention escaping.#errors webhook.success/info → activity, warning/danger → alerts).Maintenance. Low code churn, non-trivial ownership. The package is small and the surface is stable, but the maintenance burden we accept is pin-and-watch: track upstream tags against our Filament version, and hold a fork contingency. Keep the vendor notification class copyable into app/ if upstream stalls on a future Filament release. Because we own the Ops wrapper, payload formatting (embeds, colors, field ordering) stays under our control regardless of what upstream does.
Support. There is none. MIT license, two stars, no SLA, no security review, no CVE process. That is acceptable for a tactical utility and disqualifying as core infrastructure. Record that acceptance explicitly rather than rediscovering it during an incident.
Scaling. Not a scaling risk at current volumes; a rate-limit incident at higher ones. Per-webhook limits (~30/min plus burst behaviour) mean a created observer on a busy model will produce 429s quickly. The mitigations are structural, not config: implement ShouldQueue on the wrapper, batch or debounce per-event emissions, and prefer scheduled rollup commands over message-per-event. Discord is a paging surface, not an audit log — if we find ourselves needing delivery guarantees or history, we've mis-scoped the tool.
Failure modes.
config:cache staleness → Discord. Never assume the send path.Ramp-up. Effectively zero for a Laravel developer — the whole package is an afternoon's read, and the fake-HTTP test suite doubles as onboarding material. The real ramp-up cost is organisational, not technical: teaching the team that silence is ambiguous, that the send path fails quietly, and that non-developers can now broadcast from a small panel page or header action. Budget for a short internal writeup and a smoke-check habit; that is what converts this from a demo into day-to-day utility.
How can I help you explore Laravel packages today?