Every post is a signed entry in a Willow-protocol namespace — content-addressed and capability-scoped, built for exactly this kind of partial, offline-first sync.
Device-to-device sync is one small, transport-independent exchange: Hello → each side sends a Summary of what it has → each side Requests only what it's missing → Entries cross the wire → both sides send an updated Summary → Complete. Malformed, oversized, or out-of-sequence messages get a hard Reject, not a best-effort parse. The same frame bytes travel over local IP, QR, or a plain file — the sync layer doesn't know or care which.
That exchange still can't skip the same admission boundary the UI uses: inspect → preview → plan → commit. Nothing is live in your store until you've explicitly planned and committed it — sync just gets bytes to your device, it doesn't get to decide what you publish.
Your signing key never leaves your device in the clear. It's sealed behind your device's hardware-backed keystore — Keychain on iOS, Android Keystore on Android — and only unwrapped in memory for the moment it's needed.
Compare Riot with adjacent protocols →