- Name
- M•i N••••n
- Original script
- N••••n M•i
- Document number
- C••••••3
- Date of birth
- 1994
The scan works. The guest record stays sealed.
Data Encryption is a second lock on top of extraction. Names, document numbers, addresses, and dates leave the server as ciphertext. The phone holds one half of the key. OMGlens holds the other, and cannot finish the open.
Partial. Each name keeps its first and last character. The date keeps the year.
Neither side can open the record alone.
DV1-P256-HKDF-SHA256-AES-256-GCM
- scan_id
- 6f0c2a14-8b31-4d77-9c2e-1a04b7e5d918
- mask
- PARTIAL
- name
- not stored
- payload
- one sealed blob
The name is not a column. It sits inside one AES-256-GCM payload. This panel never opens it.
Fictional guests. Strict matches the API: those fields are absent, shown as —. Partial uses the same mask as the server.
Mai Nguyen is M•i N••••n, the date is the year, and C4829103 is C••••••3.
The payload is one AES-256-GCM blob, suite DV1-P256-HKDF-SHA256-AES-256-GCM.
A vault that does not belong to the vendor
Most ID APIs return a clear record and keep a copy they can read. OMGlens returns a public card, and the sensitive half opens only on the phone that scanned it.
- Split key
Two shares, one open
The device share never leaves the phone. The server share is wrapped and only re-sealed to that same phone at decrypt time.
- Per scan
A fresh envelope every ID
Each successful scan gets its own key. Opening one guest does not unlock the next passport in the line.
- Strict or Partial
You choose the public card
Strict leaves name and number out of the result. Partial keeps the first and last character of each name, the year, and the first and last character of the document number.
- Every stack
One unmask, five SDKs
Flutter, iOS, Android, React Native, and PhoneGap all return a public result plus a vault envelope, then decrypt on the device.
- Separate bill
The plan keeps scanning
A failed add-on payment pauses encryption only. Captures still run. A failed plan payment is what suspends the account.
- Honest limit
The model sees the photo once
Extraction still needs the image for that request. What we refuse to keep is a readable copy of the guest you just scanned.
What the desk sees
You choose the mask per organization. The next scan uses it. A scan already returned keeps the mask it was sealed with.
Strict · default
Before decrypt, the app receives document type, gender, country, state, language, and confidence. Name, number, address, and dates are absent.
Partial
The same public fields, plus a masked peek. Each name keeps its first and last character, so Mai Nguyen is M•i N••••n. A date keeps the year. A document number keeps its first and last character. A name of two characters or fewer stays fully hidden.
Same call on every SDK
Flutter, iOS, Android, React Native, and PhoneGap register the device key during initialize when the licence includes
data_vault. scan() returns the public result and a vault envelope. unmask() asks for the server share and decrypts on the phone.
- iOS decrypt needs iOS 17 or newer.
- A lost device key cannot be recovered. That is the point of the split.
- The model still sees the photo for that one request. This seals the extracted record, not the camera frame in transit to the model.
main.dart
CheckIn.kt
CheckIn.swift
App.tsx
index.js
Billing stays separate from the plan
Turn it on
Any organization can add it. It is not bundled into a tier. Owners and tenant admins start a separate subscription on the card already used for the plan. A system admin can also set the add-on to Off, Active, or Suspended.
If the add-on payment fails
Scanning continues. Encryption pauses until the add-on is paid. The plan itself is not suspended. A failed plan payment still suspends the account, the same as today.