Architecture
Pipeline & Concurrency
Swift 6 Strict Concurrency
Compiled under strict-concurrency=complete with 0 warnings. The capture and inference pipeline is completely queue-confined and Sendable, guaranteeing thread safety when passing detections to the @MainActor UI.
Vision & Thermal Capping
The AVCaptureSession feeds a VNDetectHumanHandPoseRequest extracting 21 landmarks. To cap thermal load, the pipeline classifies every second frame while maintaining a full-rate camera preview.
Spatial Pedagogy
Skeletal Overlay & Live Corrections
Handshape doesn't just show a wall of text when you make a mistake. It overlays a live 21-point hand skeleton onto the camera feed. When a learner forms a sibling shape (like confusing T for N), the trainer highlights the specific offending finger's joints in amber on their own live hand, providing direct spatial guidance.
Accessibility
Deaf/HoH-First Design
Feedback is entirely visual and haptic (via .sensoryFeedback) and never audio-dependent. The bespoke "Liquid Glass" SwiftUI styling automatically degrades to a solid, high-contrast surface when Reduce Transparency is enabled, and animations are correctly gated on Reduce Motion.
Dictionary Data
ASL-Native Phonology, Engineered for Search
The lexicon is JSON-backed with native ASL phonology — handshape, location, movement — on every entry, decoded off the main actor by an @Observable store. Search runs debounced over a precomputed index, so filtering stays allocation-free per keystroke. Sign videos resolve bundled → disk cache → CloudFront.
Identity
Cognito OAuth + PKCE, No SDK
Optional sign-in (Apple, Google, email) runs through the Cognito Hosted UI via ASWebAuthenticationSession with a hand-rolled OAuth authorization-code + PKCE flow — no Amplify, no third-party auth SDK in the binary. Tokens live in the Keychain; the dictionary and trainer never require an account.
Community Backend
Approval-Gated Video Pipeline
Signers can submit signing videos; nothing appears until a reviewer approves. An API Gateway HTTP API with a Cognito JWT authorizer fronts dependency-free Node 20 Lambdas (presign upload / vote / moderate). Uploads land in a private S3 prefix that auto-expires unapproved submissions after 7 days; approval triggers MediaConvert — muted, faststart H.264, audio stripped since ASL is silent — before CloudFront delivery.
Data Layer
DynamoDB tables for submissions (status GSI), variants, and ratings — on-demand billing, point-in-time recovery enabled, every hot-path query a key lookup.
Infrastructure & CI/CD
Terraform, End to End
Auth, community, and budget modules; secrets in SSM Parameter Store; remote state with per-project keys. A bootstrap stack mints least-privilege OIDC roles (gha-handshape-plan / gha-handshape-apply) so GitHub Actions plans on pull requests and applies on main with no long-lived AWS credentials anywhere. Spend is isolated under a CostCenter=Handshape tag with budget alarms.