Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
実践CRDT
Search
tamadeveloper
April 14, 2026
Programming
590
0
Share
実践CRDT
Core DataとCloudKitによるリッチテキスト同期モデルの構築
tamadeveloper
April 14, 2026
Other Decks in Programming
See All in Programming
AIベース静的検査器の偽陽性率を抑える工夫3選
orgachem
PRO
4
360
PicoRuby for IoT: Connecting to the Cloud with MQTT
yuuu
2
660
Offline should be the norm: building local-first apps with CRDTs & Kotlin Multiplatform
renaudmathieu
0
230
Don't Prompt Harder, Structure Better
kitasuke
0
780
t *testing.T は どこからやってくるの?
otakakot
1
710
Kingdom of the Machine
yui_knk
2
900
レガシーPHP転生 〜父がドメインエキスパートだったのでDDD+Claude Codeでチート開発します〜
panda_program
0
1.1k
感情を設計する
ichimichi
5
1.6k
PHP で mp3 プレイヤーを実装しよう
m3m0r7
PRO
0
290
AI時代のエンジニアリングの原則 / Engineering Principles in the AI Era
haru860
0
610
Cache-moi si tu peux : patterns et pièges du cache en production - Devoxx France 2026 - Conférence
slecache
0
290
GitHubCopilotCLIをはじめよう.pdf
htkym
0
270
Featured
See All Featured
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
780
Odyssey Design
rkendrick25
PRO
2
580
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
The SEO identity crisis: Don't let AI make you average
varn
0
450
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
WENDY [Excerpt]
tessaabrams
10
37k
How Software Deployment tools have changed in the past 20 years
geshan
0
33k
Practical Orchestrator
shlominoach
191
11k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
Ruling the World: When Life Gets Gamed
codingconduct
0
210
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.2k
Become a Pro
speakerdeck
PRO
31
5.9k
Transcript
Practical CRDT Building a Rich-Text Sync Model with Core Data
and CloudKit
Kazushi Oenoki FirstSeed Inc.
None
None
None
id content ... 12 Project Alpha Kicko ff ... ...
Note
Merging is hard
CRDT Con fl ict-free Replicated Data Types
None
None
None
CRDT 101 Don't store strings. Store identities, relationships &
states.
Hello H ❌ ✅ e l l o
Hello H ❌ ✅ e l l o ID: 1
2 3 4 5
Hello H ❌ ✅ e l l o ID: 1
2 3 4 5 prevID: nil 1 2 3 4
Hello H ❌ ✅ e l l o ID: 1
2 3 4 5 prevID: nil 1 2 3 4 timestamp: ... ... ... ... ...
ABC ABC
A1BC AB2C
A 1 B C A1BC AB2C
A B 2 C A1BC AB2C
A 1 B C A1B2C A1B2C 2
A 1 🪦 C A12C A12C 2
None
Core Data First party Highly scalable High Performance Concurrent writes
Crash-safe persistent
CloudKit First party Privacy No sign-in / sign-up No server
management Shareable Free
CRDTEntity id: Int64 prevEntityID: Int64 content: String timestamp: Date isErased:
Bool note: Note Note id: UUID ... entities: [CRDTEntity]
CRDTImage url: String width: CGFloat height: CGFloat CRDTEntity id: Int64
prevEntityID: Int64 content: String timestamp: Date isErased: Bool
CRDTChar style: Int32 CRDTEntity id: Int64 prevEntityID: Int64 content: String
timestamp: Date isErased: Bool
CRDTList indentLevel: Int32 CRDTEntity id: Int64 prevEntityID: Int64 CRDTCheckBox isChecked:
Bool CRDTOrderedList marker: String CRDTUnorderedList style: Int32
CRDTHeader style: Int32 CRDTCodeBlock CRDTEntity id: Int64 prevEntityID: Int64 content:
String timestamp: Date isErased: Bool CRDTBlockQuote
None
None
None
None
None
None
CRDTEntity id: Int64 prevEntityID: Int64 content: String timestamp: Date isErased:
Bool note: Note Note id: UUID ... entities: [CRDTEntity]
None
CRDTEntity id: Int64 prevEntityID: Int64 content: String timestamp: Date isErased:
Bool note: Note Note id: UUID ... entities: [CRDTEntity]
CRDTEntity id: Int64 prevEntityID: Int64 content: String timestamp: Date isErased:
Bool noteID: UUID segment: Int32 Note id: UUID ...
NoteData id: UUID assetData: Data segment: Int32 ... note: Note
Note id: UUID ... data: [NoteData]
None
None
CRDT Powerful concept Beyond text Adaptable model Deep theory
Thank you Enjoy your stay in Japan!