DDP Hunt

A scavenger hunt for RBC's Digital Developer Practice event

A QR-powered scavenger hunt built for RBC's Digital Developer Practice event — role-gated admin tooling, a live points economy, and a leaderboard that updates as attendees scan their way around the venue.

Next.jsTypeScriptMongoDBMongooseAuth0CloudinaryTailwind CSSreact-zxing
Internal RBC tool — the codebase is private.
DDP Hunt

DDP Hunt turned RBC's Digital Developer Practice event into a scavenger hunt: attendees scanned hidden QR codes around the venue, earned points, unlocked achievements, and redeemed prizes from a shop — all while a leaderboard tracked the standings live.

The brief

Developer events live or die on engagement — will people actually visit the sponsor booths, sit through the talks, and talk to each other, or just drift off to their phones? The ask was a lightweight game layer that made moving around the event worth it, plus tooling organizers could trust to run live, mid-event, without needing a developer on standby.

How the hunt works

  • Each hunt item — a talk, a booth, a sponsor table — gets a unique identifier and a QR code, generated per-environment (localhost, staging, production) from the admin panel.
  • Attendees scan with the in-app camera scanner (react-zxing); the identifier is validated and matched against the item's active window and claim cap.
  • A successful claim credits points, checks whether it unlocks a collectible or achievement, and logs the attempt — successful or not — for auditing.
  • Points move on the leaderboard immediately and can be spent in the shop for prizes, some limited-quantity and time-boxed.

Designing the points economy

Everything claimable — hunt items, shop prizes, collectibles, achievements — shares the same shape: an activation window, an optional claim cap, and a point cost or reward. That consistency meant one admin form pattern could create and schedule all of it ahead of time, so items could go live automatically as the event's schedule unfolded instead of someone manually flipping switches between sessions.

Achievements layer on top as a second, derived reward: some unlock from a specific hunt item, others from hitting a claim-count threshold. Both are computed off the same claim history, so adding a new achievement never means touching the claiming logic itself.

Role-gated admin tooling

Auth0 issues a custom roles claim (Admin, Volunteer, Hunter) that gates everything server-side. Admins get full CRUD over hunt items, shop prizes, collectibles, and achievements, plus a live claim-attempts monitor to catch anything that looks like abuse in real time. Volunteers get a scoped-down panel for redeeming points at the shop table without touching the rest of the system.

Every admin mutation — editing a hunt item, adjusting a user's points, redeeming a prize — writes to an audit log with the before/after state, who made the change, and when. For a tool running live across a multi-day event with several admins on shift at once, that trail mattered more than almost anything else in the app.

On-site

Shipping it was only half the job — the other half was standing in the room explaining how it worked, onboarding attendees on the first scan, and watching the claim-attempts monitor during the busiest windows to make sure nothing broke.

Presenting DDP Hunt from the podium at RBC
Talking through the hunt rules with attendees in a hallway
The team reviewing the hunt on printed guides and a screen
Group huddle going over the scavenger hunt guide