pusher/pusher-chatkit-server
Official PHP server SDK for Pusher Chatkit, the hosted chat API. Create and manage users, rooms, and messages, set permissions, and add real-time chat to your Laravel or PHP backend without building the infrastructure yourself. Provides a clean client for Chatkit's REST API.
Architecture fit
pusher/pusher-chatkit-server is a thin server-side REST wrapper around Pusher Chatkit's hosted API — it is not a chat implementation, not a persistence layer, and not a Laravel package. It ships no service provider, no facade, no publishable config, and no queue/event integration, so it does not align with how Laravel applications expect to consume third-party services (container bindings, config/*.php, Http client or Guzzle via the container). Adopting it means hand-rolling all glue code in a custom service provider, which is the easy part; the hard part is that the package has no functionality without the upstream Chatkit service.
The decisive technical fact is that this SDK targets a decommissioned product. Pusher publicly deprecated Chatkit and has since shut the service down; the repository is archived with no maintainer, and it has 0 dependents on Packagist — a strong signal that no one has shipped it to production in a way that surfaces in dependency graphs. An SDK for a dead API is not an integration risk, it is a non-starter: every call path terminates in a 404, DNS failure, or authentication error.
Integration feasibility
composer require pusher/pusher-chatkit-server), but it will pin older Guzzle/PSR-7 constraints that fight with a modern Laravel 10/11 lockfile — expect dependency resolution conflicts or forced downgrades of shared HTTP packages.Sanctum/Passport or existing user tables beyond a manual ID mapping.Technical risk (rated: critical / blocking)
| Risk | Severity | Notes |
|---|---|---|
| Upstream service terminated | Blocking | No endpoint to integrate against; cannot be remediated by us |
| Archived, unmaintained repo | High | No security patches, no PHP 8.x guarantees, no CVE response |
| Transitive dependency rot | High | Stale Guzzle/PSR-7 versions become a supply-chain liability across the app |
| Zero dependents / 35 stars | Medium | Negligible community signal; no prior art to lean on |
| Vendor lock-in already realised | High | Data lives (or lived) in Pusher's cloud; export path now depends on vendor goodwill |
Key questions to resolve before any decision
Recommendation: do not adopt. Treat this as a replacement evaluation, not an integration evaluation.
Stack fit
Poor, and not fixable by wrapper work. Chatkit's hosted model also conflicts with common Laravel architecture preferences: chat history and message content live in Pusher's cloud, not in our database, which breaks our ability to join chat data to our own reporting, moderation, and GDPR/DSAR deletion workflows. For a Laravel shop, the natural fits are:
Migration path
If legacy code already depends on this package, the migration is an exit, sequenced as:
ChatService contract (createUser, issueToken, sendMessage, listMessages, createRoom) and wrap the existing SDK calls behind it. This is the single highest-leverage step: it isolates the dead dependency to one adapter class and makes the eventual swap a one-file change.composer.json.Compatibility
Assume PHP 7.x-era constraints. Do not attempt to run this on PHP 8.2+/Laravel 11 without auditing the transitive tree; a security review of the lockfile diff is mandatory if it stays in the build for any period. Pin it, isolate it, and set a hard removal date.
Sequencing
Run the interface extraction and the vendor decision in parallel; they are independent. Do not sequence the vendor selection behind the abstraction work — the abstraction is the safety net, not a prerequisite for choosing.
Maintenance
Effectively unmaintainable. Archived upstream plus zero dependents means every future PHP upgrade, Guzzle CVE, or Laravel major becomes our problem to patch in a fork we did not write. The realistic steady-state cost is not "low, it's just an SDK" — it is an unplanned fork-and-own project, plus a standing security exception on the dependency scanner.
Support
None. No vendor support (product discontinued), no maintainer triage, no issue response. Internal escalation path terminates immediately. If a message-routing bug appears in production, there is no one to call and no upstream fix to wait for — the only remedy is our own code.
Scaling
Moot for the package itself (it is a stateless HTTP client, so it never was the bottleneck). The scaling question belongs to the replacement: self-hosted Reverb pushes connection-count and horizontal-scaling decisions onto our infra team (sticky sessions, Redis pub/sub, presence state); a managed vendor pushes it onto a contract and a per-MAU bill. Flag the cost curve explicitly — chat pricing is usually per monthly active user, and it is the line item most likely to surprise finance at 10x growth.
Failure modes
Dominant failure mode is total, not partial: not "degraded chat" but "chat does not exist," surfacing as hard failures on token issuance and message send. Secondary modes worth designing for in the replacement: WebSocket reconnect storms after a deploy, presence state going stale on ungraceful disconnect, message ordering across multiple app servers, and webhook delivery gaps causing our DB and the vendor's state to diverge. Mitigations to bake in from day one: idempotency keys on message send, a durable outbox for webhook-driven writes, and a health check that distinguishes "realtime down" from "chat down."
Ramp-up
Learning cost for this package is near zero and near-worthless — it is a few hundred lines of HTTP calls. The real ramp-up is on the replacement: roughly 1–2 sprints for a competent Laravel team to stand up an interface-backed chat service with persistence, presence, and moderation, plus client-side work in the same window. Budget the interface extraction as a half-sprint line item and treat it as the risk-reduction deliverable that makes the vendor choice reversible.
Bottom line for the roadmap: close this evaluation as "rejected — upstream product end-of-life." Re-open as a build-vs-buy decision on chat (Reverb vs. Channels vs. managed vendor) driven by the actual feature list, data-residency requirements, and the per-MAU cost curve.
How can I help you explore Laravel packages today?