
ZKTap
I'm building the ‘Apple Pay’ of verified truth — except you’re not paying, you’re proving something.
Demo
About
ZKTap is a privacy-preserving, real-world identity verification system that lets users tap their phone to a reader and prove a fact about themselves - like being over 18, a student, or a verified member - without revealing any personal information. It leverages zk-SNARKs and NFC technology to compress verifiable claims into a single tap, enabling anonymous, trustless, instant verification in physical environments like events, stadiums, campuses, and local businesses. Today, proving identity in the real world is messy - you show your government ID to a bad actor a bar and then you've leaked your name, address, birth date and other personal information. Alternatively, you can try connecting this information with your wallet address and reveal your entire on-chain history... There is currently no way to prove these claims privately and instantly in offline or semi-offline environments. This is where ZKTap comes in, the first to bring Zero-Knowledge Proofs to NFC and mobile phones. ZKTap lets users generate a zk-SNARK proof (via VLayer) showing that they've met a specific condition (e.g. NFT ownership) without revealing their wallet, identity or data. The proof is around ~750 bytes, stored locally on the phone, and served via Android NFC Host Card Emulation (HCE). When tapped against a reader (e.g., another phone), the proof is sent via APDU command, and verified. No tracking. Just cryptographic truth — on tap.
How it's made
📲 Mobile App (Prover) - Kotlin Android App - Generates zk-SNARK proof server-side (VLayer). In production, I will move this from server-side to mobile side. But was unable to due to time constraints in the hackathon. - Stores the proof locally - Using Android Host Card Emulation for NFC - Sends full proof payload upon tapping the reader 📡 Reader App (Verifier) - Basic Android Kotlin app - Compatible on any Android device but demo'ed on Urovo i9000 Card Terminal. (Also technically possible on iPhone but time constaints) - Receives proof upon NFC connection - Verifies it using VLayer’s verification key Shows ✅ if valid, ❌ if not 🔐 The Proof Uses a circuit proving the user holds an 18+ age-verified NFT zk-SNARK ensures: - Correctness (claim is valid) - Privacy (wallet address is not revealed) - Compactness (fits in ~750 bytes) 📊 API - Typescript/Express/Node.js - Used for creating proofs temporarily, plus connecting with Revolut's KYC for NFT issuance 🖥️ Web Frontend - Typescript/React/Vite - Used to connect wallet and then connect with revolut KYC for age verification 🐵 Verified NFT - Basic ERC-721 Contract - In future will add more functionality like non-transferable etc.