ladumor/laravel-pwa
Add Progressive Web App support to any Laravel app in minutes: generates the manifest and service worker, enables offline caching, push notifications, and an install prompt, and publishes configurable icons and meta tags via a simple artisan command, with no build tools required.
Architecture fit. The package is a presentation-layer utility, not a domain component. It registers a service provider, exposes two routes (typically a web app manifest and a service worker), publishes a config file, and provides a Blade directive to inject the manifest link and service-worker registration. That means it touches only routing, config, and view rendering — no models, no business logic, no data layer. For a server-rendered Laravel monolith this is a clean, low-coupling fit. For an API-only backend or a decoupled SPA whose shell is built by Vite/React/Vue, the value drops sharply: you would be using it only as a static manifest host, and most of the package is dead weight.
Integration feasibility. High. Installation is a Composer require, a vendor:publish, a config edit, and one Blade directive in the base layout. The two hard prerequisites are HTTPS (service workers require a secure context outside localhost) and correctly sized icon assets. The realistic effort for a competent Laravel engineer is well under a day, including Lighthouse validation. The main friction is not installation but coexistence: any app that already serves /manifest.json or /sw.js, or that has its own service worker from a theme or starter kit, will collide at the route or scope level.
Technical risk. The code volume is small, which caps the blast radius, but the risk profile is not trivial:
display, start_url, HTTPS, service-worker fetch handler) change with browser vendors. A thin package that hardcodes a manifest shape can silently fall out of compliance.Key questions to answer before committing.
skipWaiting/clientsClaim, and is that the behavior we want?silviolleite/laravel-pwa (i.e., what is the actual upstream maintenance story)?Stack fit. Best suited to Laravel 9–12 applications with Blade-rendered layouts. It is framework-native (service provider, config, routes, Blade directive) and does not require Node tooling for the manifest itself. It fits alongside Vite for asset bundling without conflict, provided the service worker's precache list is reconciled with Vite's content-hashed filenames. Poor fit for headless/API-only services and for teams already running a mature Workbox build pipeline.
Migration path. Start on a branch against staging, not production.
composer require ladumor/laravel-pwa, publish config and assets.config/pwa.php (name, short_name, start_url, display, theme/background colors, icon set at 192/512 and maskable)./manifest.json and the service-worker route resolve, are not behind auth middleware, and are served with correct Content-Type.Compatibility. Confirm PHP/Laravel constraints against our version matrix. Check for route-name and path collisions before enabling. Set cache headers deliberately: the service worker file must be served with a short or no-cache policy, or CDN edge caching will pin users to an old worker indefinitely. Ensure HTTPS on staging so QA exercises the real secure-context behavior. Verify the worker's scope matches the app root if the app is mounted under a subpath.
Sequencing. Treat this as a two-phase rollout. Phase 1: enable on an internal or low-traffic surface, watch for stale-content reports and console errors for a release cycle. Phase 2: promote to the primary app, with a documented rollback (flip the config flag off, ship a no-op service worker that unregisters and clears caches, or set Service-Worker-Allowed/cache headers to force refresh). Do not bundle this change with an unrelated release; cache bugs are hard enough to isolate on their own.
Maintenance. Low ongoing code maintenance but non-zero ownership. The package is small enough to vendor or fork if it is abandoned, and the published config/assets become ours regardless. Budget a small review at each Laravel major upgrade and each time browser installability criteria change. Pin the version in composer.json; do not float.
Support. GitHub issues only — no commercial support, no SLA. Internal ownership should sit with a frontend or platform engineer who understands the service-worker lifecycle, not with whoever happened to install it. Document the config and the caching decisions in the repo so the knowledge is not tribal.
Scaling. Negligible server-side cost: the manifest and worker are effectively static responses. The scaling risk is client-side cache invalidation. At any real user volume, a subset of clients will be running a stale worker and stale assets, and that subset is invisible in server metrics. Plan for cache versioning, an update-available UX, and a way to measure "how many clients are on the current worker version" (e.g., a version beacon).
Failure modes to instrument.
manifest.json, breaking installability.Ramp-up. Integration is a sub-day task for a Laravel developer. The genuine skill requirement is service-worker literacy — cache strategies, update lifecycle, and scope — which is a 1–2 day ramp for someone who has not shipped a PWA before. For a TPM, the practical ask is: one engineer-day to integrate and validate, plus a deliberate decision record on caching strategy and a rehearsed rollback before this goes anywhere near production traffic. Given zero dependents and a single maintainer, treat the package as a convenience wrapper you are prepared to own, not a dependency you can outsource trust to.
How can I help you explore Laravel packages today?