Universal age verification using passport + zero-knowledge proofs - verify once, access everywhere
AgeGate AI solves the fragmented age verification problem across the web. Instead of uploading your ID to every age-gated site (liquor stores, casinos, adult content), you verify once using your passport's NFC chip through the Self Protocol. This creates a zero-knowledge proof that you're 18+ or 21+ without revealing your identity. The verification is stored on-chain (Celo) and works universally - verify once for a vape shop, and you're instantly verified for all other age-gated sites. No personal data is ever stored on-chain, just a cryptographic proof tied to your wallet address. This gives users privacy, gives websites regulatory compliance, and eliminates the need for centralized ID verification services.
Built this app in a few main pieces:
Smart contract: Extends Self Protocol's verification system on Celo Sepolia. Registers two age configs (18+ and 21+) and stores just the minimum age per wallet address. No personal data is stored on-chain... only cryptographic proofs.
FE: Next.js 15 with RainbowKit for wallet connections. When you hit an age-gated page, it generates a QR code using Self's SDK with your wallet address and required age embedded.
Verification flow - Scan QR with Self mobile app → app reads passport NFC chip... this generates zero-knowledge proof... proof verified on-chain... our contract records the verification.
Debugging challenges - Had to switch from Turbopack to webpack to avoid test file bundling issues. Also figured out that the user address comes through as a uint256 in the verification callback and needs to be cast to address type. Used staging mode with mock passports for testing.
Tech stack - Solidity, Hardhat, Next.js, RainbowKit, wagmi, Self Protocol SDK, Celo chain.

