Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Fcm Laravel Package

apility/laravel-fcm

A Laravel package for sending Firebase Cloud Messaging (FCM) push notifications to Android and iOS devices, with a simple API for targeting devices and topics, building payloads, and integrating FCM into Laravel applications.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package is a thin Laravel service provider plus facade over an HTTP client: config file holds the FCM credential, a singleton Fcm transport exposes sendTo(tokens, options, payload), and everything above it (queues, Notification channels, templating, token storage) is left to the application.
  • That is a narrow but legitimate fit for the Laravel idiom — it plugs in at the transport layer and does not impose an opinion on your notification domain model. It is not a notification channel, not a queue integration, and not a token registry.
  • Lumen support requires manual bootstrap/app.php wiring, which is normal for the ecosystem but is one more artifact to maintain.

Integration feasibility

  • Realistically constrained to the PHP/Laravel matrix that existed at the 2022-10-06 release (roughly PHP 7.4–8.1, Laravel 8/9). On Laravel 10/11 and PHP 8.2+, expect Composer resolution failures or --ignore-platform-reqs workarounds that trade install-time friction for runtime deprecations.
  • Dependency resolution is the first gate; treat a failed composer require as the default expected outcome rather than a surprise.

Technical risk

  • Primary risk — API lifecycle. The package's surface area (server-key authentication, /fcm/send-style endpoint, multicast token arrays) matches Google's legacy FCM HTTP API, which was deprecated in 2023 and shut down in mid-2024. If the pinned release targets legacy only, the package is functionally dead regardless of code quality, and the composite score of 1.06 should be read as consistent with that.
  • Secondary risk — unmaintained supply chain. An archived repo means no security advisories, no Guzzle/PSR-7 CVE remediation, and no PHP minor-version fixes. Every transitive dependency becomes your patch backlog.
  • Tertiary risk — silent failure. Legacy multicast responses returned HTTP 200 with per-token errors embedded in the body. Any code path that only checks the status code will report success while delivering nothing.

Key questions for the team

  1. Which FCM API version does the pinned release actually speak — legacy server key, or HTTP v1 with an OAuth2 service-account flow? Verify against the source, not the README.
  2. Are we adopting this for new work or sustaining an existing install? The answer changes the whole calculus.
  3. What are our current Laravel, PHP, and Guzzle versions, and does the constraint set resolve against them?
  4. Do we depend on topics and conditions, or device-token fan-out only? Topic syntax changed between API generations and drives migration scope.
  5. Who owns the fork if we fork it, and what is the SLA for patching a CVE?

Integration Approach

Stack fit

  • Acceptable only as a sustainment target on an existing Laravel ≤9 codebase. On a greenfield service, do not adopt — the package saves perhaps a day of HTTP plumbing and costs multiple sprints of ownership.
  • The one genuinely useful property is that the package is small. Its call sites can be shimmed behind a two-method interface almost immediately, which converts an unmaintained dependency into a swappable adapter.

Migration path

  • Preferred target: kreait/laravel-firebase (Admin SDK over HTTP v1) or laravel-notification-channels/fcm, both of which give first-class Notification channel support and OAuth2 token handling.
  • Fallback target: a ~150-line internal client posting to the HTTP v1 messages:send endpoint with a cached OAuth2 bearer token. Given the package's size, this is often cheaper than adopting a heavier dependency.
  • In both cases, remove the package's facade from application code by introducing a PushSender contract first.

Compatibility work

  • Confirm whether call sites resolve the transport through constructor injection or the container (app('fcm')). Container lookups are the expensive ones — they cannot be swapped without touching every caller.
  • Audit payload construction for v1 deltas: data values must be strings, notification/android/apns blocks are restructured, and topic conditions use different syntax.
  • Check for config caching and credential exposure in cached config, which is a common Laravel footgun.

Sequencing

  1. Inventory every call site, payload shape, and the token source of truth.
  2. Introduce the PushSender interface and wrap the existing package as the first adapter — behavior-preserving, no endpoint change.
  3. Build the HTTP v1 adapter: service-account JSON, OAuth2 token cache with refresh skew, chunking at the 1,000-token multicast limit, per-token error parsing.
  4. Shadow-send in staging against real device token sets; diff delivery outcomes per token.
  5. Cut over environment by environment; keep the old adapter behind a feature flag for one release.
  6. Remove the package, its config, and its lock entry; publish an ADR recording why it was retired.
  7. Only then schedule the Laravel/PHP upgrade that the dependency was blocking.

Operational Impact

Maintenance

  • Upstream maintenance is zero — the repository is archived. Ownership transfers fully to us on install. The package is roughly a few hundred lines, so a fork is technically cheap, but it creates a permanent internal fork with no upstream to rebase against. That is a recurring tax, not a one-time cost.

Support

  • No maintainer, no issue triage, no security advisory feed, no release cadence. The escalation path is "we fix it ourselves." That must be an explicit, signed-off acceptance by an accountable owner, not an implicit default.

Scaling

  • The package provides no batching abstraction beyond passing a token array, no retry with backoff, no dead-token pruning, and no persistence of per-token delivery results. At any real volume we will build chunking, retry classification (retryable 5xx/429 vs. terminal UNREGISTERED/INVALID_ARGUMENT), and token hygiene ourselves.
  • Queue workers amplify the problem: stale tokens and rotated credentials surface as worker-level failures rather than request-level ones, which makes them harder to attribute.

Failure modes to instrument for

  • Retired endpoint returning 404/410 once the legacy API is fully decommissioned.
  • HTTP 200 with embedded per-token errors — the highest-severity failure mode because it is invisible without body parsing.
  • Expired or rotated server keys, and credential leakage through cached config.
  • Unhandled 429 quota responses during broadcast fan-out.
  • Stale tokens on long-lived workers producing asymmetric delivery by cohort.

Ramp-up

  • Developer learning curve is genuinely low: the API is small and a competent Laravel engineer integrates it in under a day. The honest framing for planning is that the package reduces time-to-first-notification, not time-to-production. Making it observable, retry-safe, credential-rotated, and API-generation-current is a multi-sprint effort that the package does nothing to shrink.

Recommended disposition as TPM

  • Block new adoption. Treat the 1.06 score and the archived status as sufficient signal without a deeper audit.
  • If already installed, open a migration epic against HTTP v1 with the shim-first sequencing above, and accept the package as technical debt with a named owner and a dated exit.
  • If a team insists on keeping it, require a written fork plan, a CVE response commitment, and a delivery-observability requirement before the next release train.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
abbasudo/artisan-route
mirvan/ippanel
ignibyte/aic-framework
glavweb/data-schema-bundle
glavweb/datagrid-bundle
tacticmedia/scim-server
uni-method/frame
neika-ai/sdk
adachsoft/php-code-style
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package