zbox/unified-push
Unified push notification package for Laravel that sends messages through multiple providers behind one clean API. Configure your drivers, target devices or topics, and deliver consistent push notifications without rewriting provider-specific code.
Architecture fit. The package is a Laravel-style multi-driver push abstraction: one facade/config surface over three transports (APNS, GCM, MPNS). Conceptually it follows the Manager + driver pattern Laravel itself uses for Mail, Cache, and Filesystem, which is the right shape for the problem. The problem is the layer: Laravel now ships a first-class notification system, and the community has settled on laravel-notification-channels/* packages as the integration point. This package predates that convention, so it sits beside the framework rather than inside it. Any real leverage comes from the driver contract and config ergonomics, not from the transports.
Integration feasibility. Low as a dependency, moderate as a fork. At 14 stars, 0 dependents, and a last release of 2016-09-29, the package was built against the Laravel 5.1–5.3 era: expect illuminate/support constraints that hard-conflict with Laravel 9+/10+/11+, PHP 5.5/5.6-era syntax, manual service-provider registration (pre-5.5 auto-discovery), and no published test suite to validate behavior against. A composer require on a current stack will almost certainly fail resolution, and forcing it past --ignore-platform-reqs would be the wrong call for anything touching credentials or device tokens.
Technical risk: high, and concentrated in the transports. The abstraction is fine; every protocol underneath it is dead or degraded.
| Channel | Status | Consequence |
|---|---|---|
| GCM | Deprecated Apr 2018, shut down Apr 2019; superseded by FCM (whose legacy HTTP API itself closed in 2024) | Requests to android.googleapis.com/gcm/send fail outright; any Android path must be rebuilt on FCM HTTP v1 |
| MPNS | Retired with the Windows Phone / Silverlight platform | No live endpoint; dead code weight in the codebase |
| APNS | Binary provider protocol deprecated Nov 2020, unsupported since Mar 2021; current path is HTTP/2 Provider API with token (.p8 JWT) or cert auth |
If the package uses binary stream sockets — near-certain for 2016 — iOS delivery is broken until reimplemented |
So the honest read: two of three channels are unrecoverable, and the third needs its transport rewritten. The salvageable asset is a few hundred lines of config/manager code and whatever ergonomics the original author got right.
Key questions to answer before committing.
composer.json PHP and illuminate/* constraints — is this a Laravel 5-only artifact?ShouldQueue, retry semantics), or is sending synchronous and blocking?Stack fit. If the estate is genuinely on Laravel 5.x and PHP 7.0, this is a plausible drop-in and the calculus changes to "patch the transports." On Laravel 9+ it does not fit as a dependency and should be treated as a reference implementation to mine, not a library to adopt.
Migration path — three options, in preference order.
Notification classes using laravel-notification-channels/fcm for Android/web and a maintained APNS HTTP/2 client (e.g., edamov/pushok or riverline/apns) for iOS, behind a thin internal PushGateway interface. Preserves the multi-channel ergonomics this package was reaching for, on supported protocols, with an upgrade path the team owns.Compatibility work either way. Modernize composer.json constraints, add illuminate/support ^9–^12, register via extra.laravel.providers for auto-discovery, add PHPUnit/Pest characterization tests around the driver contract, and pin credentials to config/env rather than hardcoded paths.
Sequencing. (1) Two-day code audit answering the five questions. (2) Decision gate: fork vs. reimplement. (3) One-week spike delivering a single working APNS HTTP/2 send plus an FCM v1 send against sandbox credentials, to price the real work. (4) Port remaining channels, delete MPNS. (5) Contract tests, then cutover behind a feature flag with dual-send shadowing on a sample of devices. Expect 2–4 engineer-weeks for full reimplementation, versus roughly half a day if option 3 were acceptable.
Maintenance. Effectively unmaintained: no release in roughly nine years, one author, no dependents to absorb breakage. There is no upstream to file issues against and no patch stream — the moment you fork, you own it permanently. MIT licensing makes the fork clean legally; it does nothing about the ongoing cost.
Support and security. No CVE feed, no advisory process, no security review. Credential handling is the live concern: APNS certificate passphrases and FCM server keys read from files or config will land in logs and config caches if the original code is careless. Push credentials are high-value — a leaked FCM key permits sending to your entire Android install base. Treat a code review of secret handling as a gating item, not a nice-to-have.
Scaling. Legacy APNS binary transport typically holds one long-lived stream per certificate with synchronous, blocking reads — under queue workers this serializes delivery and can starve the pool. There is no connection pooling and no per-device concurrency control. GCM legacy capped at 1,000 registration IDs per request and offered no per-message result granularity beyond the response body. None of this matters if you reimplement over HTTP/2, which multiplexes natively; it matters a great deal if anyone tries to run the original code at volume.
Failure modes — the dangerous part. These protocols fail quietly. GCM legacy returned HTTP 200 with per-message errors inside the body, so naive integrations logged success while delivering nothing. The APNS binary protocol reported errors asynchronously on a separate feedback channel, easy to miss entirely. MPNS returned 404/410 for retired channels. In all three cases the system looks healthy while notifications silently vanish — the worst failure shape for a TPM, because it surfaces as a user-experience complaint weeks after the regression. Compounding this: certificates expire with no built-in alerting, and invalid device tokens accumulate without pruning. Any adopted or forked version needs explicit delivery telemetry, token hygiene jobs, and expiry monitoring added on top.
Ramp-up. Reading the code is cheap — it's small. Institutional knowledge is the expensive part: nobody on the team will have operated these protocols, and the documentation and Stack Overflow answers that once supported them have decayed alongside the services. Budget for the team learning dead APIs in order to replace them, and weigh that against the far shorter path of starting directly from supported clients.
Recommendation. Opportunity score of 3.31 reflects the abstraction's residual value, not the package's. Use it as a design reference for the driver/config surface, reimplement the transports on FCM v1 and APNS HTTP/2, and delete MPNS. Adopting it directly carries high probability of silent delivery failure for a modest savings in upfront design work.
How can I help you explore Laravel packages today?