A demonstration of zero-knowledge proof identity verification for seamless, privacy-preserving hotel check-in experiences.
zkpassport.demo.1.mp4
This project simulates a digital hotel check-in experience for Accor hotels, showcasing how guests can verify their identity without exposing sensitive personal information.
Traditional hotel check-ins require guests to hand over passports or IDs, exposing sensitive data like:
- Full name and date of birth
- Passport/ID numbers
- Address and nationality
- Biometric photos
This data is often photocopied, stored insecurely, and creates privacy risks for travelers.
With ZKPassport, guests can prove only what's necessary:
- "I am over 18" - without revealing exact birthdate
- "I am an EU resident" - without showing full document
- "My face matches my passport" - without storing biometric data
The hotel gets verified claims, the guest keeps their privacy.
ZKPassport is a privacy-first identity verification system that uses zero-knowledge proofs (ZKPs) to enable secure credential verification without exposing personal data.
Traditional Verification: ZK Verification:
┌──────────────┐ ┌──────────────┐
│ Show full │ │ Generate │
│ passport │ │ ZK proof │
└──────┬───────┘ └──────┬───────┘
│ │
v v
┌──────────────┐ ┌──────────────┐
│ Hotel sees │ │ Hotel sees │
│ ALL data │ │ ONLY claim │
│ - Name │ │ "User is │
│ - DOB │ │ over 18" │
│ - Photo │ │ │
│ - ID number │ │ (verified │
└──────────────┘ │ true) │
└──────────────┘
- User scans passport with the ZKPassport mobile app
- Cryptographic proof generated locally on the user's device
- Only the verified claim is shared (e.g., "user is 18+" without revealing actual birthdate)
- No personal data leaves the device - only mathematical proofs
This demo simulates a complete digital check-in flow where guests can:
Verify the guest is 18+ years old for check-in eligibility. Required by most hotels for room booking.
Guest chooses to share their nationality for registration purposes, often required for tourism statistics.
Verify if guest holds an EU residence permit - useful for VAT exemptions or special EU guest programs.
Complete identity verification including:
- Full name disclosure
- Document number verification
- Expiry date check
- International sanctions screening (OFAC, EU, UK lists)
Required for premium services, loyalty program enrollment, or regulatory compliance.
Verify the person checking in matches their passport photo - enables keyless room entry and enhanced security without storing biometric data.
┌─────────────────┐
│ Guest arrives │
│ at hotel kiosk │
└────────┬────────┘
│
v
┌─────────────────┐ ┌─────────────────┐
│ Select what to │────>│ QR code shown │
│ verify │ │ on screen │
└─────────────────┘ └────────┬────────┘
│
v
┌─────────────────┐
│ Guest scans QR │
│ with ZKPassport│
│ mobile app │
└────────┬────────┘
│
v
┌─────────────────┐
│ Proof generated│
│ on guest's │
│ phone (local) │
└────────┬────────┘
│
v
┌─────────────────┐ ┌─────────────────┐
│ Check-in │<────│ Hotel receives │
│ complete! │ │ verified claim │
└─────────────────┘ └─────────────────┘
import { ZKPassport } from "@zkpassport/sdk";
// Initialize SDK
const zkPassport = new ZKPassport('https://your-domain.com/');
// Age verification - prove guest is 18+
const { url, verify } = await zkPassport
.request()
.gte('age', 18)
.done();
// Display QR code from 'url'
// Wait for verification result
const result = await verify({
onRequestReceived: () => console.log("Guest scanned QR"),
onGeneratingProof: () => console.log("Generating proof..."),
onResult: (result) => console.log("Verified:", result)
});| Method | Description | Example |
|---|---|---|
.gte(field, value) |
Greater than or equal | .gte('age', 18) |
.eq(field, value) |
Equals | .eq('document_type', 'residence_permit') |
.in(field, array) |
Value in list | .in('issuing_country', ['FR', 'DE', 'IT']) |
.disclose(field) |
Reveal field value | .disclose('nationality') |
.sanctions() |
Sanctions screening | .sanctions(['US', 'EU', 'UK']) |
.facematch(mode) |
Biometric verification | .facematch('strict') |
zk-passport/
├── src/
│ ├── App.jsx # Main app with verification logic
│ ├── main.jsx # React entry point
│ ├── index.css # Tailwind styles
│ └── components/
│ ├── VerificationCard.jsx # Verification option cards
│ └── ResultModal.jsx # QR code & results modal
├── package.json
├── vite.config.js
└── tailwind.config.js
- Node.js 18+
- npm or yarn
- ZKPassport mobile app (for scanning QR codes)
# Clone the repository
git clone <repo-url>
cd zk-passport
# Install dependencies
npm install
# Start development server
npm run devThe app will open at http://localhost:3000
To test with the ZKPassport mobile app, expose your local server:
ngrok http 3000Then scan the QR code with the ZKPassport app.
npm run build
npm run preview| Package | Purpose |
|---|---|
@zkpassport/sdk |
Zero-knowledge proof verification |
react |
UI framework |
framer-motion |
Animations |
qrcode.react |
QR code generation |
lucide-react |
Icons |
tailwindcss |
Styling |
This same technology can be applied to:
- Airlines - Age verification for alcohol, visa status checks
- Car rentals - License verification, age requirements
- Casinos - Age and sanctions verification
- Banks - KYC without document storage
- Healthcare - Identity verification for patient records
MIT