Other posts from this series: * An introduction to state-based CRDTs * Optimizing state-based CRDTs (part 1) [https://www.bartoszsypytkowski.com/optimizing-state-based-crdts-1/] * Optimizing state-based CRDTs (part 2) [https://www.bartoszsypytkowski.com/optimizing-state-based-crdts-part-2/] * State-based CRDTs: BoundedCounter [https://www.bartoszsypytkowski.com/state-based-crdts-bounded-counter/] * State-based CRDTs: Map [https://www.bartoszsypytkowski.com/crdt-map/] * Operation-| Bartosz Sypytkowski
Originally, I didn't want to make a separate blog post about design behind bounded counters, but since beside original paper [https://pages.lip6.fr/syncfree/attachments/article/59/boundedCounter-white-paper.pdf] and a very few implementation living in the wild, this CRDT is widely unknown, I've decided to give it a| Bartosz Sypytkowski
In this blog post we'll continue on topic of operation-based CRDTs and focus on the optimizations and approach known as pure operation-based CRDTs [https://hal.inria.fr/hal-01287738/document]: how can we use them to address some of the problems related to partially ordered event logs and optimize size of| Bartosz Sypytkowski
Last time [https://www.bartoszsypytkowski.com/operation-based-crdts-protocol/] we started our operation-based CRDTs sub-series, as we moved away from state-based CRDTs. We talked mostly about core requirements and sample implementation of RCB (Reliable Causal Broadcast) protocol, which was necessary to provide guarantees required by Commutative Replicated Data Types. Today we'll continue| Bartosz Sypytkowski
Today we're going to cover how to build a complex, JSON-like document CRDT. In the past, we focused on homogeneous data types like registers, sets, arrays or maps. This time we're going to combine them all and tackle some of the challenges that this approach presents. Other blog posts from| Bartosz Sypytkowski
In this blog post, we'll cover the idea of CRDT maps, and how we could create them and utilize them in common scenarios. A prerequisite for this talk is some general knowledge of CRDTs, especially observed-remove sets [https://www.bartoszsypytkowski.com/optimizing-state-based-crdts-part-2/#deltaawareaddwinsobservedremoveset] , which were already covered on this blog| Bartosz Sypytkowski
This time we're going to cover a new implementation of persistent key value store, using Conflict-free Replicated Data Types (CRDTs) to enable multi-process writes. Moreover, this approach enables shift of replication protocol from custom made gossip servers into passive replicated storage such as iCloud or Google Drive. Why?| Bartosz Sypytkowski
In this blog post we'll design a collaborative 2D table structure using yrs - Rust port of popular yjs conflict-free replicated data types library for creating real-time, local-first apps. We'll also cover some optimizations to improve scalability of our solution. Over the years I've| Bartosz Sypytkowski
Today we're going to jump into LSeq - one of the famous text-editing conflict-free replicated data types we briefly introduced in the past blog posts. This time we're aiming for fixing one of the popular issues that this algorithm struggles with. We're going step| Bartosz Sypytkowski
In this blog post we're going to cover a concepts and implementation behind collaborative 2-dimensional tables, with set of operation that could make them useful to work as spread sheets - popular in products like MS Excel or Google Sheets. There are many open source and commercial alternatives| Bartosz Sypytkowski
This blog post is a short summary of ecosystem and capabilities of Yrs (read: wires): a fully-compatible Rust port of Yjs library used to build collaborative peer-to-peer applications thanks to the power of Conflict-free Replicated Data Types. They are being used and adopted in many different products such as Jupyter| Bartosz Sypytkowski
Today we're going to continue exploration of Conflict-free Replicated Data Types domain. This time we'll start designing protocols that focus on a security aspects as first class citizens. Managing security and permissions in peer-to-peer systems may be quite cumbersome as often there's no single| Bartosz Sypytkowski
In this blog post we'll define the basics for a move operation used by Conflict-free Replicated Data Types (CRDT), which allows us to reorder the items in the collection. We'll define the general approach and go through example implementation build on top of YATA sequences. What&| Bartosz Sypytkowski
In the past we already discussed how to build JSON-like Conflict-free Replicated Data Type. We used operation-based approach, with wide support for many operations and characteristics of a dynamically typed recursive documents. However with that power came complexity. Today we'll discuss much simpler approach, which some may find| Bartosz Sypytkowski
In this blog post we'll continue exploring the ideas behind optimizing state-based CRDTs. This is a third post from the series. If you haven't read them before this article and don't feel familiar with CRDTs, I advise you to do so - we'll often refer to them: * An introduction to| Bartosz Sypytkowski
Other posts from this series: * An introduction to state-based CRDTs [https://www.bartoszsypytkowski.com/the-state-of-a-state-based-crdts/] * Optimizing state-based CRDTs (part 1) * Optimizing state-based CRDTs (part 2) [https://www.bartoszsypytkowski.com/optimizing-state-based-crdts-part-2/] * State-based CRDTs: BoundedCounter [https://www.bartoszsypytkowski.com/state-based-crdts-bounded-counter/] * State-based CRDTs: Map [https://www.bartoszsypytkowski.com/crdt-map/] * Operatio| Bartosz Sypytkowski
Last time [https://www.bartoszsypytkowski.com/operation-based-crdts-arrays-1/] we were discussing how to build a Commutative Replicated Data Types operating as indexed sequences - preserving order of inserted elements - using two different data structures: Linear Sequences (LSeq) and Replicated Growable Arrays (RGA). In this blog post we'll continue the topic| Bartosz Sypytkowski
In this post, we'll continue onto topic of Commutative Replicated Data Types. We already mentioned [https://www.bartoszsypytkowski.com/operation-based-crdts-registers-and-sets/#sets] how to prepare first, the most basic types of collections: sets. This time we'll go take a look at indexed sequences with add/remove operations. Other blog posts from| Bartosz Sypytkowski
Today we'll continue a series about CRDTs, this time however we'll stray from the path of state-based CRDTs and start talking about their operation-based relatives. The major difference that we need to cover, is the center of gravity of this approach: the replication protocol. Other blog posts from this series:| Bartosz Sypytkowski
Combine CRDTs into a full distributed data Swift app using SwiftUI and Combine.| A p p D e c e n t r a l
In our continuing series on Conflict-Free Replicated Data Types (CRDTs) in Swift, we have so far introduced a number of types, beginning with the very basic register type, and working up to multi-value containers like sets and dictionaries. Now we are ready to introduce the most advanced type in the whole series. It is a … Continue reading Maintaining Order in Replicating Types→| A p p D e c e n t r a l
In the previous installment of this ongoing series on Conflict-Free Replicated Data Types (CRDTs) in Swift, I introduced you to tombstones and Lamport counts, in constructing a replicating set. This time we’ll take a similar approach for a more common data type: the dictionary or map. The code for our ReplicatingDictionary will be quite similar … Continue reading Replicants All the Way Down→| A p p D e c e n t r a l
Other Posts in Series Last time we introduced our first replicating collection, an add-only set. Although useful in some specific circumstances, it isn’t a generally applicable set type, because it can only grow — you can’t remove entries from an add-only set. In this post, we are going to build a more advanced set which is capable … Continue reading Time for Tombstones→| A p p D e c e n t r a l
Other Posts in Series In the last post I introduced you to the first replicating type in this series: a register. A register is a simple type, one that you may even have used yourself at some point, which keeps the most recent value that has been set, together with the timestamp of the update, … Continue reading A First Replicating Collection→| A p p D e c e n t r a l
Source code for this series is in this GitHub repo. It will be extended with each post. Other Posts in Series When I first started reading about Conflict-Free Replicated Data Types (CRDTs), I expected a fertile new field of Computer Science dedicated to a whole new approach to managing data. I was soon somewhat disappointed, … Continue reading A First Replicating Type→| A p p D e c e n t r a l
Other Posts in Series If you read any of my earlier posts here, you were probably left wondering what the name of the blog was all about. When I came up with the idea, I was planning to blog about decentralized approaches to handling app data, ie, how to sync with other devices, servers, extensions, … Continue reading Conflict-Free Replicated Data Types (CRDTs) in Swift→| A p p D e c e n t r a l
🔰If CRDTs are new to you, here are some introductory links. - An interactive intro to CRDTs [https://jakelazaroff.com/words/an-interactive-intro-to-crdts/] - An introduction to state-based CRDTs [https://www.bartoszsypytkowski.com/the-state-of-a-state-based-crdts/] - CRDTs for non-academics [https://www.youtube.com/watch?v=vBU70EjwGfw] - CRDT: The Hard Parts [https:| Interjected Future
🔰If CRDTs are new to you, here are some introductory links. - An interactive intro to CRDTs - An introduction to state-based CRDTs - CRDTs for non-academics - CRDT: The Hard Parts - Readings in CRDTs - crdt.tech What are the trade-offs between different kinds of CRDTs (Conflict-free Replicated| Interjected Future
After series of 11 blogs posts about Conflict-free Replicated Data Types, it's time to wrap up. This time let's discuss various optimizations that could be applied to CRDTs working at higher scale. Other blog posts from this series: * An introduction to state-based CRDTs [https://www.bartoszsypytkowski.com/the-state-of-a-state-based-crdts/] * Optimizing state-based| Bartosz Sypytkowski
In this blog post we're coming back to indexed sequence CRDTs - we already discussed some operation-based approaches in the past. This time we'll cover YATA (Yet Another Transformation Approach): a delta-state based variant, introduced [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=| Bartosz Sypytkowski