FluxyChat

Learn

Realtime chat on Vercel without Pusher or Ably

Vercel excels at HTTP and SSR. Long-lived WebSocket rooms belong on Cloudflare Workers + Durable Objects — keep your Next.js app on Vercel, run chat edge-native.

Why “just add Pusher on Vercel” is the default

Vercel’s own guides and third-party tutorials often route teams to Pusher Channels or Ably when they need live features. That works, but you add a second realtime vendor, another bill, and another region to reason about.

Builders also hit WebSocket limits and pricing friction when they try to keep everything on serverless functions alone.

  • Vercel — Next.js App Router, auth UI, billing pages, marketing.
  • Cloudflare Worker + Room DO — WebSocket upgrade, room fan-out, presence.
  • D1 — message history and tenant metadata on your CF account.
  • Browser — @fluxy-chat/sdk pointed at your Worker URL; mint JWTs from a Vercel Route Handler or API route.

FluxyChat vs Pusher on Vercel

  • No Channels app or Pusher keys in the frontend — member JWT from your backend only.
  • Room-per-DO isolation instead of a global channel namespace you wire yourself.
  • Reconnect, loadMore history, and delivery status in the SDK — not only pub/sub events.
  • Optional MIT self-host on your Cloudflare account when hosted beta is not enough.

Migration sketch (Pusher → FluxyChat)

  • Deploy FluxyChat Worker (hosted beta or self-host) and create a project + API key.
  • Replace Pusher client subscribe with FluxyChatClient + useChat({ roomId, client }).
  • Map channel names to roomIds; persist history via REST/D1 instead of Pusher-only caches.
  • Mint per-user JWTs server-side on Vercel; never expose fc_... keys to the browser.

Build vs buy on the same stack

You can still DIY a Durable Objects chat repo on GitHub — FluxyChat is for teams that want multi-tenant JWT, RoomDurableObject, D1 history, and operator console without stitching a second vendor. See the DIY comparison on /compare.

On this page