About

The story behind Flickerdocs

I built this real-time collaborative editor with no central server and no AI in the loop — just a CRDT and WebRTC.

I wanted to code without a framework. To feel the code and the computer the way it was in the 1970s, when C and Unix were new and programs talked directly to the hardware. The interest is in zeros and ones — not the framework-of-the-month that everyone learns and then forgets where any of it came from.

Who I am

I'm Chinmay. An engineer at heart. I work on problems that help us evolve as human beings — the ones that start with zeros and ones, not the framework-of-the-month.

Why I built this

  • Reading distributed-systems papers is one thing. Building one is another.
  • I wanted to understand CRDTs from primitives — not by reaching for Yjs.
  • Real-time collaboration without a central server is one of the genuinely hard problems. Worth picking.

What I learned

  • Version vectors track causality, not position. Position is what fractional identifiers do.
  • Fractional identifiers + siteIds make concurrent inserts at the same position resolve deterministically — no coordinator needed.
  • The math is the easy part. Making remote cursors glide smoothly while the doc underneath is being edited by someone else is the hard part.

Tech stack

  • CRDT — custom Logoot-family fractional identifiers + version vectors
  • WebRTC via PeerJS for peer-to-peer transport
  • CodeMirror 5 as the editor surface
  • Express + Pug for serving + signaling
  • Vanilla JS — no React, no framework, no build assist

For a real product I'd reach for Yjs. I built this to understand the primitives — not because I'd ship this exact code. Knowing the design space matters more than the code.

Inspiration

Flickerdocs was inspired by Conclave — an open-source collaborative editor built by the Conclave team. Their implementation of Logoot-family CRDTs over WebRTC is what made me want to go deeper into the primitives myself.

Find me

The repo

Open source.

github.com/chinmay4o/flicker-docs-crdt ↗