An interactive intro to CRDTs
CRDTs explained with widgets you can drag around, which is the only way this subject has ever made sense to me.
The core idea: design your data type so that merges are commutative, associative and idempotent. Then two replicas that saw the same edits in different orders end up identical, and you do not need a server to arbitrate.
You build up from a counter to a set to collaborative text, and each step shows why the naive version breaks first.
See also: