Migrate from Soketi to Vask (Laravel). Drop-in host swap.

Soketi and Vask both speak the Pusher protocol. A Laravel app using the pusher broadcast connection keeps its events, Echo subscriptions, and channel auth logic; only the endpoint and credentials move.

Migration summary

At a glance

low risk
Type
Drop-in host swap
Typical time
10-15 minutes
Server SDK
pusher-http-php unchanged
Client SDK
laravel-echo and pusher-js unchanged
Auth changes
verify existing /broadcasting/auth
Rollback
restore old Soketi env vars

Files touched

  • .env
  • config/broadcasting.php
  • resources/js/echo.js

Get started

Realtime made simple.

Free Tier: 500K broadcasts/mo and 100 concurrent across unlimited apps. $10/mo when you outgrow it.

Minimal cutover

Save the current Soketi values first. Then update the env block. If your app still uses BROADCAST_DRIVER, keep that name and set it to pusher.

BROADCAST_CONNECTION=pusher
-PUSHER_APP_ID=app-id
-PUSHER_APP_KEY=app-key
-PUSHER_APP_SECRET=app-secret
-PUSHER_HOST=your-soketi-server.example.com
-PUSHER_PORT=6001
-PUSHER_SCHEME=http
+PUSHER_APP_ID=your_vask_key
+PUSHER_APP_KEY=your_vask_key
+PUSHER_APP_SECRET=your_vask_secret
+PUSHER_HOST=wss.vask.dev
+PUSHER_PORT=443
+PUSHER_SCHEME=https
 PUSHER_APP_CLUSTER=mt1

 VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
 VITE_PUSHER_HOST="${PUSHER_HOST}"
 VITE_PUSHER_PORT="${PUSHER_PORT}"
 VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
 VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

If your SDK asks for an app id, use the Vask app key. Vask does not issue a separate customer-facing app id.

Rollback

Point .env back at your Soketi server, redeploy or rebuild the client bundle if VITE_PUSHER_* values are embedded, and clear config cache if your deploy caches Laravel config. Keep the Soketi process or service online until verification is complete.

Laravel package shortcut

composer require vask/laravel
php artisan vask:install

The installer writes the same Pusher-compatible env values and runs php artisan vask:doctor. Source: github.com/vask-dev/laravel · packagist.

Server publish

Confirm config/broadcasting.php reads host, port, and scheme from env:

'pusher' => [
    'driver' => 'pusher',
    'key' => env('PUSHER_APP_KEY'),
    'secret' => env('PUSHER_APP_SECRET'),
    'app_id' => env('PUSHER_APP_ID'),
    'options' => [
        'cluster' => env('PUSHER_APP_CLUSTER'),
        'host' => env('PUSHER_HOST'),
        'port' => env('PUSHER_PORT', 443),
        'scheme' => env('PUSHER_SCHEME', 'https'),
        'encrypted' => true,
        'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
    ],
],

Replace any hardcoded Soketi hostname or 6001 port in this file with env reads.

Client subscribe

Echo should also read host, port, and scheme from Vite env:

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_PUSHER_APP_KEY,
    cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,
    wsHost: import.meta.env.VITE_PUSHER_HOST,
    wsPort: import.meta.env.VITE_PUSHER_PORT,
    wssPort: import.meta.env.VITE_PUSHER_PORT,
    forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',
    enabledTransports: ['ws', 'wss'],
});

Private and presence channels

Keep routes/channels.php, /broadcasting/auth, and the private- / presence- channel names. Only the service signing the compatible auth response changes.

Verify

  1. Deploy the env change to staging.
  2. Confirm the browser opens a WebSocket to wss.vask.dev, not your Soketi host.
  3. Trigger one Broadcast event and verify the client receives it.
  4. Verify one private or presence subscription returns 200 from /broadcasting/auth.

Gotchas

  • Port and scheme drift. PUSHER_PORT=6001 or PUSHER_SCHEME=http left over from Soketi will break the hosted cutover.
  • Local Soketi still running. Keep it intentionally for local dev, but do not let local DNS or env files hide that staging should hit Vask.
  • TLS bypass settings. Remove local-only client options such as verifyHost: false when targeting Vask.
  • Stale Vite bundle. The browser may keep the old Soketi host until the client bundle is rebuilt.

Where to go next

Can I keep Soketi for local development?
Yes. Keep local .env pointed at Soketi if that workflow is useful, and point staging or production at Vask. Use a separate Vask app for local only if you want local traffic visible in the Vask dashboard.
What happens to my Soketi port and scheme?
Most Soketi setups use port 6001 and sometimes http/ws locally. Vask uses port 443 with https/wss. Change PUSHER_HOST, PUSHER_PORT, and PUSHER_SCHEME together.
How do I roll back to my own Soketi server?
Restore the old Soketi key, secret, host, port, scheme, and app id in .env, then redeploy or rebuild anything that embeds VITE_PUSHER_* values. Leave the Soketi server running until Vask is verified.
Do private and presence channels need changes?
No code changes in the usual Laravel setup. Keep /broadcasting/auth and your routes/channels.php callbacks, then verify one private or presence subscription after the swap.

Get going

Keep Soketi available until staging passes, then move the same env diff to production.

Make the switch

Swap the endpoint. Keep the events.

Use Vask credentials, keep your existing Broadcast events, and point the Pusher-compatible config at wss.vask.dev.