Skip to content

Commit 0191e84

Browse files
committed
update readme
1 parent 81a34f0 commit 0191e84

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
# articulated
22

3-
A TypeScript library for managing stable element identifiers in mutable lists, perfect for collaborative editing and other applications where elements need persistent identities despite insertions and deletions.
3+
A TypeScript library for managing stable element identifiers in mutable lists, intended for collaborative editing and other applications where elements need persistent identities despite insertions and deletions.
44

55
[Demos](https://github.com/mweidner037/articulated-demos)
66

77
## Features
88

9-
- **Stable identifiers**: Elements keep their identity even as their indices change
10-
- **Efficient storage**: Optimized compression for sequential IDs
11-
- **Collaborative-ready**: Supports concurrent operations from multiple sources
12-
- **Tombstone support**: Deleted elements remain addressable
13-
- **TypeScript-first**: Full type safety and excellent IDE integration
9+
- **Stable identifiers**: Elements keep their identity even as their indices change.
10+
- **Efficient storage**: Optimized compression for sequential IDs.
11+
- **Collaboration-ready**: Designed to handle operations from multiple sources.
12+
- **Tombstone support**: Deleted elements remain addressable.
1413

1514
## Installation
1615

@@ -132,6 +131,8 @@ let newList = IdList.load(savedState);
132131
- Any list where elements' positions change but need stable identifiers
133132
- Conflict-free replicated data type (CRDT) implementations
134133

134+
**Note**: IdList is not itself a CRDT. Concurrent insertAfter operations with the same `before` ID will _not_ commute with each other. However, you can implement a list/text CRDT on top of IdList, by processing collaborative insertAfter and delete operations in an [eventually consistent total order](https://mattweidner.com/2025/05/21/text-without-crdts.html#decentralized-variants).
135+
135136
## Internals
136137

137138
IdList stores its state as a modified [B+Tree](https://en.wikipedia.org/wiki/B%2B_tree), described at the top of [its source code](./src/id_list.ts). Each leaf in the B+Tree represents multiple ElementIds (sharing a bunchId and sequential counters) in a compressed way; for normal collaborative text editing, expect 10-20 ElementIds per leaf.

0 commit comments

Comments
 (0)