3 ms·
I’m quite familiar with both, having spent some time building a crdt library of my own. The authors of both projects are lovely humans. There are quite a lot of
by josephg 2y ago
I’m quite familiar with both, having spent some time building a crdt library of my own. The authors of both projects are lovely humans. There are quite a lot of small differences that might matter to some people:
- Yjs is mostly made by a single author (Kevin Jahns). It does not store the full document history, but it does support arbitrarily many checkpoints which you can rewind a document to. Yjs is written in JavaScript. There’s a rust rewrite (Yrs) but it’s significantly slower than the JavaScript version for some reason. (5-10x slower last I checked).
- Automerge was started by Martin Kleppmann, Cambridge professor and author of Designing Data Intensive Applications. They have some funding now and as I understand it there are people working on it full time. To me it feels a bit more researchy - for example the team has been working on Byzantine fault tolerance features, rich text and other interesting but novel stuff. These days it’s written in rust, with wasm builds for the web. Automerge stores the entire history of a document, so unlike Yjs, deleted items are stored forever - with the costs and benefits that brings. Automerge is also significantly slower and less memory efficient than Yjs for large text documents. (It takes ~10 seconds & 200mb of ram to load a 100 page document in my tests.) I’m assured the team is working on optimisations; which is good because I would very much like to see more attention in that area.
They’re both good projects, but honestly both could use a lot of love. I’d love to have a “SQLite of local first software”. I think we’re close, but not quite there yet.
(There are some much faster test based CRDTs around if that’s your jam. Aside from my own work, Cola is also a very impressive and clean - and orders of magnitude faster than Yjs and automerge.)
- conaclos 2y ago> I’d love to have a “SQLite of local first software” We have recently published a new research paper on replicating SQLite [1] in a local-first manner. We think it goes a step closer to that goal. [1] https://inria.hal.science/hal-04580135/document https://inria.hal.science/hal-04580135/document
- steida 2y agoIt looks very similar to Evolu (https://github.com/evoluhq/evolu https://github.com/evoluhq/evolu)
- westurner 2y agocr-sqlite https://github.com/vlcn-io/cr-sqlite https://github.com/vlcn-io/cr-sqlite : > Convergent, Replicated SQLite. Multi-writer and CRDT support for SQLite From "SQLedge: Replicate Postgres to SQLite on the Edge" (2023) https://news.ycombinator.com/item?id=37063238#37067980 https://news.ycombinator.com/item?id=37063238#37067980 : >> In technical terms: cr-sqlite adds multi-master replication and partition tolerance to SQLite via conflict free replicated data types (CRDTs) and/or causally ordered event logs
- khimaros 2y agothis also looks promising: https://braid.org/ https://braid.org/ working with the IETF to standardize.
- josephg 2y agoI helped coauthor some of the early drafts of Braid. Braid isn’t an attempt to make a local first, crdt based eventually consistent data store. It’s just a protocol. Braid aims to make it easy for such systems, as they’re built, to be able to talk to each other.
- ndr 2y agoHow do you deal with persistence with the various solutions? What do you actually have to serialize to a db?
- firtoz 2y agoI use yjs myself and you can choose to serialise anything you like, most solutions allow saving snapshots of the document state. You can also store any incoming changes too for more fine grained undos and redos etc. AFAIK the state in typical solutions is a binary representation.
- cyanydeez 2y agoYjs produces binary blobs for everything.
- zogrodea 2y agoI remember you describing Ropey's author as a "lovely human" too, and want to say that "it takes one to know one/real recognises real". :)
- tevon 2y agoSooo we’re building “SQLite for local-first development”, it’s here! Uses CRDTs, can be a partially replicated db, peer to peer networking and discovery. Bruinen.co Shoot me a note if you want an early build! Or if interested in building with us :) tevon [at] bruinen.co
- tazjin 2y agoUsing a closed-source DB is a hard sell.
- __MatrixMan__ 2y agoAgreed, especially for a local first app. Making the app work without an internet connection is step one. Making it reparable without an internet connection is step two. Step two is blocked if you can't keep the code for all of the app's dependencies near enough at hand such that its still accessible after the network partitions.
- Horusiath 2y ago> (5-10x slower last I checked) This was a thing around 2 years ago. Nowadays speeds is the same or in favor of Rust, depending on the benchmark in question.
- josephg 2y agoIt was still much slower ~6 months ago when I benchmarked it. I’ll rerun my benchmarks and confirm one way or another.
- josephg 2y agoOh amazing - it looks like the GP commenter is right. Yrs is significantly faster now than it was when I benchmarked it a few months ago. I'd update my comment above, but its too late. For example, in one of my tests I'm seeing these times: Yjs: 74ms Yrs: 9.5ms That's exceptionally fast. This speedup seems to be consistent throughout my testing data. For comparison, automerge takes 1100ms to load the same editing history from disk, using its own file format. I'd really love to see automerge be competitive here. (The test is loading / merging a saved text editing trace from a yjs file, recorded from a single user typing about 100 pages of text).
- antidnan 2y agoI'm curious to hear your thoughts on loro