Search projects, hackathons, sponsors and tech

    ← All projects

    Reveal

    Buy a sealed mystery night. You know the vibe, the experience stays secret until you shake

    Demo

    About

    Reveal is a two-sided marketplace for sealed mystery nights. You do not book a named show or pick a venue from a list. You buy a crate. Before you pay, the product only shows the vibe: category, neighborhood, time window, mystery USDC price, and a value floor so you know the deal is real. The actual experience stays locked until after checkout. That secrecy is the product. Empty seats an hour before showtime are almost worthless, and public discounts train people to wait while bots scoop the good inventory. Reveal flips both sides at once. Merchants quietly clear leftover capacity as sealed crates instead of training the market to delay. Buyers get the thrill of not knowing what they pulled, with guardrails so the surprise stays fair. The buyer journey is built around that mystery. Guests browse constraints-only cards, sign in with Privy, prove they are a live human with World Selfie Check, pay USDC on Base, then shake the crate open. Only then do title, details, and a door pass appear together. One crate per verified human per drop: the nullifier is unique for that night, so a second selfie cannot double-dip. Identity never goes to the merchant. After payment, a non-transferable Hedera Reveal Pass is minted with a QR for check-in; because it cannot be transferred, the night cannot be scalped after reveal. If a drop never reveals, payment can refund. Merchants get the other half of the loop. A cinema, theatre, or dining room lists leftover seats as a sealed crate, watches a dashboard, and scans the guest QR at the door to redeem the pass and settle the seat. There is also an AI concierge path: an agent pays an x402 availability API on Hedera via Blocky402, then reads which mystery nights are still open by area without scraping the consumer UI. So demand can arrive through the app or through chat, while supply still publishes once. Consumer loop: auth → selfie → pay → shake → pass. Merchant loop: create → dashboard → scan. Agent loop: 402 challenge → settle → availability. The whole point is one marketplace that protects the mystery for buyers and liquidates expiring inventory for merchants without spoiling either side. Both sides win.

    How it's made

    Reveal was built from scratch during ETHOnline as a pnpm monorepo. The consumer, merchant, and agent surfaces live in a Next.js app. An Express service stays up as the x402 availability API. Drizzle owns the schema for PGlite locally or Postgres in production. A shared Hedera package handles Reveal Pass issue and redeem. Partner tech is not bolted on for a checklist: each one sits on a critical path in the mystery loop. The UX is intentional about spoilers. Drop cards show category, area, time, and price only. Venue and title stay blurred until the shake animation finishes. Rarity heat is computed from deal quality, face value versus mystery price, so a stronger discount feels rarer without revealing what you bought. After unbox, XP, streak, and badges land on the player profile, and a public board shows live pulls without unsealing other buyers’ crates. That keeps the demo cinematic while the fairness rules stay real. Money and auth run through Privy embedded wallets plus viem on Base Sepolia. On login, users without wallets get one automatically. Buyers transfer USDC into escrow from the buy flow; if the night never reveals there is a refund path. The UI tracks USDC and gas as separate balances on purpose, because hackathon demos often die when someone has faucet USDC but no Base Sepolia ETH. Merchant routes are allowlisted by Privy DID so venue tools stay gated without a custom auth stack. Fairness is World IDKit v4 Selfie Check. The server signs the RP request, the widget collects the proof, and we post the payload to World’s v4 verify endpoint. We store action plus nullifier plus dropId so a second selfie cannot buy the same mystery night, and we never forward identity to the merchant. Selfie Check is still beta-gated, so we kept a labeled Demo verify path that still hits our verify and uniqueness APIs rather than silently mocking pay, reveal, and pass. That let us record the full stack while waiting on Portal enablement. The night itself is tokenized on Hedera. After USDC payment confirms, we mint a non-fungible Reveal Pass with the Hashgraph SDK over HTS, associate and transfer it, surface HashScan links, and redeem it when the merchant scans the door QR. ATS factory addresses are documented for Tokenization of Anything alignment; the live hackathon path is HTS because the full Equity.create diamond was too heavy for the event window. Consumer Hedera keys are operator-custodied for mint on the demo path, and that is disclosed. The agentic path is Hedera x402. GET /availability returns HTTP 402 with an exact-scheme Hedera challenge and Blocky402 as facilitator. The /agent console settles that challenge, then reads remaining mystery inventory by area. That is how AI chat can discover sealed nights without scraping the consumer UI, and how the same inventory serves both the human UI and the agent. The hacky but useful glue is an in-process Next.js store that auto-seeds a demo crate so recording does not depend on a cold database, while Drizzle remains ready for durable Postgres. Put together, Privy moves money, World enforces one human per crate, Hedera carries the pass and the paid availability API, and the product in the middle stays what it claims to be: a sealed mystery night for both sides of the market.