jeffersongoncalves/filament-pwa
Filament PWA adds Progressive Web App support to Filament panels, making admin apps installable and more app-like with a web app manifest, service worker integration, and customizable PWA settings for Laravel projects.
Architecture fit. From a TPM lens, the first thing to internalize is that this is not a PWA implementation — it is a head-markup injector. The package registers a Filament panel plugin and appends <head> tags (manifest link, theme-color, Apple touch icons, msapplication-* tiles) through Filament's render hooks, delegating markup generation to laravel-pwa-favicon, which in turn pulls jeffersongoncalves/laravel-favicon. That is a three-package chain from a single maintainer to emit roughly fifteen lines of static HTML. It fits the Laravel/Filament architecture cleanly — Composer package, service provider, Plugin contract, publishable config — and adds no runtime, datastore, middleware, or build step. The abstraction depth is disproportionate to the output, so underwrite this as a convenience wrapper whose real value is that someone else owns the icon-set and config surface, not as a capability platform.
Scope gap — the central product risk. The name promises "PWA"; the delivery is metadata only. Genuine installability needs a manifest, icons, and a service worker over HTTPS. This package ships no service worker, no offline caching, no push, no background sync, and no install-prompt handling. Two consequences follow. First, any stakeholder who hears "PWA" will expect offline behavior and will not get it — set that expectation in the ticket title itself: "home-screen icon and browser-chrome branding for the admin panel." Second, the omission is defensible: a service worker caching authenticated Filament HTML is a genuine staleness and data-exposure hazard. Frame the restraint as a deliberate security posture and write it into the decision record so it is not later read as an incomplete delivery.
Integration feasibility. Low effort, low blast radius, fully reversible. Install, register the plugin on one panel, publish config, supply an icon set. No migrations, no middleware, no auth surface changes, no schema. Estimate 1–2 hours for a Laravel-fluent engineer — and note that most of that is generating and curating icon assets, not wiring code. Budget design time, not engineering time. The genuine TPM leverage here is recognizing that the decision is cheap to make correctly and expensive to make by default.
Technical risk.
laravel-pwa-favicon ^2.0. Any breaking change upstream blocks this package until the author catches up; you inherit version lag you cannot patch locally without forking.Content-Security-Policy headers on admin panels routinely block manifest or icon fetches, and they fail as console-only errors rather than visible breakage — the worst kind of failure to discover late.theme-color needs a media="(prefers-color-scheme: dark)" variant to match Filament's dark theme; unclear whether it is emitted.Key questions to resolve before commit.
theme-color variants emitted?Stack fit. Native to the existing Laravel/Filament stack — Composer, service provider, panel plugin registration, published config. It composes with Filament's theme and asset-publishing conventions rather than competing with them, so there is no frontend toolchain impact and no new deployment artifact beyond the icon set. For a TPM, that means no cross-team coordination, no release-train coupling, and no infrastructure ticket.
Recommended path: timeboxed spike, then an explicit build-vs-buy call. Run the spike on one non-production panel. In parallel, have an engineer prototype the equivalent in roughly 30 lines: a PanelsRenderHook::HEAD_END callback plus a Blade partial holding the icon and manifest markup. If the in-house version reaches parity inside a day, build it in-house — it removes a three-package, single-maintainer dependency for static markup and hands you direct control over CSP, dark mode, and per-panel configuration. Adopt the package only if its config surface and icon-generation ergonomics are demonstrably better than the prototype. This is the primary decision to force: "is a one-day in-house render hook cheaper than owning a low-adoption transitive dependency chain?" Reversibility is high either way, so resist the urge to over-deliberate.
Migration path. Purely additive; no data migration, no backfill, no cutover window. Sequence:
config/ rather than editing vendor defaults.Compatibility. Confirm the Filament major you run is inside the tested range — a plugin passing on v3 is not evidence for v4. Verify the render hook used still exists in your Filament version, and that no other plugin already injects theme-color or a manifest link; last-writer-wins produces confusing, hard-to-diagnose output. Check behavior behind any CDN that caches HTML, since a cached head is harder to invalidate than a cached asset.
Sequencing and rollback. Ship behind panel-level enablement so rollout is incremental and observable. Rollback is deleting the plugin registration — no schema, no data, no user-facing state. That reversibility is the package's strongest attribute and by itself justifies a trial at low confidence. Pair it with a pre-agreed fallback: inline the tag block in a render hook and drop the dependency.
Decision criteria. Adopt if the spike is clean, Filament support is confirmed against your version, per-panel config works, and CSP/dark-mode output is acceptable. Decline if any of the six key questions is unanswerable, if Filament v4 support is unclear, if strict CSP requires nonces the plugin cannot emit, or if the in-house prototype reaches parity within a day.
Maintenance. The surface is small — one plugin registration, one config file, one icon set — so routine maintenance is near zero. The real maintenance load is upstream vigilance: three packages, one maintainer, and a release history where 2.1.0 was only a dependency bump. Assign explicit ownership of upstream release review and put a recurring compatibility check against Filament major upgrades on the platform calendar. Treat this as an approved-dependency policy decision — version pinning, lockfile commits, fork readiness — rather than a technical debate.
Support. There is no SLA, no security response commitment, and no commercial backing; MIT license and a single maintainer. Support for your own users lands entirely on the internal team. For an internal admin panel that is usually acceptable, but state it in the decision record so nobody later assumes a vendor relationship exists.
Scarcity and scaling. The package scales in the trivial direction — static markup costs nothing per user, request, or tenant in compute terms. It does not scale in the organizational direction without deliberate work: each additional Filament panel, domain, or white-label tenant introduces another manifest and icon set to curate and verify. Before committing to multi-tenant use, confirm config is genuinely panel-scoped. If branding must be dynamic or per-tenant at runtime, assume a static head injector will not cover it and plan to build.
Failure modes to monitor.
laravel-favicon change breaks the chain and cannot be patched locally without forking. Keep the in-house fallback documented and cheap to execute.Ramp-up. For an engineer already fluent in Laravel and Filament, this is effectively zero ramp-up: composer install, plugin registration, publish config, drop in icons. The realistic cost is design time for icon assets and the discipline to test the emitted head, not learning curve. For a TPM, the ramp-up that matters is communication, not engineering: get the "branding plus home-screen install, not offline admin" boundary into the ticket, the roadmap note, and the demo script before the first stakeholder sees the word "PWA."
How can I help you explore Laravel packages today?