Skip to content

OpStream

A real-time collaborative editing toolkit for .NET applications.

Bring Google-Docs-style co-editing to any document type your app already owns — without rewriting your authentication, your storage, or your editor.

Get started in 5 minutes Browse the engines


What OpStream gives you

  • Eight production-ready engines for the document shapes you actually ship — plain text, rich text, JSON, hierarchical trees, tables, forms, presence, and per-peer undo / redo.
  • Three transports (SignalR, WebSockets, gRPC) — pick the one that already fits your stack.
  • Eight storage backends (EF Core, SQL Server, PostgreSQL, MySQL, SQLite, MongoDB, Redis, in-memory) behind one IDocumentStore contract.
  • Multi-node scaling via the Redis backplane — flip a single UseRedisBackplane() call and your single-node setup becomes a cluster.
  • OpenTelemetry traces and metrics out of the box — every op is a span, every store call is timed, every backplane publish is counted.
  • A DI-first builder API that follows the standard ASP.NET Core conventions: Use*() replaces, Add*() accumulates.

Mental model in one diagram

flowchart LR
    Client[Editor / UI] -- transport --> Hub[Transport layer]
    Hub --> Router[DocumentRouter]
    Router --> Session[DocumentSession]
    Session --> Engine[IOpEngine<TDoc, TOp>]
    Session --> Store[(IDocumentStore)]
    Router -. backplane .- Router2[Other node]
    Router --> Awareness[AwarenessSession]

You write the engine (or pick a built-in one), wire the transport that fits your client, point at a storage backend, and let OpStream do the rest. Replace any layer when production demands it.

When to use OpStream

You want… OpStream is a good fit
Multiple users editing the same document at the same time
Live cursors, selections, "user is typing" presence
Per-peer undo / redo that respects other peers' work
Offline / re-sync support driven by an op log
Working with your existing ASP.NET Core auth and storage
Going multi-node without rewriting your app
A standalone WYSIWYG editor — no collaboration use Quill / TipTap directly
A pub/sub messaging backbone use NATS / Kafka / Redis directly

Next steps