feat: macOS QR code pairing + iOS scanner + TLS certificate pinning#6656
Merged
Conversation
Contributor
Author
👀 Where to focus your review
Risk level: Medium — introduces TLS certificate pinning and credential management patterns that set precedent for future pairing flows. |
b634cee to
ebd595c
Compare
Co-Authored-By: Claude <noreply@anthropic.com>
…t, messaging - Guard null ifa_addr in NetworkInterfaceResolver (crash on awdl0/tunnel interfaces) - Validate QR port range 1-65535 before UInt16 conversion (prevents crash on malformed QR) - Inject ClientProvider environmentObject into OnboardingView (crash when opening QR sheet) - Improve regenerate token messaging to mention daemon restart requirement Co-Authored-By: Claude <noreply@anthropic.com>
…s control - Replace deprecated NavigationView with NavigationStack (project convention) - Check AVCaptureDevice.authorizationStatus before configuring session - Handle .notDetermined by requesting access first (proper iOS permission flow) - Make stopScanning() private (not used externally) Co-Authored-By: Claude <noreply@anthropic.com>
- Make QRCodeGenerator and NetworkInterfaceResolver public (visible across SPM modules) - Inline fingerprint key construction in DaemonConnection (UserDefaultsKeys is iOS-app-only) - Regenerate xcodeproj to include new QRScannerView and QRPairingSheet files Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
New IPC type from main that the macOS client intentionally does not decode. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…val type errors - Add guardian_verification (client) and guardian_verification_response (server) entries to the IPC snapshot test - Fix channel-approval-routes and channel-approvals tests to use raw bun:sqlite Database client instead of drizzle's run/prepare methods which changed their type signatures - Correct SQL column names (created_at/updated_at, conversation_id) to match actual schema Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
d6414a8 to
5f5138d
Compare
…t-import tests Prefix unused variables with _ and add eslint-disable comments for require() imports in test helpers. These are pre-existing issues exposed by the assistant CI being triggered for the first time in a while. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3 tasks
devin-ai-integration Bot
added a commit
that referenced
this pull request
Mar 3, 2026
Remove 4 unused files (~297 lines) from clients/shared/: - NetworkInterfaceResolver.swift (58 lines) — zero references outside file. Added in PR #6656 (QR code pairing) but never used. - HoverEffect.swift (41 lines) — zero references outside file. Added in PR #1868 (Extract design system) but never used. - InlineWidgetCardModifier.swift (114 lines) — zero references outside file. Last touched in PR #3473 (platform guard fix). - VWaveformView.swift (84 lines) — zero references outside file. Added in PR #6095 (two-way voice mode) but never used. Co-Authored-By: ashlee@vellum.ai <ashlee@vellum.ai>
3 tasks
ashleeradka
added a commit
that referenced
this pull request
Mar 3, 2026
* chore: remove dead shared library files Remove 4 unused files (~297 lines) from clients/shared/: - NetworkInterfaceResolver.swift (58 lines) — zero references outside file. Added in PR #6656 (QR code pairing) but never used. - HoverEffect.swift (41 lines) — zero references outside file. Added in PR #1868 (Extract design system) but never used. - InlineWidgetCardModifier.swift (114 lines) — zero references outside file. Last touched in PR #3473 (platform guard fix). - VWaveformView.swift (84 lines) — zero references outside file. Added in PR #6095 (two-way voice mode) but never used. Co-Authored-By: ashlee@vellum.ai <ashlee@vellum.ai> * fix: restore InlineWidgetCardModifier and HoverEffect — actively used InlineWidgetCardModifier is used by ConfirmationSurfaceView.swift:48 (.inlineWidgetCard() call). HoverEffect is used by ModifiersGallerySection.swift:86 (.vHover() call in DEBUG gallery). Only NetworkInterfaceResolver and VWaveformView are confirmed dead in this PR. Co-Authored-By: ashlee@vellum.ai <ashlee@vellum.ai> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: ashlee@vellum.ai <ashlee@vellum.ai>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
sec_protocol_options_set_verify_blockwith SHA-256 fingerprint comparison against the stored value from QR pairingPart of plan: ios-connection-plan.md (PR 2 of 3)
New Files
clients/shared/Utilities/QRCodeGenerator.swift— CoreImage QR code generation (macOS only)clients/shared/Utilities/NetworkInterfaceResolver.swift— Local IPv4 detection viagetifaddrs(macOS only, en0 > en1 > fallback)clients/macos/.../Settings/PairingQRCodeSheet.swift— QR display sheet with connection payload and infoclients/ios/Views/QRScannerView.swift— AVFoundation QR scanner with haptic feedback and auto-stopclients/ios/Views/Settings/QRPairingSheet.swift— Full pairing flow: scan > confirm > save config > connectModified Files
clients/macos/.../Settings/SettingsAdvancedTab.swift— Replace token-copy UI with pairing toggle, QR code button, and regenerate actionclients/shared/IPC/DaemonConnection.swift— Add iOS TLS certificate pinning via custom NWParameters verify blockclients/ios/Views/Settings/ConnectionSettingsSection.swift— Add "Scan QR Code" button, update hostname placeholderclients/ios/Views/OnboardingView.swift— Add QR scanner to DaemonSetupStep, fix Continue button to enable after QR pairingclients/ios/Resources/Info.plist— Add NSCameraUsageDescription for QR scanningKey Technical Decisions
Plan: ios-connection-plan.md
$(cat /Users/ashleeradka/Development/vellum-assistant/.private/plans/ios-connection-plan.md)
🤖 Generated with Claude Code