I built the front-end identity-verification flow for Neoke, a travel digital-identity startup. A traveler photographs a government ID, takes a selfie, and gets a verified result on one mobile page. The webcam capture layer is mine — document and selfie capture, a review-and-retake step, and front/back camera switching on mobile, all on react-webcam.
The captured ID posts to a /process-document endpoint that returns OCR fields (MRZ string, document number, expiry, all four check digits); the selfie posts to /facematch for a match score I render as a confidence dial with high/moderate/low tiers. I also built a separate Timatic tool that calls IATA's travel-requirements API to check a document against a trip itinerary.
The hard part
Sharp ID photos across every browser
Browser cameras are inconsistent — Safari, Chrome, and mobile each read getUserMedia resolution constraints differently, so frames came back blurry, wrong-sized, or black. I rebuilt the capture component on react-webcam with forced screenshot source sizing, separate constraints for mobile (960×1280) and desktop (1920×1440), and a Safari-specific fix — ID images crisp enough for the OCR endpoint to read the MRZ and the check digits.
Highlights
- Built a 7-route React verification flow: capture, review, selfie, results, guest registration.
- Wired 2 backend integrations — /process-document (OCR + MRZ + check digits) and /facematch (match score).
- Fixed cross-browser webcam capture, including a Safari-specific bug and mobile front/back switching.
- Integrated IATA Timatic's document-request API with OAuth2 client-credentials token exchange.
- Built a 5-section, Zod-validated guest-registration form with draw-or-type signature capture.
Stack