orchid/socket
Laravel package that adds a WebSocket server to your app, built on Ratchet. Broadcast events over public, private, and presence channels and push real-time updates to Orchid admin screens without relying on external services.
Architecture fit
orchid/socket is a long-running, event-loop WebSocket daemon that runs beside the Laravel HTTP runtime rather than inside it. It owns its own process, port, connection registry, and lifecycle. That is a recognized pattern — Laravel Reverb ships with the same shape — but a TPM must budget it as net-new infrastructure, not a composer require line item. The deciding factor is the state model: channel membership and presence live in the daemon's memory, which is acceptable on a single node and disqualifying for horizontal scale without a shared pub/sub backplane. Treat multi-node and HA requirements as out of scope until measured otherwise.
The architectural sweet spot is narrow and specific: a small-to-mid Laravel monolith on one or two long-lived nodes, low-thousands of concurrent connections, and real-time needs bounded to notifications, presence, admin alerts, and live job/deploy status. It is a poor fit for autoscaled containers, ephemeral instances, serverless, or high-frequency collaborative workloads.
The most valuable property for a TPM to anchor on is not the package itself — it is that it plugs into Laravel's broadcasting abstraction. If broadcast(), ShouldBroadcast events, and Echo listeners remain the only seams application code touches, the decision is reversible. Reversibility is the asset; the package is a replaceable component behind it. Every design conversation about this dependency should be a conversation about preserving that seam.
Integration feasibility
The happy path is genuinely low friction: install, publish config, set the broadcast driver, point Echo/pusher-js at the host and port, supervise php artisan socket:serve. Host, port, connection limits, queue integration, and auth-guard wiring are config-level. Initial wiring is a day, not a sprint.
The cost sits in the unglamorous edges, and planning must name them explicitly: TLS termination and WSS through nginx or an ALB, origin/CORS allowlists, the private-channel authorization handshake back into the Laravel app (and its per-connection latency cost), proxy idle-timeout tuning, and graceful restart so clients reconnect rather than silently dying. Feasibility is high in a lab and medium in production, and the entire gap is operational rather than functional. No amount of functional testing closes it — only running the daemon under realistic conditions does.
Technical risk
The headline signals are the assessment: zero stars, zero dependents, maturity score 0.3, no visible release cadence, no downstream users finding bugs before you do. This is not a maintained ecosystem component; it is effectively a personal project. Adoption equals ownership, not procurement — say that plainly to stakeholders who hear "composer package" and assume a vendor relationship exists.
Strategic risk dominates technical risk. Laravel Reverb is the first-party answer to precisely this problem, with framework compatibility guarantees. Choosing a zero-adoption third-party alternative requires a documented, defensible reason; "we didn't know Reverb existed" will not survive architecture review. Technical risk is secondary but concrete: event-loop blocking on slow handlers, unbounded memory growth over long uptimes, pcntl/posix and PHP-version constraints, and dependency drift against Laravel 11/12 majors. Supply chain is the sharpest edge — an unmaintained package holding write access to the real-time layer is an unpatchable surface if the maintainer walks away, with no security contact, issue-tracker signal, or SLA behind it.
Key questions to answer before any commitment
laravel-echo + pusher-js, or does it require a bespoke client? This single answer determines whether the frontend — and therefore the exit path — is portable.Stack fit
Fits a conventional Laravel monolith on a small number of long-lived VMs, or a single container with a stable hostname and a persistent supervisor. Does not fit autoscaled ECS/Kubernetes, ephemeral or recycled containers, serverless/API-gateway deployments, or any environment where instances churn without connection draining. It requires a reverse proxy that supports WebSocket upgrade and long idle timeouts. If the platform team does not already operate daemons, that is net-new operational surface and must be staffed rather than assumed — treating process supervision as solved because it is solved elsewhere in the org is the most common failure mode for this class of decision.
Migration path
Do not frame this as a migration to the package. The only defensible framing is a time-boxed evaluation of a self-hosted option with the exit designed before any feature code is written. Exit stays cheap if three rules are enforced from day one: all publishing goes through Laravel broadcast() / ShouldBroadcast events and never package-specific APIs; the frontend talks only to Echo with a configurable host; no package-specific behavior leaks into domain code. Under those rules, swapping to Reverb, Soketi, or a managed provider is a config change plus a deploy. Violate them — reaching for the package's own facade or a bespoke client — and exit cost multiplies. Treat such usage as a design violation in review, not a style preference.
If the product currently polls, sequence the polling-reduction business case first: quantify the API and database load being removed. That number justifies or kills the investment independent of which provider wins, and it gives a defensible baseline for comparing self-hosted total cost against a vendor bill. Committing to channel naming, connect-time authentication, authorization, and reconnect/delivery expectations now is valuable even if the underlying package is later swapped out.
Compatibility
Pin the exact version and commit hash — never float a constraint against a repository without tagged releases. Validate against the current Laravel and PHP versions in the real application on a throwaway branch before believing any compatibility claim; the description's "works with queues and auth guards" is a claim, not a test result. Verify Laravel Octane interaction separately, since two long-running runtimes in one deployment is a configuration and debugging burden teams routinely underestimate. Confirm the client-protocol assumption early: if stock laravel-echo and pusher-js cannot connect unmodified, the portability thesis collapses and the whole evaluation should be re-scoped or abandoned.
Sequencing
Maintenance
This is the dominant cost line and should be presented as such. Expect to pin or vendor the source, maintain an internal fork, and carry upgrade work yourself when Laravel majors move. Budget an ongoing fraction of an engineer — not a one-time integration — for dependency review, security watching (there is no upstream advisory channel, so you are the advisory channel), and compatibility patching. Add integration tests that assert the daemon's behavior, because there is no upstream test suite you can rely on as a contract.
Support
There is no support contract, no documented upgrade path, no security patch cadence, and no community to answer questions. Internal support is the only support. That means a named owner and a named backup in the on-call rotation, a runbook covering start/stop/restart/drain, and a decision recorded for what happens if the maintainer abandons the repository mid-quarter. For stakeholders accustomed to vendor SLAs, state this as the explicit trade being made: no per-connection fees in exchange for full operational ownership.
Scaling
Design for a single node with a hard ceiling, and measure the ceiling rather than assuming it. Scaling levers are vertical first (larger instance, tuned connection limits), then a shared pub/sub backplane for multi-node — which is new engineering, not configuration. Sticky sessions, connection draining on deploy, and a backplane design are all unsolved here and should be treated as a separate project if the 12-month forecast crosses the measured single-node ceiling. If the roadmap includes multi-region or tens of thousands of concurrent connections, this package is the wrong answer and the assessment should say so before a spike is funded.
Failure modes
Plan for these by name:
Every one of these needs a runbook entry and an alert before the pilot goes live.
Ramp-up
Two distinct ramps. Engineering needs roughly a sprint to become productive with the daemon's internals, the event loop, and the client protocol, plus additional time for anyone unfamiliar with supervised async PHP processes. Operations needs the runbook, the restart policy, the proxy configuration, and a rehearsed rollback to a managed provider or Reverb. Frontend needs confirmation that stock Echo works and a documented reconnect story. Budget the ramp explicitly in the business case — it is a real line item that a managed vendor's invoice would otherwise hide, and comparing "vendor fee" against "package is free" without it produces a decision that is wrong by an order of magnitude.
How can I help you explore Laravel packages today?