// the find
centrifugal/centrifugo
Scalable real-time messaging server in a language-agnostic way. Self-hosted alternative to Pubnub, Pusher, Ably, socket.io, Phoenix.PubSub, SignalR. Set up once and forever.
Centrifugo is a standalone real-time messaging server that handles WebSocket, SSE, HTTP-streaming, gRPC, and WebTransport connections. Your backend publishes to it over HTTP/gRPC; clients subscribe via official SDKs. It's for teams who want a Pusher/Ably replacement they can self-host without rewriting their backend in Go.
1. Genuinely wide transport support — WebSocket, SSE, HTTP-streaming, gRPC, and experimental WebTransport in one binary, with a unidirectional mode that needs no SDK at all. 2. Message recovery on reconnect is built in, not bolted on — channels can store a history ring and clients can resume from a sequence offset, which matters for anything beyond fire-and-forget. 3. Scaling story is solid: Redis (including Cluster, Valkey, DragonflyDB), Nats, and native PostgreSQL brokers are all first-class, plus a transactional outbox consumer so you can publish reliably from a Postgres write without a separate queue. 4. Delta compression via the Fossil algorithm is a small but real win for channels that push frequent incremental updates to large payloads.
1. The .NET SDK is explicitly marked WIP — if you're building a C# client, expect incomplete functionality and breaking changes. 2. Configuration surface is enormous: namespaces, channel permission strategies, proxy hooks, subscription streams, shared polls — onboarding is genuinely hard and the config schema is large enough that the project ships a CLI command just to generate docs for it. 3. No built-in persistence beyond the in-memory history ring; if you need durable event logs, you're stitching together the Kafka/PostgreSQL consumer yourself. 4. WebTransport is flagged experimental, which is fine, but the entire transport story depends on the browser ecosystem catching up — you're still shipping a WebSocket fallback path in practice.