{"slug": "automerge", "name": "Automerge", "category": "dev-libs", "category_name": "Libraries and frameworks", "description": "", "recommenders": 5, "commenters": 14, "warners": 0, "score": 6.2, "rising": -1.64, "first": "2025-11-13", "latest": "2026-10-01", "why": "They are themselves full CRDTs, with strong proofs about their characteristics under stress.", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 5, "neutral": 5, "compare": 4, "warn": 1}, "spark": [3, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], "listed": true, "loved": [], "caveat": "", "short_quote": "They are themselves full CRDTs, with strong proofs about their characteristics under stress.", "kind": "", "icon": true, "domain": "automerge.org", "github_repo": null, "official_url": "https://automerge.org", "pricing": "", "aliases": ["Automerge"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 784324065, "item_id": 49020254, "url": "https://news.ycombinator.com/item?id=49020254", "by": "probst", "date": "2026-07-23", "version": null, "stance": "recommend", "quote": "It would be amazing to have this build on top of automerge or something like that!", "excerpt": "Taking a peek at the repo and the local first data layer issue (https://github.com/bartblast/hologram/issues/940) I get the sense that you aren't (and not planning to) using any off-the-shelf CRDT or the like, am I right in that assumption? How will conflict resolution be handled? Or is it a last-write-wins type setup? It would be amazing to have this build on top of automerge or something like that! It could compile", "context": "", "use_case": "", "switched_from": "", "story": "Hologram works. Elixir runs in the browser"}, {"id": 741229010, "item_id": 46326813, "url": "https://news.ycombinator.com/item?id=46326813", "by": "danbitengo", "date": "2025-12-19", "version": null, "stance": "recommend", "quote": "Automerge changed how I think about distributed systems", "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": 737449152, "item_id": 46090572, "url": "https://news.ycombinator.com/item?id=46090572", "by": "michelpp", "date": "2025-11-29", "version": null, "stance": "recommend", "quote": "Automerge is an excellent library, with a great API", "excerpt": "Automerge is an excellent library, with a great API, not just in Rust, but also Javascript and C. > All you need for the backend is key-value storage with range/prefix queries; This is true, I was able to quickly put together a Redis automerge library that supports the full API, including pub/sub of changes to subscribers for a full persistent sync server [0]. I was surprised how quickly it came together. Using some ", "context": "", "use_case": "", "switched_from": "", "story": "The CRDT Dictionary: A Field Guide to Conflict-Free Replicated Data Types"}, {"id": 737434592, "item_id": 46089662, "url": "https://news.ycombinator.com/item?id=46089662", "by": "btown", "date": "2025-11-29", "version": null, "stance": "recommend", "quote": "They are themselves full CRDTs, with strong proofs about their characteristics under stress.", "excerpt": "One of the most interesting things to me about CRDTs, and something that a skim of the article (with its focus on low-level CRDTs) might give the wrong impression on... is that things like https://automerge.org/ are not just \"libraries\" that \"throw together\" low-level CRDTs. They are themselves full CRDTs, with strong proofs about their characteristics under stress. Per the Automerge website: > We are driven to build", "context": "", "use_case": "", "switched_from": "", "story": "The CRDT Dictionary: A Field Guide to Conflict-Free Replicated Data Types"}, {"id": 737175008, "item_id": 46073438, "url": "https://news.ycombinator.com/item?id=46073438", "by": "jmoggr", "date": "2025-11-27", "version": null, "stance": "recommend", "quote": "I've been using Automerge for a while and haven't had to look at any CRDTs.", "excerpt": "> Automerge/Yjs require learning CRDTs I've been using Automerge for a while and haven't had to look at any CRDTs. To me this looks very similar to Automerge. Neat project!", "context": "", "use_case": "Sync / CRDT library", "switched_from": "", "story": "Show HN: SyncKit \u2013 Offline-first sync engine (Rust/WASM and TypeScript)"}]}], "caveats": [{"label": "", "summary": "", "quotes": [{"id": 737116929, "item_id": 46069808, "url": "https://news.ycombinator.com/item?id=46069808", "by": "danbitengo", "date": "2025-11-27", "version": null, "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)"}]}], "who": [{"by": "escafil", "context": "software developer on an enterprise VPN product", "url": "https://news.ycombinator.com/item?id=49927293", "date": "2026-10-01"}], "tags": [], "use_cases": ["distributed system synchronization", "crdt sync library", "crdt library", "sync / crdt library"], "compared": [{"slug": "yjs", "name": "Yjs", "co": 5, "switched_from": 0, "switched_to": 0}, {"slug": "loro", "name": "Loro", "co": 3, "switched_from": 0, "switched_to": 0}, {"slug": "triplit", "name": "Triplit", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "supabase", "name": "Supabase", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "tlaplus", "name": "TLA+", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "firebase", "name": "Firebase", "co": 2, "switched_from": 0, "switched_to": 0}], "makers": [], "threads": [{"url": "https://news.ycombinator.com/item?id=46087022", "title": "The CRDT Dictionary: A Field Guide to Conflict-Free Replicated Data Types", "mentions": 5}, {"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": 2}, {"url": "https://news.ycombinator.com/item?id=46069598", "title": "Show HN: SyncKit \u2013 Offline-first sync engine (Rust/WASM and TypeScript)", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=49922568", "title": "Ask HN: Who wants to be hired? (October 2026)", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49076945", "title": "Convergence Is Not Enough", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49007620", "title": "Hologram works. Elixir runs in the browser", "mentions": 1}], "sentiment_by_month": {"2025-11": {"neutral": 1, "warn": 1, "recommend": 3, "compare": 2}, "2025-12": {"recommend": 1}, "2026-01": {}, "2026-02": {}, "2026-03": {"neutral": 1, "compare": 2}, "2026-04": {}, "2026-05": {"neutral": 1}, "2026-06": {}, "2026-07": {"recommend": 1}, "2026-08": {"neutral": 1}, "2026-09": {}, "2026-10": {"neutral": 1}}, "versions": [], "version_unnamed": 0, "family_ref": null, "runs_on": null, "lines": [], "quotes": [{"id": 798836688, "item_id": 49927293, "url": "https://news.ycombinator.com/item?id=49927293", "by": "escafil", "date": "2026-10-01", "version": null, "stance": "neutral", "quote": "building this distributed system on top of Automerge, a CRDT library which the servers use for synchronization", "excerpt": "Location: Toronto, Canada (authorized to work in US and Canada) Remote: Remote, hybrid, or in-person Willing to relocate: No Technologies: Experienced in Rust (tokio, axum), JavaScript/TypeScript (React, Redux, Next.js, Vue.js), Python, C/C++, SQL, Automerge (CRDT). Have some familiarity with Nix, MongoDB, Java, Ansible, Haskell. Front end-specific experience: Amplitude, Figma, Storybook, Prisma ORM, responsive desig", "context": "software developer on an enterprise VPN product", "use_case": "distributed system synchronization", "switched_from": "", "story": "Ask HN: Who wants to be hired? (October 2026)"}, {"id": 786439456, "item_id": 49152466, "url": "https://news.ycombinator.com/item?id=49152466", "by": "Animats", "date": "2026-08-03", "version": null, "stance": "neutral", "quote": "This is apparently based on Automerge.", "excerpt": "This is apparently based on Automerge.[1] It sounds like a really good idea. Is it a good enough idea to sync MMO game clients and servers? Paper from 2012, last Automerge site update in 2025. Why isn't this everywhere? [1] https://automerge.org/", "context": "", "use_case": "CRDT sync library", "switched_from": "", "story": "Convergence Is Not Enough"}, {"id": 784324065, "item_id": 49020254, "url": "https://news.ycombinator.com/item?id=49020254", "by": "probst", "date": "2026-07-23", "version": null, "stance": "recommend", "quote": "It would be amazing to have this build on top of automerge or something like that!", "excerpt": "Taking a peek at the repo and the local first data layer issue (https://github.com/bartblast/hologram/issues/940) I get the sense that you aren't (and not planning to) using any off-the-shelf CRDT or the like, am I right in that assumption? How will conflict resolution be handled? Or is it a last-write-wins type setup? It would be amazing to have this build on top of automerge or something like that! It could compile", "context": "", "use_case": "", "switched_from": "", "story": "Hologram works. Elixir runs in the browser"}, {"id": 771665456, "item_id": 48229091, "url": "https://news.ycombinator.com/item?id=48229091", "by": "mweidner", "date": "2026-05-21", "version": null, "stance": "neutral", "quote": "The Automerge CRDT library works like this already", "excerpt": "For values that don't have a natural merge function (or where you don't want to bother writing one), would it make sense to sync update logs instead? That is: - The synced value is a history of client updates, sorted in some eventually consistent order (e.g. by hybrid logical clocks). Merging takes the union of the update sets. - The user-visible value is the result of processing these updates in order, using arbitra", "context": "", "use_case": "CRDT library", "switched_from": "", "story": "Show HN: Freenet, a peer-to-peer platform for decentralized apps"}, {"id": 758366802, "item_id": 47397925, "url": "https://news.ycombinator.com/item?id=47397925", "by": "nchmy", "date": "2026-03-16", "version": null, "stance": "compare", "quote": "It would have been nice if the article compared yjs with automerge and others.", "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": 758330833, "item_id": 47395677, "url": "https://news.ycombinator.com/item?id=47395677", "by": "kaiwenwang", "date": "2026-03-15", "version": null, "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": 755945040, "item_id": 47246565, "url": "https://news.ycombinator.com/item?id=47246565", "by": "lifty", "date": "2026-03-04", "version": null, "stance": "neutral", "quote": "libraries like Automerge use the Merkle DAG", "excerpt": "As far as I understand, libraries like Automerge use the Merkle DAG to encode a document as an immutable bundle of state changes aka operation log + the causal ordering which enables conflict free merging between multiple peers. The final document is reconstructed by combining the state transitions. So the Merkle DAG is both the state and the causal relationship between mutations which allows the merge \"magic\". Proll", "context": "", "use_case": "", "switched_from": "", "story": "An Interactive Intro to CRDTs"}, {"id": 741229010, "item_id": 46326813, "url": "https://news.ycombinator.com/item?id=46326813", "by": "danbitengo", "date": "2025-12-19", "version": null, "stance": "recommend", "quote": "Automerge changed how I think about distributed systems", "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": 737480784, "item_id": 46092549, "url": "https://news.ycombinator.com/item?id=46092549", "by": "satvikpendem", "date": "2025-11-29", "version": null, "stance": "neutral", "quote": "", "excerpt": "Well yeah, who expected them not to be a full blown CRDT? Similarly, I like Loro (https://loro.dev) but the fundamental problem remains that they're document based without a good query engine, ie you have to literally target a specific nested entry in the CRDT to get the data you want.", "context": "", "use_case": "", "switched_from": "", "story": "The CRDT Dictionary: A Field Guide to Conflict-Free Replicated Data Types"}, {"id": 737459841, "item_id": 46091240, "url": "https://news.ycombinator.com/item?id=46091240", "by": "GermanJablo", "date": "2025-11-29", "version": null, "stance": "compare", "quote": "it doesn't compete in the same space as Automerge, which is doc-based", "excerpt": "Triplit is my favorite local-first database. However, it doesn't compete in the same space as Automerge, which is doc-based. If you want a user-friendly alternative, I'm launching my proposal this week: https://docnode.dev", "context": "", "use_case": "", "switched_from": "", "story": "The CRDT Dictionary: A Field Guide to Conflict-Free Replicated Data Types"}, {"id": 737457408, "item_id": 46091088, "url": "https://news.ycombinator.com/item?id=46091088", "by": "mentalgear", "date": "2025-11-29", "version": null, "stance": "compare", "quote": "Automerge is a great project, but it feels still way to academic in it's setup.", "excerpt": "Automerge is a great project, but it feels still way to academic in it's setup. If you need a superior DX and CRDT-based full-stack database, I'd recommend you to look at Triplit.dev and their docs. (while development has decreased somewhat, the product is in a fully-featured phase and should work well for anything from small to medium, probably also very large projects depending on your configuration). Give it a try", "context": "", "use_case": "", "switched_from": "", "story": "The CRDT Dictionary: A Field Guide to Conflict-Free Replicated Data Types"}, {"id": 737449152, "item_id": 46090572, "url": "https://news.ycombinator.com/item?id=46090572", "by": "michelpp", "date": "2025-11-29", "version": null, "stance": "recommend", "quote": "Automerge is an excellent library, with a great API", "excerpt": "Automerge is an excellent library, with a great API, not just in Rust, but also Javascript and C. > All you need for the backend is key-value storage with range/prefix queries; This is true, I was able to quickly put together a Redis automerge library that supports the full API, including pub/sub of changes to subscribers for a full persistent sync server [0]. I was surprised how quickly it came together. Using some ", "context": "", "use_case": "", "switched_from": "", "story": "The CRDT Dictionary: A Field Guide to Conflict-Free Replicated Data Types"}, {"id": 737434592, "item_id": 46089662, "url": "https://news.ycombinator.com/item?id=46089662", "by": "btown", "date": "2025-11-29", "version": null, "stance": "recommend", "quote": "They are themselves full CRDTs, with strong proofs about their characteristics under stress.", "excerpt": "One of the most interesting things to me about CRDTs, and something that a skim of the article (with its focus on low-level CRDTs) might give the wrong impression on... is that things like https://automerge.org/ are not just \"libraries\" that \"throw together\" low-level CRDTs. They are themselves full CRDTs, with strong proofs about their characteristics under stress. Per the Automerge website: > We are driven to build", "context": "", "use_case": "", "switched_from": "", "story": "The CRDT Dictionary: A Field Guide to Conflict-Free Replicated Data Types"}, {"id": 737175008, "item_id": 46073438, "url": "https://news.ycombinator.com/item?id=46073438", "by": "jmoggr", "date": "2025-11-27", "version": null, "stance": "recommend", "quote": "I've been using Automerge for a while and haven't had to look at any CRDTs.", "excerpt": "> Automerge/Yjs require learning CRDTs I've been using Automerge for a while and haven't had to look at any CRDTs. To me this looks very similar to Automerge. Neat project!", "context": "", "use_case": "Sync / CRDT library", "switched_from": "", "story": "Show HN: SyncKit \u2013 Offline-first sync engine (Rust/WASM and TypeScript)"}, {"id": 737116929, "item_id": 46069808, "url": "https://news.ycombinator.com/item?id=46069808", "by": "danbitengo", "date": "2025-11-27", "version": null, "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)"}, {"id": 734719106, "item_id": 45919944, "url": "https://news.ycombinator.com/item?id=45919944", "by": "satvikpendem", "date": "2025-11-13", "version": null, "stance": "neutral", "quote": "I use some CRDTs like Loro and Automerge", "excerpt": "Looks great. I use some CRDTs like Loro and Automerge, are there any learnings or collaboration you're taking from them to improve DeltaDB? Also the name, I thought it was a database with CRDTs due to the \"DB\" at the end of DeltaDB, but it's a version control system, I thought that was somewhat misleading, any reason why it's named so?", "context": "", "use_case": "", "switched_from": "", "story": "Zed is our office"}]}