Inspiration

People have no real visibility into which apps hold their data, no easy way to revoke access, and — critically — no proof that a revoke actually happened. Privacy policies promise data control, but users just have to trust it. We wanted to make "I revoked access" a claim you could actually verify, not just a button that quietly does nothing you can check.

What it does

PriviPass gives users one place to see every app with access to their data (Permission Guardian), store sensitive documents (Identity Vault), monitor active sessions (Session Guardian), and get a tamper-evident audit trail of every consent, revoke, and lock (Activity Timeline). Every state-changing action is committed to a hash-chained ledger — each entry cryptographically commits to the hash of the one before it, so any tampering with history is detectable. The Timeline's "Verify ledger integrity" button walks the whole chain live and proves nothing's been altered.

We designed this specifically to pair with Midnight: the same commitment our local ledger produces is exactly what our Compact smart contract (consent.compact, with grantConsent/revokeConsent circuits) is built to accept on-chain — letting a user prove they revoked consent for something without revealing what it was for.

How we built it

  • Frontend: React + TypeScript — Dashboard, Permission Guardian, Identity Vault, Session Guardian, Timeline, Settings — every action calls a real backend endpoint with proper loading/empty/error states.
  • Backend: Express API with JWT auth (bcrypt password hashing), persistent storage, full CRUD for permissions, vault documents, and sessions.
  • Ledger: A genuine hash-chained, append-only audit log — the same commitment structure our on-chain circuit expects.
  • Midnight integration: A Compact contract (consent.compact) with grantConsent and revokeConsent circuits, compiled successfully. A bridge module activates automatically once a contract is deployed — the app runs fully today without it, and the exact same commitment already being computed just gets submitted on-chain instead.

Challenges we ran into

We hit a reproducible bug in the current Midnight wallet SDK's sync layer (Wallet.Sync errors) that prevented completing a live on-chain deployment during the hackathon window — confirmed independently via direct indexer GraphQL queries that our testnet wallet was correctly funded on preprod even though the CLI itself couldn't detect it. We tried multiple wallets, a fresh reboot, and an SDK version bump, and traced it to an environment-level bug rather than anything in our code.

Accomplishments that we're proud of

A genuinely working full-stack app — real auth, real database, real cryptographic ledger — with a Midnight contract that compiles cleanly and a bridge architecture designed so the on-chain step is a drop-in swap, not a rewrite.

What we learned

Hands-on experience with the Compact language, the Midnight toolchain, and testnet wallet/proof-server infrastructure — including debugging early-stage tooling using direct indexer queries when higher-level tools were unreliable.

What's next for PriviPass

Deploy consent.compact to Midnight once the SDK issue is resolved, wire real OAuth integrations for actual third-party services, and connect the existing txHash field to live transactions.

Built With

Share this project:

Updates

Submission history