← all work
CASE STUDYFeb – Mar 2025· confidential — no public code· neoke.com

Neokepassport to verified, in one flow

Snap a passport and a selfie, get checked against IATA travel rules — one mobile flow.

2 wks
concept to shipped
7
routes / 8 pages
2
verification APIs
OAuth2
IATA integration

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

React 18TypeScriptVitereact-webcamReact RouterTailwind / shadcnZodExpress + Bun