Understanding CRDTs: The Magic Behind Collaborative Editing

Oct 20, 2025

Understanding CRDTs: The Magic Behind Collaborative Editing

You know that moment when you’re in a Google Doc with your team and everyone’s cursors are moving around, and somehow nothing breaks? I was curious about how that actually works, so I went down a rabbit hole learning about CRDTs.

Let me walk you through it.

The Core Problem

Imagine you and a friend are both editing a shared shopping list. You’re both offline at different stores.

You add “milk” at position 3. Your friend adds “bread” at position 3.

When you both reconnect, what should happen?

Confused math lady meme

Most traditional systems would freak out here. One person’s change gets lost, or you get a conflict error asking you to manually fix it. Not great when you’re just trying to make a shopping list.

What Are CRDTs?

CRDT stands for Conflict-free Replicated Data Types. Basically, they’re data structures designed so that concurrent changes can always be merged automatically, no matter what.

The key idea: no matter what order users receive updates, everyone eventually sees the same final state. Like how 3+5 and 5+3 both equal 8 regardless of order.

A Simple Example: Counters

Let’s say we’re both tracking how many people showed up to a party.

We both start at 5. Then the WiFi goes out (as it does).

You see 2 more people arrive, so you think it’s 7. I see 1 person arrive, so I think it’s 6.

When we reconnect:

  • Traditional approach: “Conflict! Is it 6 or 7?”
  • CRDT approach: “You added 2, they added 1, total is 8”

The CRDT doesn’t just store the final number. It tracks who incremented by how much, then adds everything up. Pretty clever.

Text Editing Gets Interesting

Here’s where it gets a bit tricky. Let’s say we’re editing a document that says “hello _____”

You type: “hello world”
I type: “hello Kunal”
We’re both typing at the same spot, at the same time.

The result? Something like:

“hello worldKunal” or “hello Kunalworld”

Wait what gif

That Seems… Wrong?

Yeah, this is where CRDTs show their limitation. They guarantee that everyone will see the same result (convergence), but not that the result will make semantic sense.

The CRDT just merges the operations in a deterministic way. It doesn’t understand that “world” and “Kunal” are both trying to complete the same sentence.

So Why Does Google Docs Work Fine?

Good question. Google Docs and similar apps don’t just use CRDTs on their own. They combine them with other strategies:

Real-time character streaming: Changes are sent letter by letter as you type, not as complete words. So you’d see the weird merge happening live (“hello wKourlnadl”) and fix it immediately.

Cursor awareness: Those colored cursors showing where everyone’s typing? They help you naturally avoid collisions. When you see someone else’s cursor at the same spot, you move somewhere else.

Smart identifiers: Instead of tracking positions (which shift around), CRDTs give each character a unique ID based on its neighbors. This makes merging more predictable.

Typing gif

Different Types of CRDTs

There are different CRDT variants for different use cases:

G-Counter (Grow-Only Counter): Only increments. Simple and efficient.

PN-Counter (Positive-Negative Counter): Can increment and decrement. Uses two G-Counters under the hood.

G-Set (Grow-Only Set): Elements can be added but never removed.

LWW-Element-Set (Last-Write-Wins): Elements can be added and removed. Conflicts are resolved by timestamp—most recent change wins.

Sequence CRDTs: The complex ones used for text editing. Libraries like Yjs and Automerge implement these.

When Should You Use CRDTs?

Good fit for:

  • Real-time collaborative editing (documents, code, whiteboards)
  • Offline-first applications
  • Chat apps and comment systems
  • Anything where multiple people need to edit simultaneously

Not ideal for:

  • Financial transactions (you need strong consistency here)
  • Systems where operation order is critical
  • Cases requiring ACID guarantees

The Tradeoffs

Benefits:

  • Automatic conflict resolution
  • Works offline seamlessly
  • No single point of failure
  • Eventually consistent across all users

Drawbacks:

  • Additional metadata overhead
  • Can produce semantically odd merges
  • Implementation complexity
  • Some operations (like reordering lists) are surprisingly tricky

Getting Started

If you want to build something with CRDTs, here are some good libraries:

Yjs: Popular and well-tested, especially for text editing
Automerge: Clean API with good documentation
crdt.tech: Great resource for learning more

Start with something simple like a shared counter or todo list. Once you understand the basics, you can move to more complex scenarios.

Wrapping Up

CRDTs solve the hard problem of merging concurrent edits without data loss. But they don’t automatically make the results sensible—that requires thoughtful UX design on top.

The magic in apps like Google Docs comes from combining CRDTs with real-time updates, visual feedback, and smart design choices that help users avoid conflicts in the first place.

It’s a fascinating piece of technology that makes modern collaborative tools possible. Worth understanding if you’re building anything where multiple people work together.

Thumbs up gif


If you end up building something with CRDTs, I’d love to hear about it. Feel free to reach out!

Recommendations

HAR Files: Your Secret Weapon for Debugging Production Issues

#debugging

,

#web

,

#har

,

#devtools

,

#performance

How to use HAR files as a practical, zero-setup tool for debugging...

Jan 23, 2026

Building a Practical Backend Error Mapper for Frontend Applications

#React

,

#TypeScript

,

#Error Handling

,

#Frontend Development

,

#Best Practices

Learn how to build a clean, extensible error mapping system that transforms...

Jan 18, 2026

i18n vs l10n: What Developers Need to Know

#i18n

,

#l10n

,

#internationalization

,

#localization

,

#web development

,

#javascript

,

#react

,

#frontend

A practical guide to internationalization and localization for developers. Learn...

Dec 25, 2025

Things to Do as a Frontend Architect: A Complete Guide

#Frontend

,

#Architecture

,

#JavaScript

,

#Web Development

,

#Best Practices

,

#Leadership

,

#Performance

,

#Developer Experience

A comprehensive guide to the responsibilities, tasks, and best practices for...

Dec 15, 2025

React Composition Patterns: Beyond Boolean Props

#React

,

#JavaScript

,

#Web Development

,

#Component Design

,

#Software Architecture

Learn how React compound components and composition patterns can help you escape...

Oct 6, 2025

10 Vue Debugging Tips That Will Transform Your Development Workflow

#Vue.js

,

#Debugging

,

#JavaScript

,

#Frontend

,

#DevTools

,

#Development

,

#Web Development

,

#Vue DevTools

Master Vue.js debugging with 10 battle-tested techniques from real developers....

Aug 26, 2025

Building a Cross-Repository Test Automation Pipeline: From Manual QA Nightmares to Automated Excellence

#automation

,

#testing

,

#CI/CD

,

#GitHub Actions

,

#Playwright

,

#SDK

,

#engineering

,

#DevOps

Learn how to build a cross-repository test automation pipeline that reduced our...

Aug 20, 2025

JavaScript Performance Optimization, 10 Techniques That Actually Move the Needle

#javascript

,

#performance

Discover 10 JavaScript performance optimization techniques that deliver real,...

Aug 18, 2025

Building a Blog Publisher MCP Server to Automate Your Content Workflow with Claude

#MCP

,

#Claude

,

#Automation

,

#TypeScript

,

#GitHub

,

#Blogging

,

#Tutorial

,

#AI Tools

Learn how to build a custom MCP server that lets Claude publish and manage blog...

Aug 7, 2025

20 JavaScript Interview Questions You Should Know in 2025

A practical guide to 20 core JavaScript interview questions — with clear...

Jul 24, 2025

Building a Simple, Scalable Feature Flag System

#nextjs

,

#prisma

,

#feature-flags

,

#fullstack

,

#backend

,

#api-routes

,

#clean-architecture

,

#scalable-design

,

#product-rollout

Built a simple yet scalable feature flag system using Next.js API routes and...

Jul 6, 2025

I Refactored Without Changing a Feature — And It Broke Everything

#HyrumsLaw

,

#Refactoring

,

#LegacyCode

,

#CodeSmells

,

#TechDebt

,

#SoftwareEngineering

,

#CleanCode

Understanding Hyrum’s Law with a Real-World Lesson on Porting vs Refactoring

Jul 5, 2025

How to Publish Your First npm Package: Creating Rainbow Highlight with Utilities

#npm

,

#npm-package

,

#web

,

#javascript

Learn how to create and publish your first npm package. This step-by-step guide...

Sep 22, 2024

Google Dorking: Unlocking Hidden Search Capabilities & Insights

#seach

,

#seo

,

#research

Explore 16 advanced Google Dorking techniques to uncover valuable data, security...

Aug 8, 2024

This One HTML Attribute Could Save Your Web App from a Security Nightmare

#web-security

,

#cdn

,

#web

Web security is a critical concern for developers, yet some of the most...

Jun 29, 2024

Are You Still Using Basic CSS? Here Are 7 Tricks to Get Ahead of the Curve

#css

Bored of the same old CSS? Unleash 7 hidden gems to take your designs to the...

Dec 27, 2023

Easiest way to store your logs in a file WITHOUT chaging the source file(node)

#productivity

Often, developers face challenges when dealing with a flood of logs in the...

Dec 21, 2023

Build Your Own Pinterest-Style Masonry Grid: A Step-by-Step Guide

#css

,

#web

,

#layout

Create a masonary grid layout with left to right content flow, supporting...

Dec 10, 2023

Using git diff and git apply to Share Local Changes with Peers

#git

,

#productivity

,

#software_engeneering

,

#dev

git diff and git apply are two powerful Git commands that can be used to share...

Nov 12, 2023

React Portals: Render Components Outside the current DOM Hierarchy

#react

,

#web

The createPortal API in React allows you to render child elements into a...

Jul 27, 2023

Cloning Made Easy: Try degit and Clone Directories within Repos.

#git

,

#productivit

Have you ever faced the dilemma of wanting just a small portion of a repository,...

Jul 19, 2023

Debugging Web Apps with Browser Dev Tools: 6 Amazing Tricks

#browser

,

#debugging

,

#web

Debugging web applications can be a challenging task, with errors like...

Jul 13, 2023

Controlled Versus Uncontrolled Components in React

#react

,

#forms

Understanding State Management Within Forms Comparing controlled and...

Nov 5, 2022

Format Numbers, Dates and Currencies with the Intl Object in Javascript

#javascript

,

#html

,

#web

Intl object can be used to format data into commonly used formats of dates,...

Sep 13, 2022

Image Masking on Hover Using CSS Clip Path and Javascript

#javscript

,

#css

,

#html

Image Masking can be used to add fancy hover highlight effects to images for...

Jul 23, 2022

Recreating CSS Tricks Fancy Grid Hover Effect

#html

,

#css

,

#UI

,

#recreation

CSS Trick had a simple yet cool grid layout which I found dope. So lets try to...

May 21, 2022

File Explorer Recursive React Component

#react

,

#javascript

,

#web

How to create a recursive folder Component using react.

Apr 16, 2022

Add Google Fonts to Your React & NextJS + TailwindCSS Project (Next 14)

#css

,

#tailwindcss

,

#react

,

#nextjs

,

#tailwind

,

#design

Use Google Fonts in Your TailwindCSS Projects

Apr 6, 2022

Event Delegation in Javascript

#javscript

,

#css

,

#html

,

#web

,

#performance

Handling multiple Events in Javascript with minimal CPU Usage

Mar 6, 2022

A Simple Web Accessibility Trick that you most probably missed!

#html

,

#css

,

#web-accessibility

,

#user-experience

Imagine that you cannot use the mouse and have to Navigate a Website with the...

Dec 23, 2021

Top Terminal Commands I Use For Productivity

#linux

,

#cli

,

#terminal

The whole point of development is solving problems. But very often we Developers...

Nov 3, 2021

CSS Logical Properties

#css

,

#html

CSS logical properties are properties which are used to design element on the...

Oct 5, 2021

Fluid Typography in CSS 💧

#css

,

#html

,

#typography

CSS Best Practices in Fluid Typography

Aug 15, 2021

CSS Units in a Nutshell 🐚

#css

,

#html

Are you still writing your css units in pixels and percentages? if you are then...

Aug 8, 2021

Master Markdown in 5minutes ⌚

#markdown

,

#documentation

Markdown is a lightweight markup language for creating formatted text using a...

Aug 1, 2021

What is JAMStack ✨

#jamstack

Jamstack stands for Javascript APIS and Markup and it is based on this idea of...

Jul 31, 2021

+

Check my latest Blog Post

HAR Files: Your Secret Weapon for Debugging Production Issues

Read Now
Oh My Gawwdd!!!!!!!

Wow you have been viewing my site since 20 seconds!

+
+