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
- 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:installThe 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
- Deploy the env change to staging.
- Confirm the browser opens a WebSocket to
wss.vask.dev, not your Soketi host. - Trigger one Broadcast event and verify the client receives it.
- Verify one private or presence subscription returns 200 from
/broadcasting/auth.
Gotchas
- Port and scheme drift.
PUSHER_PORT=6001orPUSHER_SCHEME=httpleft 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: falsewhen targeting Vask. - Stale Vite bundle. The browser may keep the old Soketi host until the client bundle is rebuilt.
Where to go next
- Read the Soketi vs Vask comparison for architecture and operations context.
- Check the Laravel docs for advanced setup.
- Run the fan-out calculator if cost is the migration driver.
- 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.