PolkaProof – Web2-to-Web3 Attendance dApp

Inspiration

We love the convenience of Web2 event platforms but hate that proof-of-attendance data is opaque and unverifiable. Polkadot already gives us battle-tested wallets and pallet-nfts, so we wanted to show how a Devpost-style workflow could inherit those strengths without losing UX.

What it does

  • Lists events with QR-driven check-in flows
  • Requires a Polkadot wallet signature to record attendance, storing proofs in Supabase
  • Optionally captures a MetaMask address so organizers can airdrop EVM NFTs later
  • Exposes organizer APIs to mint pallet-nfts badges, upload art to Pinata/IPFS, and inspect collection metadata

How we built it

  • Frontend: Next.js 14, React 18, Tailwind, Zustand for wallet state
  • Wallets: @polkadot/extension-dapp for signing attendance/profile updates; MetaMask via window.ethereum purely for reward address capture
  • Backend: Next.js Route Handlers + @polkadot/util-crypto for signature verification, Supabase for storage, and Pinata/IPFS for badge metadata
  • Badges: Pallet-nfts minting through @polkadot/api, with helper scripts to create collections and APIs to batch mint

Challenges we ran into

  • MetaMask signature verification on the backend was fragile; we pivoted to using Polkadot solely for check-ins and treating MetaMask as optional metadata
  • Ensuring contract metadata could be read during Next.js builds meant normalizing file paths and gateways
  • Coordinating Supabase migrations (RLS + new evm_address column) while keeping anonymous flows functional

Accomplishments that we're proud of

  • Seamless hybrid wallet UX: attendees connect once and the app remembers both wallets across pages
  • Fully RESTful organizer APIs that feel Web2-native but mint on-chain collectibles
  • Deterministic badge metadata hosted on Pinata/IPFS with links surfaced wherever badges appear

What we learned

  • Users accept multi-wallet flows if you explain the benefit clearly (“Polkadot signs the proof, MetaMask gets the NFT”)
  • Supabase + Next.js Route Handlers make it easy to share the same codebase between the UI and backend services
  • Polkadot’s tooling (signRaw, signatureVerify, pallet-nfts) is reliable enough for hackathon-scale operations with minimal glue code

What's next for PolkaProof – Web2-to-Web3 Attendance dApp

  • Build an automated NFT dropper that reads profiles.evm_address and mints ERC-721/1155 rewards on Moonbeam or other EVM parachains
  • Add analytics dashboards (attendance streaks, badge rarity) powered by Supabase or DataHub
  • Package organizer APIs as a drop-in SDK so any Web2 event platform can bolt PolkaProof on top of its existing flow

Built With

  • metamask
  • next.js-14
  • pallet-nfts-via-westend-rpc
  • pinata/ipfs-for-badge-storage
  • polkadot/api
  • polkadot/extension-dapp
  • polkadot/util-crypto
  • react-18
  • supabase-(postgres-+-rls)
  • tailwind-css
  • zustand-for-wallet-state
Share this project:

Updates