Vixus Push
Moving from Pusher? It's a config change

Realtime, without running the servers.

Channels, presence and client events over the Pusher protocol. Keep pusher-js and your server library, point them at Vixus Push, and spend your week on the feature instead of the WebSocket fleet.

$ npm install pusher-js
Free plan, no card Any Pusher SDK Built on open-source Soketi
Works with the Pusher libraries you already use
pusher-jsLaravel EchoNode.jsPHPPythonRubyGoJava.NETiOSAndroid

// features

Everything your realtime feature needs. Nothing to babysit.

The Pusher protocol you know, on infrastructure you don't have to run. Create an app, copy three values, and ship.

Drop-in Pusher compatibility

Keep pusher-js, Laravel Echo and every Pusher server library. Swap the cluster for a host, and your channel names, events and auth endpoint stay exactly as they are.

const pusher = new Pusher("YOUR_KEY", {
-  cluster: "eu",
+  cluster: "",
+  wsHost: "YOUR_HOST",
+  wssPort: 443,
+  forceTLS: true,
+  enabledTransports: ["ws", "wss"],
  channelAuthorization: { endpoint: "/api/pusher/auth" },
});

Public, private and presence

Broadcast to everyone, gate channels behind your own auth endpoint, or know who is online right now.

presence-doc-913 online
Amara Okaforediting
Jonas Bergviewing
Mei Chenjoined
pusher:member_added { id: "mei" }

Client events

Typing indicators and cursors go straight from client to client on private and presence channels. One switch per app.

Ada is typingchannel.trigger("client-typing", …)

A real HTTP API

Publish, batch-publish, read channel info and list presence users from any backend. Every Pusher server library signs the requests for you.

// POST /apps/:id/batch_events, signed with your secret
await pusher.triggerBatch([
  { channel: "orders.4821", name: "status", data: { status: "packed" } },
  { channel: "private-user-ada", name: "notify", data: { order: 4821 } },
]);

Teams and roles

Invite your team into an organization. Roles decide who can see secrets, change settings or only look.

owneradmindeveloperbillingviewer
checked on every request, not at login

Usage you can read

Messages, API calls and connections, by the hour, per app. Today's messages sit next to your daily limit.

messages · last 24 hhourly

A live demo you can share

Every app has a demo room. Send the link to a second browser, no account needed, and watch messages land in both.

Chromeship it
Phoneship it
signed link · expires in 24 h

// quickstart

From zero to your first event in five minutes.

These are the real snippets, with this service's host already filled in. Paste your app id and key and run them.

  1. Create an app

    Sign up, create an app and copy its app_id, key and secret. The Free plan needs no card.

  2. Connect the browser

    Point pusher-js at your host, subscribe to a channel and bind an event. Private and presence channels call your own auth endpoint.

  3. Publish from your server

    Call trigger from any Pusher server library. The secret stays on your server; the key is the only thing that ships to browsers.

import Pusher from "pusher-js";

const pusher = new Pusher("YOUR_APP_KEY", {
  cluster: "", // not used; the host below decides where you connect
  wsHost: "ws.push.vixus.io",
  wsPort: 443,
  wssPort: 443,
  forceTLS: true,
  enabledTransports: ["ws", "wss"],
});

const channel = pusher.subscribe("my-channel");
channel.bind("my-event", (data) => console.log(data));

More in the quickstart and the HTTP API reference.

// from the people shipping with it

Developers, feature by feature.

Pick the part you care about and hear from someone who uses it.

We moved off Pusher on a Tuesday afternoon. The diff was the cluster line and a few new options; channel names, the auth endpoint and every bind() call stayed exactly as they were.
Priya Raman
Staff engineer, Lanternly
The "who's here" avatars on our shared documents are one presence channel. member_added and member_removed fire exactly when you'd expect, and the member list is there on subscribe.
Amara Okafor
Frontend lead, Fieldnote
Cursor positions go client to client with client- events, so our server never sees that firehose. Turning them on was a switch in Settings, plus a reconnect, which the docs warned me about.
Jonas Lindqvist
Indie developer, Pixelboard
triggerBatch is the unsung hero: one signed request fans an order update out to the customer, the courier and the ops board. The docs flag up front that errors come back in the body, so that never bit us.
Mei Chen
Backend engineer, Ferrybox
Echo didn't need to know anything changed. I swapped the PUSHER_* variables in .env, rebuilt the Vite assets, and broadcasting just worked on the first deploy.
Tomás Ferreira
Laravel developer, Freelance
Contractors get the Developer role, finance gets Billing and never sees an app secret. When someone leaves, removing them takes effect on their next request, not whenever their session runs out.
Daniel Mensah
CTO, Tallyworks
The Usage tab answers "what did that release do to our message volume?" hour by hour. Having today's messages next to the daily limit on the Apps page saved us a surprised Monday.
Sofia Marchetti
Platform engineer, Brightpath
In workshops I open the live demo link on my laptop and my phone, and the room watches messages land on both. Nobody needs an account, and the link expires after a day on its own.
Kenji Watanabe
Developer advocate, Stackyard
Private channels go through our own auth endpoint, so the authorization decision stays in our code. The key ships to browsers, the secret never leaves our servers, and every snippet is written that way.
Leila Haddad
Security engineer, Halcyon Health
We pause our staging app when nobody is using it. New connections and publishes are refused, nothing is deleted, and resume brings it straight back. Rotating a secret is one button.
Marcus Bell
Founder, Quietcart
Our live classroom shows which students are in the room. Presence gave us the roster for free; the only code we wrote was the auth endpoint, and we already had that from Pusher.
Rahul Iyer
Engineering manager, Classwise
The quickstart has the real host already filled in. I copied the browser and Node tabs, ran them, and had a message in the console before my coffee went cold.
Ana Petrović
Full-stack developer, Mapleloop

// no surprises

Honest about what works today.

Where Vixus Push matches Pusher and where it doesn't, before you find out in production. The full table lives in the docs.

Works today

  • Public, private and presence channels
  • Client events, switched on per app
  • Server publish, batch publish and channel info
  • User authentication
  • Laravel Echo and every Pusher client and server library
  • Organizations with owner, admin, developer, billing and viewer roles

Different from Pusher

  • No clusters: you set a host and port, and there is one region
  • Webhooks aren't in the dashboard yet
  • No debug console or event log
  • No Beams push notifications
  • No per-app list of allowed origins

Encrypted and cache channels are supported by Soketi underneath, but not yet covered by our tests. Moving an existing app? Follow the migration guide.

// pricing

Start free. Grow when you're ready.

These numbers come from the same catalog the service enforces. Paid plans aren't on sale yet, and their limits may change before they are.

Free

Available now

Build and test your realtime features.

$0/ month
  • 100 concurrent connections per app
  • 100,000 messages per day
  • 2 apps
  • 1 team seat
  • 7 days of usage history
  • Community support

Starter

Coming soon

For products going live with real users.

Price soon
  • 500 concurrent connections per app
  • 1,000,000 messages per day
  • 10 apps
  • 3 team seats
  • 30 days of usage history
  • Email support

Pro

Coming soon

For busy apps and teams that need headroom.

Price soon
  • 2,000 concurrent connections per app
  • 5,000,000 messages per day
  • 25 apps
  • 10 team seats
  • 90 days of usage history
  • Priority support

pusher.subscribe("your-next-feature")

Ship the realtime part this week.

Create an app on the Free plan and watch your first event arrive in the browser. No servers to run, no card to enter.