Beta build. Report issues to your operator channel.
NewPublic rooms: put a pk_ in the client →

MIT on your Cloudflare account

Humans and agentsin the same room.

Chat, presence, Yjs, and invokeAgent share one room Durable Object. Public rooms take a pk_ in the browser. Self-host is MIT. Hosted is beta.

pnpm add @fluxy-chat/react
Self-host on WorkersMITHosted is beta

Your app

Live preview

app/chat/page.tsx
support-room
Live
PT
Write a message…

Chat and agents first. Location, stream, collab, game, IoT, and Bridges run on the same Worker if you turn them on.

Public room

Try it without signing up.

Open a room, send a message, invoke an agent. This is the same Durable Object path as self-host. Hosted is still beta.

Works with stacks you already use

One SDK across common frontends and runtimes. Fork the repo when you want full control.

Next.jsReactViteNodeWorkersReact NativeRemixTanStackExpressFastify
Next.jsReactViteNodeWorkersReact NativeRemixTanStackExpressFastify

Featured on

Fluxychat on Product Hunt: realtime chat API on Cloudflare, hosted or self-hostFluxychat badge (SaaSHub approved)

Deploy in your account. Quotas live in D1. Console access can require a one-time ack; usage still runs through your Worker with your keys.

Bridges

You create the Slack, Discord, Telegram, WhatsApp, or Teams app and paste the token. WhatsApp in the EU is in a Commission case right now. We don't sell a WhatsApp channel.

Agents in-room

invokeAgent streams on the same timeline as chat. A copilot panel stays off the chat log.

One room DO

Chat, sendCursor, Yjs, HTTP ingest, invokeAgent. A second binary WebSocket only if you mount Yjs.

WorkflowAgent

Optional D1-backed agent steps on the Worker. Not required for invokeAgent.

Voice signaling

joinVoiceStage is a roster. Live audio is LiveKit. Clips are POST /messages/voice.

MIT self-host

Deploy the Worker + D1 in your Cloudflare account. Read every line of source.

Built for rooms that stay live

Chat, collab, and broadcast on one kernel

Same Durable Object room for messages, presence, and server events. Photos are product scenes, not a second stack.

Messaging basics, on the edge

Channels, presence, mentions, and webhooks without bolting on another realtime vendor. Tap or hover a row on desktop.

Rooms, presence, typing, delivery, polls, and invokeAgent on one Durable Object. Translation and your chrome stay in the product.

What ships in the box

Edge delivery, in-room agents, Bridges you wire yourself, and a console for day-two work. You own the UI. We run the room Durable Object.

Chat, presence, Yjs, and an agent sit on one Durable Object. Hosted is beta. Self-host is MIT. Pusher moves bytes. Liveblocks is the document. Stream Chat is a hosted chat product with channels and moderation.

  • One room Durable Object: chat, presence, Yjs, invokeAgent
  • Guest session or pk_ for public rooms; fc_ stays on the server
  • fluxy.config onPublish plus hosted D1 overlay (no forked Worker)
  • Bridges: you create Slack/Discord/Telegram apps on the same table
  • Voice signaling (joinVoiceStage); media is LiveKit
  • GDPR export/erasure on the Worker
  • Named SDK errors (not_member, token_expired, anonymous_not_allowed)
  • Open beta hosted. Pin npm versions.

Already set up? Open the console for rooms, agents, and billing.

Built-in architecture

Bridges

You create the vendor app. WhatsApp in the EU is in a Commission case. Build that connector yourself.

Streaming markdown

Table buffering, code fence tracking, inline marker healing for clean partial renders during AI streaming

invokeAgent

Agents on the same room timeline. A copilot panel stays off the chat log.

pk_ + guest

Publishable keys and joinPublicRoomAsGuest. fc_ stays on the server.

Middleware pipeline

Transform messages and AI responses before they land

Moderate, validate, enrich, and fan out from the edge. LLM middleware supports guardrails, caching, RAG injection, PII redaction, and logging via wrapGenerate / wrapStream / transformParams. Policy code stays on the data path, not in a sidecar you forget to deploy.

Developers

SDK, CLI, docs, and console in one repo

Auth, rooms, and retries sit behind hooks and route handlers. Scaffold a new project with create-fluxy-chat CLI. When you need keys, quotas, or billing, open the operator UI instead of wiring another admin surface.

Where teams start

In-app chat with an agent

The agent writes on the same WebSocket as your users. Tool calls show up in the timeline. If you want a copilot panel, that is separate UI and it does not write the room log.

Bridges

Create the Slack, Discord, Telegram, WhatsApp, or Teams app yourself. Paste the token in the console and point the webhook at the Worker. SMS to phones still needs a telco. WhatsApp in the EU is in a Commission case right now. We don't sell a WhatsApp channel.

Export, erasure, webhooks

GDPR export and erasure run on the Worker. Webhooks are signed.

Ship without a socket fleet

JWT, the SDK, and a console. You don't have to keep a socket fleet alive at 3am.

Longer notes: incident, support, PR review. Those are gallery apps.

Kernel first

Polls and GPS ride the same socket as chat

When someone votes, a device posts a reading, or a stage goes live, the room gets a server_event. You do not stand up a second realtime backend. Hosted is still beta.

Slack, Discord, Telegram, WhatsApp, Teams. You create the vendor app. Bindings live in one Worker table.

Platform extensions

Modules on the same Worker

Marketplace, Web3, classrooms, stream, game, and IoT live in the sidebar. They are beta or labs, not a second product you buy.

Also on the same worker

Agent Marketplacebeta

Install pre-built agent skills with versioning and config schemas.

Try it

Chat, collab, live

Realtime SDK

Chat, presence, Yjs, and agents in one room

Start with useChat. Cursors and ingest demos are on /labs. Voice goes through LiveKit. You wire Slack yourself in the console.

Ship a chat feature in an afternoon.

Rooms, presence, threads, and reactions on one Durable Object. Vertical events (polls, breakouts, stage live) arrive on the JSON socket via onServerEvent. Yjs, if you need it, is a second binary connection to the same object.

const { messages, sendMessage } = useChat({
  roomId: "chat:room-42",
  client,
  onServerEvent: (ev) => {
    if (ev.name === "edu.poll.created") showPoll(ev.data);
  },
});

sendMessage("Hello from FluxyChat");
Open the live SDK demos
Ship Squad3 online
typing
Type your message...

FluxyCollab

Everything teams need to build together

Whiteboard, kanban, documents, spreadsheets, and AI, all synced in real-time via CRDT. No save button required.

Spatial ViewDocumentSpreadsheetFilesAI SummariesExplore all

Stream, IoT, fleet, and game overlays are on /labs.

Cross-org rooms

A room other organisations can join

Cloudflare Agents is one agent in a Durable Object. This is a room. Two companies can sit in it with private whispers. Dangerous tools wait for a human. We wrap the payload on the Worker and can sign an export. Anyone with Worker secrets can unwrap. The model sees plaintext on invoke.

  • Cross-org rooms and private terms
  • Quorum on dangerous tools, on the same WebSocket as chat
  • Worker-wrapped payload and a signed export. You do not hold a customer KMS.
  • Room SQLite PITR (30-day bookmarks, restore on next wake)
  • SSO and SCIM on self-host. Hosted login does not include SAML.
  • Audit logs, retention, legal hold, GDPR export
  • Per-tool approval gates and OpenTelemetry gen_ai spans

Walk the operator path in the cross-org console, room insights, and enterprise default story.

How we compare

Rough fit vs Stream, Ably, Pusher, and a DIY Durable Object. Full compare.

This table is the room. Spatial, IoT, and Stream have their own pages.

CapabilityTypical stream APIsTypical Ably-styleTypical Channels (Pusher-style)Fluxychat
Unit of valueHosted chat (channels, moderation, Video SKU separate)Pub/sub networkPub/sub channelsThe room: chat, presence, Yjs, invokeAgent on one Durable Object
pk_ in the browser (public rooms)Usually user tokensToken auth typicalPublic channelsYes: publishableKey + POST /tokens/anonymous. fc_ stays on the server
MIT server you can forkNoNoNoYes. Worker + D1 in your Cloudflare account
Chat history + paginationYesChat add-on / extra SKUCache-ish eventsD1 + useChat loadMore
Agent on the room timelineGenAI add-onAI Transport (network)NoinvokeAgent writes chat messages
Hosted maturitySLA on paid tiersEnterprise SLA / HIPAA BAAEnterprise-select SLAOpen beta. Pin npm. Written SLA only with a signed MSA
Tool approvalsGenAI add-onNot the productNoMail previews do nothing. You press a button. You can require two people.

Pricing

Free is the weekend plan. Starter is $20/mo after 200k persisted messages. Pro is $50/mo for heavier rooms. Calling the agent does not cost an extra seat. Hosted is still beta.

Console routes can require a one-time ack on your dashboard host. Billable usage still needs your Worker credentials.

Self-serve Stripe checkout when the Worker has STRIPE_SECRET_KEY. If /health.paymentsEnabled is false, pick a plan in the console or email us. Cards will not charge.

Free includes 200,000 messages, 5,000 agent invokes, and 50,000 webhook deliveries /mo. Starter is $20/mo. Pro is $50/mo.

Free

$0/mo

Weekend plan. No card. pk_ in the browser.

  • 200,000 messages / month
  • 5,000 agent invokes / month
  • 50,000 webhook deliveries / month
  • Public rooms with publishableKey. Cursors do not count as messages.
  • 200k persisted messages and 5k agent invokes per month
  • MIT self-host if you want the Worker in your account
  • Community support on GitHub
Create free account
Most teams start here

Starter

$20/mo

Production traffic with fixed monthly limits.

  • 500,000 messages / month
  • 10,000 agent invokes / month
  • 100,000 webhook deliveries / month
  • Room kernel: chat, presence, Yjs, agents
  • Signed webhooks with retries
  • GDPR export and erasure endpoints
  • Email support (best effort)
Choose Starter

Pro

$50/mo

Heavy rooms, agents, and webhook volume.

  • 5,000,000 messages / month
  • 100,000 agent invokes / month
  • 1,000,000 webhook deliveries / month
  • 5M messages, 100k agent invokes, 1M webhook deliveries per month
  • Priority support
  • Custom retention and audit (contact us)
  • Annual invoicing on request
Choose Pro

Higher limits: email fluxychat@outlook.com. Hosted login does not include SAML.

Is chat end-to-end encrypted?▾

TLS in transit. You can wrap payloads with a room key the Worker holds. Anyone with Worker secrets can unwrap. The model sees plaintext when invokeAgent runs. There is no customer KMS.

Do agents count as seats or MAU?▾

No. Console seats are humans. Agents cost invokes: streaming replies, tool calls, MCP. A chatty bot is not extra MAU.

Why usage-based quotas?▾

Cost tracks messages, AI invokes, and webhook volume. Self-serve plans include fixed monthly quotas; heavy usage can be metered on Growth and above.

Do AI agent invokes count against my quota?▾

Yes. Each plan includes a monthly agent invoke limit. Streaming AI, tool calls, and MCP interactions count as invokes.

Are stream, collab, game, and IoT modules extra?▾

No separate SKU. Platform modules run on the same room and worker. Quotas apply to messages and agent invokes like chat.

Enterprise vs Business?▾

Business is high-limit self-serve with SSO add-on and audit export. Enterprise can add SCIM, DLP, a security review, and a written MSA. There is no public fleet SLO on this page.

What counts as a message?▾

Persisted chat messages (including agent replies on the timeline) and client_event frames that are not client-ephemeral-*. Cursors, typing, and presence_patch do not increment the message quota. Agent invokes are a separate meter. Room ids are not metered.

Is there a hackathon or maker plan?▾

Free is that plan. No card. Public rooms with a pk_ in the client. 200k persisted messages and 5k agent invokes per month. Hosted is beta. Self-host is MIT.

Is hosted production-ready?▾

Hosted is open beta. Pin npm versions. Cloudflare PoP RTT is Cloudflare's, not a FluxyChat SLA. Self-host MIT if you need the Worker in your account today.

Self-host vs hosted?▾

Same worker and SDK. Hosted is fastest to start; self-host gives full control on your Cloudflare account with MIT source.

Hosted is beta. Pin SDK versions.

FAQs

Questions we hear when teams compare hosted chat APIs and edge deployments.

What is the chat API vs the SDK?▾

Your backend talks to the Worker over HTTP. The browser uses @fluxy-chat/sdk to join a room, send, and render. Same product, two surfaces.

Can I keep the frontend on Vercel?▾

Yes. Lots of teams leave Next on Vercel or Netlify and run chat on Workers + Durable Objects. You skip the platform WebSocket limits and a second Pusher-style bill.

Is this Intercom, Zendesk, or a live-chat widget?▾

No. Those are support desks. FluxyChat is the room layer for chat inside your app: SDK, webhooks, agent timeline. You build the UI. Guide: /guides/in-app-chat-vs-support-desk.

Is this a Pusher or Ably replacement?▾

For tenant-scoped in-app chat on the edge, usually yes: rooms, history, reconnect, operator tools. For generic pub/sub or SMS/WhatsApp, keep those products and use FluxyChat for the chat slice.

How is this different from a fully managed vendor?▾

You can run the Worker and D1 in your Cloudflare account, read the MIT source, and control upgrades. Hosted cloud is there when you do not want to wire infra on day one.

Can I add moderation and webhooks?▾

Yes. Middleware on the edge, signed webhooks, and console pages for the boring admin work.

What are Durable Objects for chat?▾

Cloudflare puts shared state in a Durable Object. Chat rooms are the textbook case. FluxyChat uses one Room object per room and D1 for history. Guide: /guides/durable-objects-for-chat-rooms.

Humans and AI agents in the same room?▾

tool_call and tool_result ride the same WebSocket as user messages, so you replay one timeline instead of guessing what the agent did. Streaming markdown with table buffering and code fence tracking renders cleanly during AI responses. Guide: /guides/agent-events-same-websocket-stream.

What do Bridges cover?▾

A Bridge is a row in the console. You create the Slack (or Discord, Telegram, WhatsApp, Teams) app, paste the token, and point their webhook at the Worker. Web chat is just a room. We do not ship a 14-channel helpdesk.

What is MCP and how does FluxyChat use it?▾

Model Context Protocol lets your agents consume external tool servers. FluxyChat acts as an MCP client and auto-converts tools to LLM function-calling format. Point your agent at any MCP-compatible server.

Can I add guardrails or RAG to AI responses?▾

Yes. The LLM middleware pipeline supports wrapGenerate, wrapStream, and transformParams hooks. Plug in guardrails, caching, RAG injection, PII redaction, or logging on the edge before responses reach users.

Does WorkflowAgent survive deploys?▾

Yes. WorkflowAgent persists state to D1 after each step. If the Worker restarts or you deploy a new version, the agent resumes from the last completed step.

I finished Cloudflare's chat tutorial. Now what?▾

That tutorial is the right start. FluxyChat adds JWT, D1 history, reconnect in the SDK, and a console. See /guides/after-cloudflare-chat-tutorial.

Why not stay on Pusher?▾

You might not need to. Edge pricing you can read, self-host on your account, no socket VPS fleet. Compare at /compare.

Where should I start?▾

Run the quickstart for a JWT and first room, or read /guides if you are still picking between DIY Workers chat and a packaged layer.

Does a public dashboard mean anyone can spend my quota?▾

No. Billable calls need your JWTs and API keys. Turn on DASHBOARD_ACCESS_MODE=ack (and optional CONSOLE_GATE_SECRET) so console routes need a one-time ack first.

What does it actually cost on Cloudflare?

Estimate only. Cloudflare's chat Durable Object sample was dominated by duration, not request count. We have not published idle-socket duration from a real invoice. See Status and limits.

FluxyChat runs entirely on your Cloudflare account. You pay Cloudflare directly no per-seat or per-message markup from us on the self-host path.

PlanMonthly messagesD1 reads / dayCost (USD)Best for
Workers Free~3M / mo (100k req/day × 30)5M / day$0Hobby · early beta · <1k MAU
Workers Paid ($5/mo)~300M+ / mo25M+ / day$5 + usageGrowing SaaS · 1k–100k MAU
Self-host on your CF accountUnlimited*Your plan limitsYour plan costEnterprise · cost-sensitive · compliance

* Request and D1 rows are not Durable Object duration. Cloudflare's official chat sample billed almost entirely on duration. FluxyChat has not published idle-socket duration from an invoice. Treat this table as a request-side estimate. See Cloudflare's current pricing for live numbers. Run pnpm run check:pricing to verify your env assumptions match the published rates.

Same SDK on hosted or on your Cloudflare account.

Free has no card. Public rooms take a pk_. Private rooms take a member JWT minted with fc_ on the server. Hosted is beta. Self-host if procurement asks who owns D1.