Message Delivery Flow

Interaction Type: ๐ŸŒ REMOTE (Via Relay)

End-to-end message delivery from card update to acknowledgment.

Participants

  • Alice - User sending card update
  • Alice's Device - Source device
  • Relay - WebSocket relay server
  • Bob's Device - Recipient device
  • Bob - Contact receiving update

Message Sizes & Frequency

Message TypePayloadPadded SizeFrequency
Card delta50-200 B256 B1-5/month
Full card500 B-2 KB1-4 KBInitial only
Ack32-64 B256 BPer message
Device sync100-500 B256 B-1 KBReal-time

Complete Delivery Flow

 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”       
 โ”‚ Alice โ”‚                          โ”‚ Alice's Device ๐Ÿ“ฑ โ”‚                             โ”‚ Relay ๐Ÿ–ฅ๏ธ โ”‚                                โ”‚ Bob's Device ๐Ÿ“ฑ โ”‚                   โ”‚ Bob โ”‚       
 โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜                          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                             โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜                                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                   โ””โ”€โ”€โ”ฌโ”€โ”€โ”˜       
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚  Edit phone: "555-1111" โ†’ "555-2222"   โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”œโ”€โ”€โ”€โ”                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚   โ”‚ Update local card                       โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ—€โ”€โ”€โ”€โ”˜                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”œโ”€โ”€โ”€โ”                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚   โ”‚ Create CardDelta                        โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ—€โ”€โ”€โ”€โ”˜                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ”‚ Delta: ~100 bytes                    โ”‚    โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ”‚ {"field":"phone","value":"555-2222"} โ”‚    โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”œโ”€โ”€โ”€โ”                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚   โ”‚ Check visibility: Bob can see phone? โœ“  โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ—€โ”€โ”€โ”€โ”˜                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”œโ”€โ”€โ”€โ”                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚   โ”‚ Ratchet send chain forward              โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ—€โ”€โ”€โ”€โ”˜                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                     โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ”‚ Chain gen 42 โ†’ 43   โ”‚                     โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ”‚ Message key derived โ”‚                     โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                     โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”œโ”€โ”€โ”€โ”                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚   โ”‚ Encrypt delta (XChaCha20-Poly1305)      โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ—€โ”€โ”€โ”€โ”˜                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”œโ”€โ”€โ”€โ”                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚   โ”‚ Pad to 256 bytes (bucket)               โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ—€โ”€โ”€โ”€โ”˜                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”œโ”€โ”€โ”€โ”                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚   โ”‚ Generate CEK, sign payload              โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ—€โ”€โ”€โ”€โ”˜                                         โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                       โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ”‚ Final: ~256 bytes โ”‚                       โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ”‚ (v0x02 format)    โ”‚                       โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                       โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚  EncryptedUpdate(recipient=Bob, blob=...)   โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚      โ”‚ WebSocket frame:              โ”‚      โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚      โ”‚ 4-byte length + JSON envelope โ”‚      โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”œโ”€โ”€โ”€โ”                                           โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚   โ”‚ Validate recipient_id format              โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ—€โ”€โ”€โ”€โ”˜                                           โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”œโ”€โ”€โ”€โ”                                           โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚   โ”‚ Check quota (blobs < 1000, storage < 50MB)โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ—€โ”€โ”€โ”€โ”˜                                           โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”œโ”€โ”€โ”€โ”                                           โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚   โ”‚ Store blob indexed by recipient_id        โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ—€โ”€โ”€โ”€โ”˜                                           โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚        Acknowledgment(status=Stored)        โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ—€โ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚ โ”‚ Blob stored with 120-day TTL โ”‚              โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚                               โ”‚          
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
     โ”‚                                    โ”Œalt [Bob is Online (Connected to Relay)]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚            Forward EncryptedUpdate            โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚โ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ–ถ                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”œโ”€โ”€โ”€โ”                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚   โ”‚ Receive encrypted blob    โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ—€โ”€โ”€โ”€โ”˜                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”œโ”€โ”€โ”€โ”                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚   โ”‚ Resolve anonymous sender ID   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ—€โ”€โ”€โ”€โ”˜                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚ โ”‚ Try each contact's โ”‚        โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚ โ”‚ shared key against โ”‚        โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚ โ”‚ anonymous_id       โ”‚        โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”œโ”€โ”€โ”€โ”                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚   โ”‚ Found: Alice              โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ—€โ”€โ”€โ”€โ”˜                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”œโ”€โ”€โ”€โ”                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚   โ”‚ Derive message key (chain gen โ”‚3)    
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ—€โ”€โ”€โ”€โ”˜                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”œโ”€โ”€โ”€โ”                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚   โ”‚ Decrypt payload           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ—€โ”€โ”€โ”€โ”˜                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”œโ”€โ”€โ”€โ”                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚   โ”‚ Remove padding            โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ—€โ”€โ”€โ”€โ”˜                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”œโ”€โ”€โ”€โ”                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚   โ”‚ Verify Ed25519 signature  โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ—€โ”€โ”€โ”€โ”˜                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”œโ”€โ”€โ”€โ”                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚   โ”‚ Update Alice's card locally   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ—€โ”€โ”€โ”€โ”˜                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚  Alice updated contact info   โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚  Acknowledgment(status=ReceivedByRecipient)   โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚           Forward Acknowledgment            โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ—€โ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚         โ”‚ Sender notified if      โ”‚         โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚         โ”‚ suppress_presence=false โ”‚         โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”œโ”€โ”€โ”€โ”                                         โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚   โ”‚ Mark update as delivered                โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ—€โ”€โ”€โ”€โ”˜                                         โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚           โ”‚ Blob queued for later โ”‚           โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”Œopt [Bob comes online later]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”œ[Bob is Offline]โ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚              Connect (Handshake)              โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚             Deliver queued blobs              โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚โ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ–ถ   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”œโ”€โ”€โ”€โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”‚   โ”‚ Process all pending updates   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ—€โ”€โ”€โ”€โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”œโ”€โ”€โ”€โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”‚   โ”‚ Updates applied in order  โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ—€โ”€โ”€โ”€โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                   โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                        โ”‚ Bob now sees Alice's new phone โ”‚                                   โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                   โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ”‚   โ”‚                                               โ”‚   โ”‚                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                           โ”‚   โ”‚      
     โ”‚                                    โ”‚   โ”‚                                             โ”‚                                               โ”‚                               โ”‚   โ”‚      
     โ”‚                                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      
     โ”‚                                        โ”‚                                             โ”‚                                               โ”‚                               โ”‚          
 โ”Œโ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                             โ”Œโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”                                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                   โ”Œโ”€โ”€โ”ดโ”€โ”€โ”       
 โ”‚ Alice โ”‚                          โ”‚ Alice's Device ๐Ÿ“ฑ โ”‚                             โ”‚ Relay ๐Ÿ–ฅ๏ธ โ”‚                                โ”‚ Bob's Device ๐Ÿ“ฑ โ”‚                   โ”‚ Bob โ”‚       
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                   โ””โ”€โ”€โ”€โ”€โ”€โ”˜       

Double Ratchet Message Flow

 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                  
 โ”‚ Alice's Ratchet โ”‚                           โ”‚ Bob's Ratchet โ”‚                                  
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                  
          โ”‚                                            โ”‚                                          
      โ”Œrect [rgb(240, 248, 255)]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”œโ”€โ”€โ”€โ”                                        โ”‚   โ”‚                                      
      โ”‚   โ”‚   โ”‚ Ratchet send chain: gen 0 โ†’ 1          โ”‚   โ”‚                                      
      โ”‚   โ—€โ”€โ”€โ”€โ”˜                                        โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”œโ”€โ”€โ”€โ”                                        โ”‚   โ”‚                                      
      โ”‚   โ”‚   โ”‚ Derive message key (gen 0)             โ”‚   โ”‚                                      
      โ”‚   โ—€โ”€โ”€โ”€โ”˜                                        โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”œโ”€โ”€โ”€โ”                                        โ”‚   โ”‚                                      
      โ”‚   โ”‚   โ”‚ Encrypt with message key               โ”‚   โ”‚                                      
      โ”‚   โ—€โ”€โ”€โ”€โ”˜                                        โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”œโ”€โ”€โ”€โ”                                        โ”‚   โ”‚                                      
      โ”‚   โ”‚   โ”‚ Delete message key                     โ”‚   โ”‚                                      
      โ”‚   โ—€โ”€โ”€โ”€โ”˜                                        โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”‚    [DH_pub, gen=0, idx=0] + ciphertext     โ”‚   โ”‚                                      
      โ”‚   โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ   โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”‚                                 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                               
      โ”‚   โ”‚                                 โ”‚ RECEIVE (Message 1) โ”‚                               
      โ”‚   โ”‚                                 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                               
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                      
          โ”‚                                            โ”‚                                          
          โ”‚                                        โ”Œrect [rโ”                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚                                      
          โ”‚                                        โ”‚   โ”œโ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚ Verify DH generation matches         
          โ”‚                                        โ”‚   โ—€โ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚                                      
          โ”‚                                        โ”‚   โ”œโ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚ Ratchet receive chain: gen 0 โ†’ 1     
          โ”‚                                        โ”‚   โ—€โ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚                                      
          โ”‚                                        โ”‚   โ”œโ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚ Derive message key (gen 0)           
          โ”‚                                        โ”‚   โ—€โ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚                                      
          โ”‚                                        โ”‚   โ”œโ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚ Decrypt                              
          โ”‚                                        โ”‚   โ—€โ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚                                      
          โ”‚                                        โ”‚   โ”œโ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚ Delete message key                   
          โ”‚                                        โ”‚   โ—€โ”€โ”€โ”€โ”‚                                      
          โ”‚                                        โ”‚   โ”‚   โ”‚                                      
          โ”‚                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                         
          โ”‚                          โ”‚ SEND REPLY (triggers DH ratchet) โ”‚                         
          โ”‚                          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                         
          โ”‚                                        โ”‚   โ”‚   โ”‚                                      
          โ”‚                                        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                      
          โ”‚                                            โ”‚                                          
      โ”Œrect [rgb(255, 248, 240)]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”œโ”€โ”€โ”€โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚ Generate new ephemeral DH keypair    
      โ”‚   โ”‚                                            โ—€โ”€โ”€โ”€โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”œโ”€โ”€โ”€โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚ DH ratchet: compute new root key     
      โ”‚   โ”‚                                            โ—€โ”€โ”€โ”€โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”œโ”€โ”€โ”€โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚ Create new send chain                
      โ”‚   โ”‚                                            โ—€โ”€โ”€โ”€โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”œโ”€โ”€โ”€โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚ Encrypt with new chain's key         
      โ”‚   โ”‚                                            โ—€โ”€โ”€โ”€โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ”‚   โ”‚  [NEW_DH_pub, gen=1, idx=0] + ciphertext   โ”‚   โ”‚                                      
      โ”‚   โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                      โ”‚   โ”‚                                      
โ”‚ RECEIVE (triggers DH ratchet) โ”‚                      โ”‚   โ”‚                                      
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                      โ”‚   โ”‚                                      
      โ”‚   โ”‚                                            โ”‚   โ”‚                                      
      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                      
          โ”‚                                            โ”‚                                          
      โ”Œrect [rโ”                                        โ”‚                                          
      โ”‚   โ”‚   โ”‚                                        โ”‚                                          
      โ”‚   โ”œโ”€โ”€โ”€โ”‚                                        โ”‚                                          
      โ”‚   โ”‚   โ”‚ Detect new DH public key               โ”‚                                          
      โ”‚   โ—€โ”€โ”€โ”€โ”‚                                        โ”‚                                          
      โ”‚   โ”‚   โ”‚                                        โ”‚                                          
      โ”‚   โ”œโ”€โ”€โ”€โ”‚                                        โ”‚                                          
      โ”‚   โ”‚   โ”‚ DH ratchet: compute matching root key  โ”‚                                          
      โ”‚   โ—€โ”€โ”€โ”€โ”‚                                        โ”‚                                          
      โ”‚   โ”‚   โ”‚                                        โ”‚                                          
      โ”‚   โ”œโ”€โ”€โ”€โ”‚                                        โ”‚                                          
      โ”‚   โ”‚   โ”‚ Create new receive chain               โ”‚                                          
      โ”‚   โ—€โ”€โ”€โ”€โ”‚                                        โ”‚                                          
      โ”‚   โ”‚   โ”‚                                        โ”‚                                          
      โ”‚   โ”œโ”€โ”€โ”€โ”‚                                        โ”‚                                          
      โ”‚   โ”‚   โ”‚ Decrypt with new chain's key           โ”‚                                          
      โ”‚   โ—€โ”€โ”€โ”€โ”‚                                        โ”‚                                          
      โ”‚   โ”‚   โ”‚                                        โ”‚                                          
      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                        โ”‚                                          
          โ”‚                                            โ”‚                                          
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                  
 โ”‚ Alice's Ratchet โ”‚                           โ”‚ Bob's Ratchet โ”‚                                  
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                  

Out-of-Order Message Handling

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                    
โ”‚ Alice's Device โ”‚                 โ”‚ Relay โ”‚                โ”‚ Bob's Device โ”‚                                    
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                    
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚  Message 1 (gen=0, idx=0)   โ”‚                            โ”‚                                           
         โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ                            โ”‚                                           
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚  Message 2 (gen=0, idx=1)   โ”‚                            โ”‚                                           
         โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ                            โ”‚                                           
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚  Message 3 (gen=0, idx=2)   โ”‚                            โ”‚                                           
         โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ                            โ”‚                                           
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                    โ”‚                                           
         โ”‚                    โ”‚ Network delays โ”‚                    โ”‚                                           
         โ”‚                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                    โ”‚                                           
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚  Message 3 arrives first   โ”‚                                           
         โ”‚                             โ”‚โ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ–ถ                                           
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Expected idx=0, got idx=2             
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Skip chain to idx=2                   
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Store skipped keys: [idx=0, idx=1]    
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Decrypt message 3                     
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚     Message 1 arrives      โ”‚                                           
         โ”‚                             โ”‚โ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ–ถ                                           
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Lookup skipped key for idx=0          
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Found! Decrypt message 1              
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Delete skipped key                    
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚     Message 2 arrives      โ”‚                                           
         โ”‚                             โ”‚โ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ–ถ                                           
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Lookup skipped key for idx=1          
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Found! Decrypt message 2              
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚                            โ”œโ”€โ”€โ”€โ”                                       
         โ”‚                             โ”‚                            โ”‚   โ”‚ Delete skipped key                    
         โ”‚                             โ”‚                            โ—€โ”€โ”€โ”€โ”˜                                       
         โ”‚                             โ”‚                            โ”‚                                           
         โ”‚                             โ”‚               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                              
         โ”‚                             โ”‚               โ”‚ All messages processed, โ”‚                              
         โ”‚                             โ”‚               โ”‚ skipped keys cleaned up โ”‚                              
         โ”‚                             โ”‚               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                              
         โ”‚                             โ”‚                            โ”‚                                           
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 โ”Œโ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”                                    
โ”‚ Alice's Device โ”‚                 โ”‚ Relay โ”‚                โ”‚ Bob's Device โ”‚                                    
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                    

Relay Acknowledgment States

โ—โ”€โ”€โ”€โ—                 โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                        โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                                    โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ     โ•”โ•โ•โ•โ•—
โ”‚   โ”‚                 โ”‚      โ”‚                        โ”‚        โ”‚                                    โ”‚               โ”‚                โ”‚                     โ”‚     โ•‘   โ•‘
โ”‚   โ”‚โ”€Messageโ”€createdโ–บโ”‚ Sent โ”œRelayโ”€confirmsโ”€storageโ”€โ–บโ”‚ Stored โ”‚       โ”œโ”€โ”€โ”€โ”€Recipientโ”€connectedโ”€โ”€โ”€โ”€โ–บโ”‚   Delivered   โ”œRecipientโ”€acksโ”€โ–บโ”‚ ReceivedByRecipient โ”œโ”€โ”€โ”€โ”€โ–บโ•‘   โ•‘
โ”‚   โ”‚                 โ”‚      โ”‚                        โ”‚        โ”‚                                    โ”‚               โ”‚                โ”‚                     โ”‚     โ•‘   โ•‘
โ—โ”€โ”€โ”€โ—                 โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                        โ•ฐโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ•ฏ                                    โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ     โ•šโ•โ•โ•โ•
                                                           โ”‚                                                โ”‚                                                         
                                                           โ”‚                                          Decrypt error                                                   
                                                           โ”‚                                                โ”‚                                                         
                                                           โ”‚                                                โ”‚                                                         
                                                           โ”‚                                                โ–ผ                                                         
                                                           โ”‚                                        โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—          
                                                           โ”‚                                        โ”‚               โ”‚                โ•‘                     โ•‘          
                                                           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€Quotaโ”€exceededโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ”‚     Failed    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ•‘                     โ•‘          
                                                                                                    โ”‚               โ”‚                โ•‘                     โ•‘          
                                                                                                    โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•          

Wire Protocol

Envelope Format

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    MESSAGE ENVELOPE                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  4 bytes: Length (big-endian)                               โ”‚
โ”‚  JSON payload:                                               โ”‚
โ”‚  {                                                           โ”‚
โ”‚    "version": 1,                                            โ”‚
โ”‚    "message_id": "uuid",                                    โ”‚
โ”‚    "timestamp": unix_secs,                                  โ”‚
โ”‚    "payload": { ... }                                       โ”‚
โ”‚  }                                                           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

EncryptedUpdate Payload

{
  "type": "EncryptedUpdate",
  "sender_id": "anonymous_id (hourly rotation)",
  "recipient_id": "mailbox token (daily rotation)",
  "ratchet_header": {
    "dh_public": "[32 bytes] sender DH public key",
    "dh_generation": 5,
    "message_index": 10,
    "previous_chain_length": 3
  },
  "ciphertext": "base64(encrypted_delta)"
}

Acknowledgment Payload

{
  "type": "Acknowledgment",
  "message_id": "original message uuid",
  "status": "Stored|Delivered|Received|Failed",
  "error": null
}

Timing Estimates

PhaseDurationNotes
Encryption + padding1-5 msXChaCha20 is fast
Network latency50-200 msRelay location
Relay storage1-10 msSQLite insert
Forward to recipient50-200 msIf online
Decryption + verify1-5 ms
Total (online)100-400 msEnd-to-end
Total (offline)< 120 daysUntil connect