{"slug": "yjs", "name": "Yjs", "category": "dev-libs", "category_name": "Libraries and frameworks", "description": "", "recommenders": 8, "commenters": 29, "warners": 6, "score": 5.536, "rising": -2.62, "first": "2025-11-27", "latest": "2026-07-08", "why": "the only 3rd party library I used was the excellent Y.js for the CRDT stack", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 8, "neutral": 15, "compare": 1, "warn": 8}, "spark": [0, 1, 0, 0, 5, 1, 1, 0, 0, 0, 0, 0], "listed": true, "loved": [], "caveat": "", "short_quote": "the only 3rd party library I used was the excellent Y.js for the CRDT stack", "kind": "", "icon": true, "domain": null, "github_repo": "github.com/yjs/yjs", "official_url": "https://yjs.dev", "pricing": "", "aliases": ["Yjs", "yjs", "Y.js"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 770103568, "item_id": 48131473, "url": "https://news.ycombinator.com/item?id=48131473", "by": "user3939382", "date": "2026-05-13", "stance": "recommend", "quote": "Highly suggest you take a look here: https://github.com/yjs/yjs", "excerpt": "Highly suggest you take a look here: https://github.com/yjs/yjs CRDT can absolutely do what you\u2019re asking.", "context": "", "use_case": "", "switched_from": "", "story": "Quack: The DuckDB Client-Server Protocol"}, {"id": 765592048, "item_id": 47849503, "url": "https://news.ycombinator.com/item?id=47849503", "by": "phpnode", "date": "2026-04-21", "stance": "recommend", "quote": "I use Y.js for collaborative editing in my product", "excerpt": "Gremlin-like API gives end to end type safety if you're querying the database from TypeScript. This was the original motivation for the library. Zod/Valibot/ArkType/Standard Schema support because you need a way to define your schema and this allows for that at runtime and compile time. Y.js as a backing store because I needed to support offline sync, branching/forking, and I use Y.js for collaborative editing in my ", "context": "", "use_case": "CRDT backing store", "switched_from": "", "story": "A type-safe, realtime collaborative Graph Database in a CRDT"}, {"id": 759713312, "item_id": 47482082, "url": "https://news.ycombinator.com/item?id=47482082", "by": "josephg", "date": "2026-03-22", "stance": "recommend", "quote": "This is an implementation of FugueMax (Weidner and Kleppmann) done using a bunch of tricks from Yjs (Jahns).", "excerpt": "I bet you can make a small, beautiful implementation of this algorithm in most languages. Most algorithms - even ones that take generations of researchers to figure out - end up tiny in practice if you put the work in to understand them properly and program them in a beautiful way. Transformers are the same. Genius idea. But a very small amount of code to implement. This is an implementation of FugueMax (Weidner and ", "context": "", "use_case": "CRDT implementation techniques", "switched_from": "", "story": "A Coherent Vision for the Future of Version Control"}, {"id": 759637761, "item_id": 47477360, "url": "https://news.ycombinator.com/item?id=47477360", "by": "artursapek", "date": "2026-03-22", "stance": "recommend", "quote": "the only 3rd party library I used was the excellent Y.js for the CRDT stack", "excerpt": "I started building this 10 months ago, largely using agentic coding tools. I've stayed very involved in the code base and architecture, and have never moved faster in my life as a dev. The word processor engine and rendering layer are all built from scratch - the only 3rd party library I used was the excellent Y.js for the CRDT stack. Would love some feedback!", "context": "", "use_case": "CRDT stack", "switched_from": "", "story": "Revise \u2013 An AI Editor for Documents"}, {"id": 758652800, "item_id": 47415800, "url": "https://news.ycombinator.com/item?id=47415800", "by": "braden-lk", "date": "2026-03-17", "stance": "recommend", "quote": "the DX is fantastic", "excerpt": "The y-prosemirror rewrite is super exciting! To speak on yjs: We use yjs over at LegendKeeper. We're not a huge app, but our users do worldbuilding for D&D, and have amassed over 30+ million collaborative documents, ranging from rich text to fantasy maps to fantasy timelines. Is yjs technically overkill when you have a central tie-breaker? Sure, but the DX is fantastic, and personally I love the idea of my applicatio", "context": "Works at LegendKeeper", "use_case": "Collaborative document editing", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}]}], "caveats": [{"label": "", "summary": "", "quotes": [{"id": 771463730, "item_id": 48216483, "url": "https://news.ycombinator.com/item?id=48216483", "by": "youngbum", "date": "2026-05-20", "stance": "warn", "quote": "The docs are fragmented, and the nature of y\u201dJS\u201d, locks the whole code into Javascript infrastructure.", "excerpt": "Huge fan of Hocuspocus. Congrats on the new release and grateful for your efforts. We have been using Hocuspocus to sync multiple users in our form builder editor (https://walla.my), and they were very reliable and sturdy. We not only write descriptions with TipTap but also sync the fields and logic itself. Actually, the previous version was eligible to build and deploy with Bun though. We did also try to deploy them", "context": "form builder developer", "use_case": "CRDT sync", "switched_from": "", "story": null}, {"id": 758677840, "item_id": 47417365, "url": "https://news.ycombinator.com/item?id=47417365", "by": "marijn", "date": "2026-03-17", "stance": "warn", "quote": "recommending y-prosemirror for anything feels unserious", "excerpt": "I watched the presentation, but I'm getting the impression that you're still using a hierarchical XML-like structure for the document, which sounds like it still cannot merge or split nodes (without recreating the content after the merge or split point). Will issues like https://github.com/yjs/y-prosemirror/issues/205 be addressed by this? (Which not only breaks ProseMirror's position mapping, but also your own, and ", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758477984, "item_id": 47404874, "url": "https://news.ycombinator.com/item?id=47404874", "by": "antics", "date": "2026-03-16", "stance": "warn", "quote": "This is much, much harder than it looks, and it's inherently lossy", "excerpt": "I know it seems that way, but it's actually not 80% of the way to a CRDT because rich text CRDTs are an open research problem. Yjs instead models the document as an XML tree and then attempts to recreate the underlying rich text transaction. This is much, much harder than it looks, and it's inherently lossy, and this fundamental impedance mismatch is one of the core complaints of this article. Some progress is being ", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758368944, "item_id": 47398059, "url": "https://news.ycombinator.com/item?id=47398059", "by": "miloignis", "date": "2026-03-16", "stance": "warn", "quote": "I feel like their issue is with Yjs, not CRDTs in general.", "excerpt": "(Xpost from my lobsters comment since the Author's active over here): I really disagree with this article - despite protestation, I feel like their issue is with Yjs, not CRDTs in general. Namely, their proposed solution: For each document, there is a single authority that holds the source of truth: the document, applied steps, and the current version. A client submits some transactional steps and the lastSeenVersion", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}]}], "who": [{"by": "braden-lk", "context": "Works at LegendKeeper", "url": "https://news.ycombinator.com/item?id=47415800", "date": "2026-03-17"}], "tags": [], "use_cases": ["crdt sync", "collaborative editing", "state sync", "real-time sync", "crdt backing store", "crdt implementation techniques"], "compared": [{"slug": "automerge", "name": "Automerge", "co": 5, "switched_from": 0, "switched_to": 0}, {"slug": "prosemirror", "name": "ProseMirror", "co": 4, "switched_from": 0, "switched_to": 0}, {"slug": "matrix", "name": "Matrix", "co": 3, "switched_from": 0, "switched_to": 0}, {"slug": "tiptap", "name": "Tiptap", "co": 3, "switched_from": 0, "switched_to": 0}], "makers": [{"id": 758579792, "item_id": 47411237, "url": "https://news.ycombinator.com/item?id=47411237", "by": "kevinjahns", "date": "2026-03-17", "stance": "recommend", "quote": "Yjs is a general-purpose framework that enables you to make EVERYTHING collaborative.", "excerpt": "Hi, the author of Yjs here. Thanks, Nick, for chiming in! As this article is blowing up now, I want to address a few points. I, too, feel the need for simplicity over overly complex solutions - and I found it in CRDTs. They beautifully allow me to reason about conflicts - so that my users don't have to. Very few people can design a custom conflict resolution algorithm for an application. Yjs is a general-purpose fram", "context": "author of Yjs", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}], "threads": [{"url": "https://news.ycombinator.com/item?id=47359712", "title": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs", "mentions": 13}, {"url": "https://news.ycombinator.com/item?id=46923736", "title": "France's homegrown open source online office suite", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=48841133", "title": "Compendium \u2013 Shared workspace for teams and AI agents", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48692474", "title": "The open source DOCX editor submitted to HN a few weeks ago has been deleted", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48449187", "title": "Ask HN: What are tools you have made for yourself since the advent of AI", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48295071", "title": "Show HN: Open-source Workspace (mail,docs,spreadsheet,drive) web/iOS", "mentions": 1}], "sentiment_by_month": {"2025-11": {"warn": 1}, "2025-12": {"recommend": 1, "neutral": 1}, "2026-01": {}, "2026-02": {"neutral": 4}, "2026-03": {"warn": 6, "recommend": 5, "neutral": 5, "compare": 1}, "2026-04": {"recommend": 1}, "2026-05": {"neutral": 2, "recommend": 1, "warn": 1}, "2026-06": {"neutral": 2}, "2026-07": {"neutral": 1}, "2026-08": {}, "2026-09": {}, "2026-10": {}}, "quotes": [{"id": 781458851, "item_id": 48841178, "url": "https://news.ycombinator.com/item?id=48841178", "by": "Azimuth05", "date": "2026-07-08", "stance": "neutral", "quote": "Real-time collaboration on documents runs on Yjs CRDTs over CodeMirror 6", "excerpt": "Hey HN, we're Jonathan, Ollie, and Lucas, and we're building Compendium ([https://cerenovus.ai/compendium](https://cerenovus.ai/compendium)). Compendium is a shared workspace that keeps your whole team, humans and coding agents alike, working from the same source of truth. Quick launch vid here: [https://www.youtube.com/shorts/Vw\\_aFL7YOUI](https://www.youtube.com/shorts/Vw_aFL7YOUI) We started building this after ru", "context": "", "use_case": "", "switched_from": "", "story": "Compendium \u2013 Shared workspace for teams and AI agents"}, {"id": 779091777, "item_id": 48693236, "url": "https://news.ycombinator.com/item?id=48693236", "by": "nathanstitt", "date": "2026-06-26", "stance": "neutral", "quote": "It has a golang backend that reads/writes docx and translates to YJS", "excerpt": "Also not affiliated but my open-source tinycld uses docx as the backend storage for its text package. Supports _most_ of the features (including comments and suggestions) but is still very young. It has a golang backend that reads/writes docx and translates to YJS that the editor reads for multi-user access. Has web/iOS/Android support. I found docx to be a very well documented format and a surprisingly good fit for ", "context": "", "use_case": "", "switched_from": "", "story": "The open source DOCX editor submitted to HN a few weeks ago has been deleted"}, {"id": 775448817, "item_id": 48465551, "url": "https://news.ycombinator.com/item?id=48465551", "by": "eternityforest", "date": "2026-06-09", "stance": "neutral", "quote": "runs entirely in the browser with yjs", "excerpt": "This inventory tracker app that runs entirely in the browser with yjs, and syncs over peer.js, that I have not been very good about using lately https://eternityforest.github.io/Stuffer/ Not an app, but a productivity system, partially refined by telling AI every time I forgot anything and asking for research references on human error that are relevant to that specific mistake: https://github.com/EternityForest/THUND", "context": "", "use_case": "state sync", "switched_from": "", "story": "Ask HN: What are tools you have made for yourself since the advent of AI"}, {"id": 772798227, "item_id": 48299889, "url": "https://news.ycombinator.com/item?id=48299889", "by": "nathanstitt", "date": "2026-05-27", "stance": "neutral", "quote": "served with yjs to clients", "excerpt": "Good question, TinyCld does uses docx/xlsx files on the drive package as the native storage for text/calc. Drive is exported via webdav so doing so lets native clients load the files as well. Locking is used though so web & native _hopefully_ do not conflict. Text uses https://github.com/ZeroHawkeye/wordZero to read/write the docx, parse it into a y-prosemirror and served with yjs to clients using https://github.com/", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: Open-source Workspace (mail,docs,spreadsheet,drive) web/iOS"}, {"id": 771463730, "item_id": 48216483, "url": "https://news.ycombinator.com/item?id=48216483", "by": "youngbum", "date": "2026-05-20", "stance": "warn", "quote": "The docs are fragmented, and the nature of y\u201dJS\u201d, locks the whole code into Javascript infrastructure.", "excerpt": "Huge fan of Hocuspocus. Congrats on the new release and grateful for your efforts. We have been using Hocuspocus to sync multiple users in our form builder editor (https://walla.my), and they were very reliable and sturdy. We not only write descriptions with TipTap but also sync the fields and logic itself. Actually, the previous version was eligible to build and deploy with Bun though. We did also try to deploy them", "context": "form builder developer", "use_case": "CRDT sync", "switched_from": "", "story": null}, {"id": 770103568, "item_id": 48131473, "url": "https://news.ycombinator.com/item?id=48131473", "by": "user3939382", "date": "2026-05-13", "stance": "recommend", "quote": "Highly suggest you take a look here: https://github.com/yjs/yjs", "excerpt": "Highly suggest you take a look here: https://github.com/yjs/yjs CRDT can absolutely do what you\u2019re asking.", "context": "", "use_case": "", "switched_from": "", "story": "Quack: The DuckDB Client-Server Protocol"}, {"id": 768452690, "item_id": 48028293, "url": "https://news.ycombinator.com/item?id=48028293", "by": "havlenao", "date": "2026-05-05", "stance": "neutral", "quote": "The Yjs binding is optimized to only sync the delta", "excerpt": "The mind map view uses D3 flextree for layout calculation, and we render only the visible nodes (virtualization). So even with 200+ nodes, the layout stays smooth. On the text editor side, we use Tiptap which handles large documents well. The Yjs binding is optimized to only sync the delta, not the whole document. We're actively working on further graph editor performance improvements, especially around initial rende", "context": "", "use_case": "Real-time sync", "switched_from": "", "story": "Show HN: Brainio \u2013 Markdown notepad that turns notes into visual mind maps"}, {"id": 765592048, "item_id": 47849503, "url": "https://news.ycombinator.com/item?id=47849503", "by": "phpnode", "date": "2026-04-21", "stance": "recommend", "quote": "I use Y.js for collaborative editing in my product", "excerpt": "Gremlin-like API gives end to end type safety if you're querying the database from TypeScript. This was the original motivation for the library. Zod/Valibot/ArkType/Standard Schema support because you need a way to define your schema and this allows for that at runtime and compile time. Y.js as a backing store because I needed to support offline sync, branching/forking, and I use Y.js for collaborative editing in my ", "context": "", "use_case": "CRDT backing store", "switched_from": "", "story": "A type-safe, realtime collaborative Graph Database in a CRDT"}, {"id": 759713312, "item_id": 47482082, "url": "https://news.ycombinator.com/item?id=47482082", "by": "josephg", "date": "2026-03-22", "stance": "recommend", "quote": "This is an implementation of FugueMax (Weidner and Kleppmann) done using a bunch of tricks from Yjs (Jahns).", "excerpt": "I bet you can make a small, beautiful implementation of this algorithm in most languages. Most algorithms - even ones that take generations of researchers to figure out - end up tiny in practice if you put the work in to understand them properly and program them in a beautiful way. Transformers are the same. Genius idea. But a very small amount of code to implement. This is an implementation of FugueMax (Weidner and ", "context": "", "use_case": "CRDT implementation techniques", "switched_from": "", "story": "A Coherent Vision for the Future of Version Control"}, {"id": 759637761, "item_id": 47477360, "url": "https://news.ycombinator.com/item?id=47477360", "by": "artursapek", "date": "2026-03-22", "stance": "recommend", "quote": "the only 3rd party library I used was the excellent Y.js for the CRDT stack", "excerpt": "I started building this 10 months ago, largely using agentic coding tools. I've stayed very involved in the code base and architecture, and have never moved faster in my life as a dev. The word processor engine and rendering layer are all built from scratch - the only 3rd party library I used was the excellent Y.js for the CRDT stack. Would love some feedback!", "context": "", "use_case": "CRDT stack", "switched_from": "", "story": "Revise \u2013 An AI Editor for Documents"}, {"id": 758761760, "item_id": 47422610, "url": "https://news.ycombinator.com/item?id=47422610", "by": "antics", "date": "2026-03-18", "stance": "neutral", "quote": "We would have paid for Yjs too, if we thought it was a good use of resources!", "excerpt": "Just to be extremely clear: we pay for a lot of OSS software. We pay one individual project more than $10,000 a year. We would have paid for Yjs too, if we thought it was a good use of resources!", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758742881, "item_id": 47421430, "url": "https://news.ycombinator.com/item?id=47421430", "by": "ndezt", "date": "2026-03-17", "stance": "neutral", "quote": "Yjs handles the CRDT state in memory", "excerpt": "Keeping docs, RFCs, and architecture diagrams in local Markdown files backed by Git is the ideal workflow\u2014until you need to collaborate. Git is built for lines of code, not prose. The moment you need real-time feedback on an RFC or a system diagram, you're usually forced to copy-paste everything into Confluence or Google Docs, fracturing your source of truth. I built CollabMD to bridge this gap. It adds a real-time m", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: CollabMD \u2013 Real-time multiplayer for local and Git-backed Markdown"}, {"id": 758677840, "item_id": 47417365, "url": "https://news.ycombinator.com/item?id=47417365", "by": "marijn", "date": "2026-03-17", "stance": "warn", "quote": "recommending y-prosemirror for anything feels unserious", "excerpt": "I watched the presentation, but I'm getting the impression that you're still using a hierarchical XML-like structure for the document, which sounds like it still cannot merge or split nodes (without recreating the content after the merge or split point). Will issues like https://github.com/yjs/y-prosemirror/issues/205 be addressed by this? (Which not only breaks ProseMirror's position mapping, but also your own, and ", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758652800, "item_id": 47415800, "url": "https://news.ycombinator.com/item?id=47415800", "by": "braden-lk", "date": "2026-03-17", "stance": "recommend", "quote": "the DX is fantastic", "excerpt": "The y-prosemirror rewrite is super exciting! To speak on yjs: We use yjs over at LegendKeeper. We're not a huge app, but our users do worldbuilding for D&D, and have amassed over 30+ million collaborative documents, ranging from rich text to fantasy maps to fantasy timelines. Is yjs technically overkill when you have a central tie-breaker? Sure, but the DX is fantastic, and personally I love the idea of my applicatio", "context": "Works at LegendKeeper", "use_case": "Collaborative document editing", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758560272, "item_id": 47410017, "url": "https://news.ycombinator.com/item?id=47410017", "by": "Reinmar", "date": "2026-03-17", "stance": "warn", "quote": "", "excerpt": "I feel we were quite lucky back in 2015 when we started rewriting CKEditor with RTC as a core requirement. At the time, OT seemed like the only viable option, so the choice was simple :) What definitely helped too was having a very specific use case (rich-text editing) which guided many of our decisions. We focused heavily on getting the user experience right for common editing scenarios. And I fully agree that it's ", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758558624, "item_id": 47409914, "url": "https://news.ycombinator.com/item?id=47409914", "by": "nickthesick", "date": "2026-03-17", "stance": "warn", "quote": "", "excerpt": "FWIW, I'm literally working on rewriting the y-prosemirror binding today with Kevin Jahns, the creator of Y.js and wrote the initial binding. Yes, the current binding has it's flaws, but we hope to flush out the most egregious of them with a completely different design which I made a presentation about at FOSDEM this year: https://fosdem.org/2026/schedule/event/8VKQXR-blocknote-yjs-prosemirror/", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758541856, "item_id": 47408866, "url": "https://news.ycombinator.com/item?id=47408866", "by": "ianberdin", "date": "2026-03-16", "stance": "recommend", "quote": "YJS works perfectly. I use it for years on PlayCode.", "excerpt": "YJS works perfectly. I use it for years on PlayCode. But you are talking about the specific plugin for prosemiror. Yes, here I agree: yjs core is well written, while plugins are \u201cnice to have\u201d.", "context": "", "use_case": "collaborative editing", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758524128, "item_id": 47407758, "url": "https://news.ycombinator.com/item?id=47407758", "by": "cyanydeez", "date": "2026-03-16", "stance": "neutral", "quote": "Since Yjs doesn't care about order or operations", "excerpt": "https://github.com/disarticulate/y-webrtc/blob/master/src/y-webrtc.js has a validMessage function passed into the room. This allows you to validate any update and reject them. It might be \"costly\", but it lets you inspect the next object. Since Yjs doesn't care about order or operations, it doesn't really matter how long validation takes. Not sure what the error conditions loop like, but you could probably bootstrap ", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758522704, "item_id": 47407669, "url": "https://news.ycombinator.com/item?id=47407669", "by": "josephg", "date": "2026-03-16", "stance": "recommend", "quote": "But Yjs's actual implementation is very clever and I'm quite confident its correct.", "excerpt": "Yes, I think it would be a good paper. I made a tiny self contained implementation of this algorithm here if anyone is curious: https://github.com/josephg/crdt-from-scratch/blob/master/crdt.ts FugueMax (or Yjs) fit in a few hundred lines of code. This approach also performs well (better than a tree based structure). And there's a laundry list of ways this code can be optimised if you want better performance. If anyon", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758477984, "item_id": 47404874, "url": "https://news.ycombinator.com/item?id=47404874", "by": "antics", "date": "2026-03-16", "stance": "warn", "quote": "This is much, much harder than it looks, and it's inherently lossy", "excerpt": "I know it seems that way, but it's actually not 80% of the way to a CRDT because rich text CRDTs are an open research problem. Yjs instead models the document as an XML tree and then attempts to recreate the underlying rich text transaction. This is much, much harder than it looks, and it's inherently lossy, and this fundamental impedance mismatch is one of the core complaints of this article. Some progress is being ", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758368944, "item_id": 47398059, "url": "https://news.ycombinator.com/item?id=47398059", "by": "miloignis", "date": "2026-03-16", "stance": "warn", "quote": "I feel like their issue is with Yjs, not CRDTs in general.", "excerpt": "(Xpost from my lobsters comment since the Author's active over here): I really disagree with this article - despite protestation, I feel like their issue is with Yjs, not CRDTs in general. Namely, their proposed solution: For each document, there is a single authority that holds the source of truth: the document, applied steps, and the current version. A client submits some transactional steps and the lastSeenVersion", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758366801, "item_id": 47397925, "url": "https://news.ycombinator.com/item?id=47397925", "by": "nchmy", "date": "2026-03-16", "stance": "neutral", "quote": "the implementation is based on yjs", "excerpt": "Fantastic article. I was particularly interested because WordPress has been working to add collaborative editing and the implementation is based on yjs. I hope that won't end up being an issue... It would have been nice if the article compared yjs with automerge and others. Jsonjoy, in particular, appears very impressive. https://jsonjoy.com/", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 758330832, "item_id": 47395677, "url": "https://news.ycombinator.com/item?id=47395677", "by": "kaiwenwang", "date": "2026-03-15", "stance": "compare", "quote": "which basically does the same thing along with Automerge", "excerpt": "It appears Moment is producing \"high-performance, collaborative, truly-offline-capable, fully-programmable document editor\" - https://www.moment.dev/blog There seems to be a conflict of interest with describing Yjs's performance, which basically does the same thing along with Automerge.", "context": "", "use_case": "", "switched_from": "", "story": "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"}, {"id": 757934085, "item_id": 47370880, "url": "https://news.ycombinator.com/item?id=47370880", "by": "kavinsood", "date": "2026-03-13", "stance": "neutral", "quote": "I'm not sharding Yjs per file", "excerpt": "Hey Daniel, It is so awesome to see you here. 1. Spot on. This is the ceiling of text-based CRDTs. Since we last spoke, I fixed the structural side of renames by moving path authority onto stable IDs, but links inside the note body are still plain text, so concurrent rename-driven rewrites can duplicate. I realised that this problem is uniquely painful in Obsidian because of the \"Automatically update internal links\" ", "context": "", "use_case": "CRDT sync", "switched_from": "", "story": "Show HN: YAOS \u2013 A 1-click deploy, real-time sync engine for Obsidian"}, {"id": 757413489, "item_id": 47338343, "url": "https://news.ycombinator.com/item?id=47338343", "by": "eternityforest", "date": "2026-03-11", "stance": "neutral", "quote": "Everything stored in the browser with YJS", "excerpt": "A web based inventory management app. I've wanted to try something like this for a long time, but it always seemed completely impractical to spend a few weeks on before AI, without knowing if the entire idea is actually practical. So far, I think it is in fact worth it, but only in specific use cases, like very rarely accessed items with no obvious place, and making sure your AV gear you bring to events comes back wi", "context": "", "use_case": "browser data storage", "switched_from": "", "story": "Ask HN: What Are You Working On? (March 2026)"}, {"id": 756690865, "item_id": 47293179, "url": "https://news.ycombinator.com/item?id=47293179", "by": "gavmor", "date": "2026-03-07", "stance": "recommend", "quote": "really fluid, skeuomorphic experiences like those enabled by, eg pragmatic-drag-and-drop[0] or yjs[1]", "excerpt": "I really like these sorts of frameworks from an architectural perspective, but what's the use-case? Maybe I'm too SPA-pilled, because to me all the fun of Web development is in providing really fluid, skeuomorphic experiences like those enabled by, eg pragmatic-drag-and-drop[0] or yjs[1]. I just struggle to envision what application benefits from the efficiency that this or htmx offer, but from neither the ultra-inte", "context": "", "use_case": "Collaborative editing", "switched_from": "", "story": "Show HN: \u00b5JS, a 5KB alternative to Htmx and Turbo with zero dependencies"}, {"id": 756050321, "item_id": 47253145, "url": "https://news.ycombinator.com/item?id=47253145", "by": "GermanJablo", "date": "2026-03-04", "stance": "warn", "quote": "Yjs for the same doc grows every time someone types, pastes, or undoes.", "excerpt": "The tombstone problem is exactly why I built DocNode. You're right that you can't compact them without consensus, so DocNode just doesn't create them. It assumes a server decides the order, which is already the case in 99% of collaborative apps. The result: a doc stays the same size whether it was edited once or a thousand times. Yjs for the same doc grows every time someone types, pastes, or undoes. Check it out: ht", "context": "", "use_case": "", "switched_from": "", "story": "An Interactive Intro to CRDTs"}, {"id": 751055937, "item_id": 46940996, "url": "https://news.ycombinator.com/item?id=46940996", "by": "sreekanth850", "date": "2026-02-08", "stance": "neutral", "quote": "ephemeral yjs/hocupocus sync infrastructure", "excerpt": "Working on an ephemeral yjs/hocupocus sync infrastructure. (https://wiresocket.com)", "context": "", "use_case": "", "switched_from": "", "story": "Ask HN: What Are You Working On? (February 2026)"}, {"id": 750923490, "item_id": 46932718, "url": "https://news.ycombinator.com/item?id=46932718", "by": "smartbit", "date": "2026-02-08", "stance": "neutral", "quote": "Docs, bloknotejs & Yjs", "excerpt": "Last week\u2019s presentation on Docs, bloknotejs & Yjs https://fosdem.org/2026/schedule/event/DC97FQ-building_digital_workplace_solutions_on_top_of_foundational_libraries_blocknote_/", "context": "", "use_case": "", "switched_from": "", "story": "France's homegrown open source online office suite"}, {"id": 750793221, "item_id": 46924576, "url": "https://news.ycombinator.com/item?id=46924576", "by": "YousefED", "date": "2026-02-07", "stance": "neutral", "quote": "related projects like Yjs (https://yjs.dev) by sponsoring feature development", "excerpt": "Great to see this on HN. fyi, La Suite is an umbrella project built by DINUM in France that started several years ago, mainly to enable people in the public administration to use more independent tools. It's built in-house, often on top of other open source technologies. E.g.: Matrix powers chat and LiveKit powers Visio (which was recently featured on HN as well when they announced it's rolled out to replace Zoom / T", "context": "", "use_case": "", "switched_from": "", "story": "France's homegrown open source online office suite"}, {"id": 750723281, "item_id": 46920205, "url": "https://news.ycombinator.com/item?id=46920205", "by": "mweidner", "date": "2026-02-06", "stance": "neutral", "quote": "Yjs has its own representation of the state as a CRDT tree", "excerpt": "Managing \"a flat-ish collection of nodes\" that can be moved around (without merely deleting and re-inserting nodes) is tricky because of how paragraphs can be split and merged. Notion tackled this for their offline mode: https://www.youtube.com/watch?v=AKDcWRkbjYs If you take that as a solved problem, do your concerns change? > Selection & Cursors: Selection across regions is notoriously hard. If \"Region A\" and \"Regi", "context": "", "use_case": "", "switched_from": "", "story": null}, {"id": 741819987, "item_id": 46363749, "url": "https://news.ycombinator.com/item?id=46363749", "by": "uSayhi", "date": "2025-12-23", "stance": "neutral", "quote": "built with React, Zustand, and Yjs for real-time collaboration", "excerpt": "Hi HN, I'm the author of Ascii Canvas. I built this because I wanted a visual tool that produces artifacts readable by LLMs (unlike pixel-based whiteboards). It's an infinite canvas built with React, Zustand, and Yjs for real-time collaboration. The hardest part was handling the grid alignment for mixed-width characters (English, CJK, Emojis, and Nerd Fonts) to ensure the rendered text looks perfect in editors/termin", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: ASCII Canvas for AI Context"}, {"id": 741229009, "item_id": 46326813, "url": "https://news.ycombinator.com/item?id=46326813", "by": "danbitengo", "date": "2025-12-19", "stance": "recommend", "quote": "Kevin's optimization work on Yjs is masterful", "excerpt": "Hey HN, I'm Daniel, creator of SyncKit. I've been obsessed with the Ink & Switch \"Local-First Software\" vision for some time now\u2014apps that work offline, feel instant, and give users control of their data. But every time I tried to build a local-first app, I hit the same wall: integration complexity. The existing CRDT libraries (Yjs, Automerge) are incredible\u2014they pioneered the algorithms that make local-first work. K", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: SyncKit \u2013 TLA+ verified CRDT for local-first apps (zero unsafe Rust)"}, {"id": 737116930, "item_id": 46069808, "url": "https://news.ycombinator.com/item?id=46069808", "by": "danbitengo", "date": "2025-11-27", "stance": "warn", "quote": "too complex (Automerge/Yjs require learning CRDTs)", "excerpt": "Hey HN, I built SyncKit after shipping two local-first projects (RestBolt and Graft) and realizing there's no simple way to add cross-device sync. The problem: Existing solutions are either too complex (Automerge/Yjs require learning CRDTs) or too restrictive (Firebase isn't truly local-first, Supabase has no offline support - issue #357 has been open 4+ years with 350+ upvotes). SyncKit is the middle ground: simple ", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: SyncKit \u2013 Offline-first sync engine (Rust/WASM and TypeScript)"}]}