A FIELD GUIDE TO LARAVEL · VOLUME II · THE ECOSYSTEM
ENTRY II.36 · BROADCASTING
Reverb
Laravel\Reverb · Package · first recorded March 2024, with Laravel 11
A first-party WebSocket server. It holds open the connection an ordinary request can't, so the server can speak first. It is a long-running process, so it lives on a server or on Cloud, not on Lambda.
Specification
Kind Server process, resident
Protocol Pusher protocol, so Pusher client libraries connect to it
Client Laravel Echo, in the browser
Installed by php artisan install:broadcasting
Voice reverb:start · reverb:restart
Scales by Redis pub/sub between Reverb servers, behind a load balancer
Range Cloud: managed, by concurrent connections, GA Dec 2025
Forge, VPS: a supervised process
Vapor: no. Lambda runs nothing resident; Vapor broadcasts via Pusher
Neighbours
Echo is the client that subscribes in the browser; broadcasting is the framework contract both ends follow. Managed WebSockets on Laravel Cloud are Reverb operated for you, billed by concurrent connections. Reverb itself speaks the Pusher protocol and runs as a long-lived process on a server you run.
Field marks
BROADCAST_CONNECTION=reverb
config/reverb.php
routes/channels.php
resources/js/echo.js
Fig. II.36.1 · The broadcast path, exploded
Parts
1 Event that implements ShouldBroadcast. Fired like any other event.
2 Queue. The broadcast is a job, so the request returns before the message is sent.
3 Reverb server. One long-running PHP process holding every open socket on its server.
4 Redis pub/sub, optional. Lets several Reverb servers share one audience.
5 WebSockets, one per Echo client, usually one per tab. Shown in blue: the only part that is a connection, not code.
6 Echo client subscribed to a channel. Livewire, Inertia and a Next.js satellite all listen the same way.
Hidden joinery
Your app signs each private-channel subscription at /broadcasting/auth with the app secret; Reverb checks it before subscribing. Every 60 seconds it pings quiet connections and prunes any that miss the pong. Echo's pusher-js client reconnects on its own. Scaling out takes one env flag, a shared Redis and a load balancer.
Joinery checked on 2026-10-08 against the Reverb docs and source and the pusher-js README.
TITLE
Reverb · the broadcast path
SOURCES
laravel.com/docs/13.x/reverb · laravel.com/docs/13.x/broadcasting · github.com/laravel/reverb/blob/main/src/Protocols/Pusher/Channels/Concerns/InteractsWithPrivateChannels.php · github.com/laravel/reverb/blob/main/src/Servers/Reverb/Console/Commands/StartServer.php · github.com/laravel/reverb/blob/main/src/Jobs/PruneStaleConnections.php · github.com/laravel/framework/blob/13.x/src/Illuminate/Foundation/Console/BroadcastingInstallCommand.php · github.com/laravel/framework/blob/13.x/src/Illuminate/Broadcasting/BroadcastManager.php · packagist.org/packages/laravel/reverb · packagist.org/packages/laravel/framework · github.com/livewire/livewire/blob/main/docs/events.md · laravel.com/cloud/docs/resources/websockets · laravel.com/forge/docs/sites/laravel · laravel.com/forge/docs/resources/background-processes · docs.vapor.build/projects/environments · github.com/pusher/pusher-js#connection-states · Monitor 501, 508, 619
STATUS
Verified · 2026-10-08
SHEET
II.36 of 48
REV
A · 2026-10-08
DRAWN
BS
FINISH
All faces, including the back