Add Convos Vault plan: multi-device key sync via hidden conversation#555
Add Convos Vault plan: multi-device key sync via hidden conversation#555
Conversation
…ault identification
…t merging and multi-device edge case
…ecy is sufficient
…ion to future phase
…onal profile, device name, and confirmation code
…ing Vault messages
History sync replicates between live installations, not from an archive. Single-device users who lose their only device cannot recover Vault message history even with the Vault key.
How to use the Graphite Merge QueueAdd the label merge-queue to this PR to add it to the merge queue. You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
|
Claude finished @yewreeka's task —— View job PR Review: Convos Vault PlanI've reviewed the Convos Vault plan document. This is a well-structured design that thoughtfully addresses multi-device key sync for Convos' unique per-conversation identity architecture. Below is my detailed feedback. ✅ Strengths1. Architecture & XMTP Integration
2. Security Model
3. Recovery & Platform Support
4. Future Extensions
🔍 Issues & Concerns1. Protobuf Schema Conflict (Critical)The plan shows optional string conversationType = 6; // "vault" for Convos VaultHowever, the actual protobuf file ( message ConversationCustomMetadata {
string tag = 1;
repeated ConversationProfile profiles = 2;
optional sfixed64 expiresAtUnix = 3;
optional bytes imageEncryptionKey = 4;
optional EncryptedImageRef encryptedGroupImage = 5;
}Field 6 is available and the plan is correct, but this needs to be implemented as part of the Vault work. The plan should explicitly call this out as a prerequisite change to the protobuf schema. Recommendation: Add a "Phase 1 Prerequisites" section listing:
2. JoinRequest Content Type Design (Moderate)The Concerns:
Alternative: Consider a message JoinRequest {
string inviteSlug = 1;
optional Profile profile = 2;
oneof context {
VaultPairingContext vault = 3;
// Future contexts here
}
}
message VaultPairingContext {
string deviceName = 1;
string confirmationCode = 2; // 6 digits
}Pros: Type-safe, self-documenting, compile-time validation If sticking with metadata map, at least define constants: enum JoinRequestMetadataKey {
static let deviceName = "deviceName"
static let confirmationCode = "confirmationCode"
}3. Recovery Limitations Not Prominent Enough (Moderate)The recovery section (lines 173-193) correctly explains that single-device users who lose their only device cannot recover, even with the Vault key. This is a critical limitation that could lead to catastrophic data loss. Issue: This limitation is buried in the "Recovery" section. Users may:
Recommendations:
4. Vault Merging UX Complexity (Moderate)The Vault merging flow (lines 89-106) requires Device B to:
Edge case: User has:
They must:
This is tedious for users with multiple devices. Alternative approach: Support "full Vault migration":
Pros: Better UX for multi-device users At minimum, document this UX complexity in the plan as a known limitation. 5. Installation ID Tracking Not Fully Specified (Minor)The plan mentions tracking installation IDs (lines 224-225):
Missing details:
Recommendation: Add a "Content Type Schemas" section with full protobuf definitions: message DeviceKeyBundle {
repeated ConversationKey keys = 1;
}
message DeviceKeyShare {
ConversationKey key = 1;
}
message ConversationKey {
string conversationId = 1;
bytes privateKey = 2;
string installationId = 3; // XMTP installation ID
sfixed64 sharedAtUnix = 4;
}6. 10-Device Limit Enforcement (Minor)Line 226: "The Vault UI should enforce this limit and show an error when attempting to pair an 11th device." Questions:
XMTP Context Needed: Verify whether the 10-installation limit is:
This affects whether Vault membership is practically limited or not. 7. Explode/Expiry Exemption Incomplete (Minor)Open question #1 (line 230): "The Vault conversation should probably not have an expiry timer." Additional consideration: Vault should also be exempt from:
Recommendation: Add explicit exemptions for Vault in the plan:
🎯 Recommendations Summary
📋 Missing Sections (Optional Enhancements)
✨ Overall AssessmentThis is a strong, well-thought-out plan that elegantly solves multi-device key sync within Convos' unique architecture. The reuse of XMTP infrastructure and existing invite system shows good engineering judgment. Main gaps:
Recommendation: Address P0 items before implementation begins. P1/P2 items can be resolved during detailed design phase. |

Add Convos Vault plan: multi-device key sync via hidden conversation
Specify conversationType in ConversationCustomMetadata protobuf for Vault identification
Store Vault key in iCloud Keychain by default, update recovery flows
Add manual Vault key backup requirement for non-Apple platforms
Redesign pairing flow: Device A confirms code from Device B, add vault merging and multi-device edge case
Use standard invite system for Vault pairing with 6-digit code verification gate
Set Vault pairing invite expiry to 60 seconds for full flow
Resolve key rotation question: revokeInstallations + MLS forward secrecy is sufficient
Track installation IDs alongside shared keys, defer selective revocation to future phase
Include device name in pairing join request, use as Vault profile display name
Add JoinRequest custom content type as phase 1 prerequisite with optional profile, device name, and confirmation code
Move deviceName and confirmationCode to JoinRequest metadata map
Remove DeviceKeyRequest: XMTP history sync handles recovery by replaying Vault messages
Set 10 device max matching XMTP installation limit
Acknowledge device compromise limitation, defer to future phase
Correct recovery section: XMTP history sync requires active installation
History sync replicates between live installations, not from an
archive. Single-device users who lose their only device cannot recover
Vault message history even with the Vault key.
Note
Add design document for Convos Vault multi-device key sync via hidden XMPP conversation
Adds convos-vault.md, a design plan for syncing end-to-end encryption keys across devices using a hidden XMTP "vault" conversation.
JoinRequest,DeviceKeyBundle,DeviceKeyShare)conversationType: "vault"field inConversationCustomMetadataprotobufMacroscope summarized e7a7b29.