Skip to main content

Upload a portrait to check it against US Visa (DS-160, 2×2 in) or Schengen / ICAO (35×45 mm) requirements — head geometry, pose, background, lighting and expression — then auto-crop it to a print-ready, DPI-tagged file. Everything runs in your browser.

Passport & Visa Photo Validator — ICAO 9303 / DS-160 compliance

A privacy-first biometric photo checker that inspects a portrait against the US Department of State (DS-160, 2×2 inch) and Schengen / ICAO Doc 9303 (35×45 mm) requirements — head size and position, pose, background colour and lighting — and auto-crops it to a print-ready file with the correct DPI. Every pixel is measured in a Web Worker in your browser; the photo never leaves your device and no server is contacted.

What it measures

  • Geometry: crown-to-chin head height, eye-line height and horizontal centring as exact fractions of the frame, with the standard’s acceptable bands.
  • Head pose: roll, yaw and pitch via a weak-perspective POS solver against a canonical 3-D head model, with roll cross-checked exactly from the eye line.
  • Background: chromatic uniformity as CIE76 ΔE*ab spread, mean L* brightness, a Sobel edge-energy pattern scan and a cast-shadow gradient check around the head silhouette.
  • Illumination: left/right facial symmetry via SSIM and luminance-histogram divergence, plus specular hotspot detection.
  • Expression: eyes-open and neutral-mouth checks — measured Eye/Mouth Aspect Ratios when an offline mesh model is present, honest image heuristics otherwise.

On honesty and the face model

There is deliberately no bundled face-mesh model and no CDN download — that would send the photo, or fetch megabytes, off-device and break the local-only guarantee. Anchors are seeded automatically with the browser’s own face detector where available and refined with drag handles, which is enough for exact ICAO geometry. For full 468-point automation and measured eye/mouth ratios you can register your own offline model (MediaPipe or ONNX) via globalThis.__ORILAMI_FACEMESH_MODEL__; it still runs locally and uploads nothing. This tool is a pre-submission screen — the issuing authority makes the final decision.

FAQ

Is my photo uploaded anywhere?
No. Decoding, face detection, every measurement and the auto-crop run in your browser. The image never leaves your device and no server, model host or telemetry endpoint is contacted.
Does it guarantee my photo will be accepted?
No tool can. It measures the documented ICAO 9303 / DS-160 geometry, background and lighting requirements so you can fix problems before you submit. Final acceptance always rests with the authority or portal.
Why do I place the anchor points myself?
To keep the photo on-device we do not ship a face-mesh model. The browser seeds the anchors automatically when it can, and you refine them by dragging — which is enough for precise crown-to-chin, eye-line and centring geometry. Register an offline model to fully automate it.
What does the auto-crop produce?
A JPEG at the standard's exact pixel size (600×600 for US, 827×1063 for Schengen) with the head, eye line and centring placed to spec, and the correct DPI (300 or 600) written into the JFIF header as a real binary edit — not just a resize.
How are roll, yaw and pitch computed?
By matching your anchors to a canonical 3-D head model with a weak-perspective POS solver (the non-iterative core of POSIT) to recover a rotation matrix, then extracting Euler angles. Roll is additionally taken exactly from the eye line.
Which formats can I check?
JPEG, PNG and WebP, plus TIFF and HEIC/HEIF via in-browser decoders. The DPI-tagged export is always a JPEG.