PHPackages                             ripple/ripple-laravel - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. ripple/ripple-laravel

ActiveLibrary

ripple/ripple-laravel
=====================

Laravel broadcasting driver + CLI for the ripple WebSocket server (Pusher-compatible).

v0.5.0(1mo ago)120MITPHPPHP &gt;=7.4

Since Jul 10Pushed 1mo agoCompare

[ Source](https://github.com/madisoheib/ripple-laravel)[ Packagist](https://packagist.org/packages/ripple/ripple-laravel)[ RSS](/packages/ripple-ripple-laravel/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (4)Versions (6)Used By (0)

 [![Ripple](logo.png)](logo.png)

Ripple for Laravel
==================

[](#ripple-for-laravel)

 **Laravel broadcasting driver for [Ripple](https://github.com/madisoheib/ripple) — a self-hosted, Pusher-compatible WebSocket server shipped as a single static binary.**

 [![License: MIT](https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667)](LICENSE)

No Redis, no Node, no PHP extensions. The server speaks the Pusher protocol, so Laravel Echo and your existing broadcasting code work unchanged — this package just wires Laravel to it and manages the binary for you.

Requirements
------------

[](#requirements)

- PHP ≥ 7.4
- Laravel 6, 7, 8, 9, 10, 11, 12 or 13 — one package version covers all. Every version is verified end-to-end (real app, real broadcast, real pusher-js subscriber) by [`qa/laravel/matrix.sh`](https://github.com/madisoheib/ripple/blob/main/qa/laravel/matrix.sh):

LaravelPHP testedStatus6 / 77.4✅88.0✅98.1✅108.2✅11 / 128.3✅138.4✅Installation — two commands, any Laravel project
------------------------------------------------

[](#installation--two-commands-any-laravel-project)

```
composer require ripple/ripple-laravel
php artisan ripple:install
```

`ripple:install` does everything:

- detects your OS/architecture (Linux x86\_64/ARM64, macOS Intel/Apple Silicon, Windows) and downloads the matching server binary from GitHub Releases (SHA-256 verified) into `./bin`
- points broadcasting at ripple in your `.env` (both `BROADCAST_DRIVER`and `BROADCAST_CONNECTION`, so every Laravel version picks it up)
- generates random `RIPPLE_APP_ID` / `RIPPLE_KEY` / `RIPPLE_SECRET`credentials (existing values are never overwritten; `--no-env` skips this)

Then start broadcasting:

```
php artisan ripple:start
```

That's it — `broadcast(new MyEvent())` and Laravel Echo work.

Dashboard
---------

[](#dashboard)

A Horizon-style debug page ships with the package at **`/ripple`**. It shows, live (2s refresh):

- server health (reachable? credentials OK?) with an error banner when not
- connections, channels, events in, messages out, **slow-consumer kills**, last fan-out time
- every occupied channel with its type and subscriber / presence-user counts
- a **Send test broadcast** button to confirm the full path end-to-end

It reads the same config as the broadcaster, so if broadcasting works, the dashboard works — nothing extra to configure. In production it's **dev-only by default** (visible only when `APP_DEBUG` or the `local` environment); gate it explicitly with:

```
// AppServiceProvider::boot()
Gate::define('viewRipple', fn ($user) => in_array($user->email, ['you@example.com']));
```

Configure via `config/ripple.php` → `dashboard` (`enabled`, `path`, `middleware`, `metrics_url`).

Configuration
-------------

[](#configuration)

Switching an existing Pusher/Reverb app is **environment-only** — no code changes:

```
BROADCAST_CONNECTION=ripple   # Laravel 11+
BROADCAST_DRIVER=ripple       # Laravel 6-10 read this variable instead

RIPPLE_APP_ID=app1
RIPPLE_KEY=my-key
RIPPLE_SECRET=my-secret
RIPPLE_HOST=127.0.0.1
RIPPLE_PORT=8080
RIPPLE_SCHEME=http        # https if TLS terminates before the server
```

The service provider registers both the `ripple` driver and the broadcasting connection automatically. Optionally publish the config:

```
php artisan vendor:publish --tag=ripple-config
```

KeyEnvDefault`host``RIPPLE_HOST``127.0.0.1`Server host`port``RIPPLE_PORT``8080`Server port (WS + REST)`scheme``RIPPLE_SCHEME``http``https` behind TLS`app_id``RIPPLE_APP_ID``app1`Must match the server config`key` / `secret``RIPPLE_KEY` / `RIPPLE_SECRET`—Must match the server config`bin``RIPPLE_BIN``base_path('bin/ripple')`Binary locationUsage
-----

[](#usage)

Start the server (generates a `ripple.toml` from your config):

```
php artisan ripple:start
# or with a hand-written config:
php artisan ripple:start --config /etc/ripple.toml
```

Broadcast as usual:

```
broadcast(new OrderShipped($order));
```

Frontend via Laravel Echo (`pusher-js` transport):

```
const echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_RIPPLE_KEY,
    wsHost: import.meta.env.VITE_RIPPLE_HOST,
    wsPort: import.meta.env.VITE_RIPPLE_PORT,
    forceTLS: false,
    enabledTransports: ['ws', 'wss'],
});
```

Private channels authenticate through the standard `/broadcasting/auth`endpoint — nothing to change.

How it works
------------

[](#how-it-works)

The package is intentionally thin: the server is Pusher-compatible, so the driver extends Laravel's own `PusherBroadcaster` and points it at Ripple. All the heavy lifting (connection handling, fan-out, backpressure) lives in the compiled server — your PHP app only sends signed HTTP requests to it.

License
-------

[](#license)

[MIT](LICENSE)

###  Health Score

35

—

LowBetter than 77% of packages

Maintenance90

Actively maintained with recent releases

Popularity11

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity27

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

5

Last Release

49d ago

PHP version history (2 changes)v0.1.0PHP &gt;=8.1

v0.2.0PHP &gt;=7.4

### Community

Maintainers

![](https://www.gravatar.com/avatar/a3e618b46861b6ce10002dc2b3d8b4777b760d24688181f4e9c2e77cb4c3223e?d=identicon)[souheibmadi](/maintainers/souheibmadi)

---

Top Contributors

[![madisouheib](https://avatars.githubusercontent.com/u/33779882?v=4)](https://github.com/madisouheib "madisouheib (3 commits)")

---

Tags

laravelWebSocketspusherrealtimeBroadcasting

### Embed Badge

![Health badge](/badges/ripple-ripple-laravel/health.svg)

```
[![Health](https://phpackages.com/badges/ripple-ripple-laravel/health.svg)](https://phpackages.com/packages/ripple-ripple-laravel)
```

###  Alternatives

[laravel/reverb

Laravel Reverb provides a real-time WebSocket communication backend for Laravel applications.

1.6k20.8M124](/packages/laravel-reverb)[laravel/sail

Docker files for running a basic Laravel application.

1.9k220.0M1.5k](/packages/laravel-sail)[laravel/ai

The official AI SDK for Laravel.

1.1k6.4M360](/packages/laravel-ai)[laravel/mcp

Rapidly build MCP servers for your Laravel applications.

80732.6M270](/packages/laravel-mcp)[laravel/boost

Laravel Boost accelerates AI-assisted development by providing the essential context and structure that AI needs to generate high-quality, Laravel-specific code.

3.6k31.1M880](/packages/laravel-boost)[propaganistas/laravel-disposable-email

Disposable email validator

6093.4M9](/packages/propaganistas-laravel-disposable-email)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
