Inspiration

At our Viterbi new-student event, the icebreaker was a campus scavenger hunt. It was a great idea that turned messy in practice. Every team had to send photos back to the organizers for verification. Some photos got lost in group chats, some arrived late, and the organizers spent the whole event scrolling through images to say "yep, that's the fountain." Nobody really knew the score until the end.

That made us wonder: what if the phone could act as the referee? You point your camera at the thing, your phone confirms it on the spot, and everyone sees the race unfold live. That's GooseChase: a wild goose chase, but you actually catch the goose. 🪿

What it does

  • Create a hunt. Each checkpoint gets a clue and 3+ reference photos of the hidden object.
  • Host: friends nearby scan your QR code or type a 4-letter room code to join your lobby. No accounts, no server.
  • Chase: everyone starts together after a synced 3-2-1 countdown. Point your camera at what you think the clue means, and on-device Vision clears the checkpoint automatically when it matches.
  • Follow along everywhere: a Live Activity on the Lock Screen, in the Dynamic Island and in the Apple Watch Smart Stack shows your clue, progress and timer, with a little goose that runs and celebrates.
  • Hands-free: say "What's my clue in GooseChase" and Siri reads it to you. "Snap it" opens the camera, and works from the Action Button too.

How we built it

  • SwiftUI on iOS 26, with SwiftData for hunts, checkpoints and best times.
  • Vision feature prints compare the camera feed with each checkpoint's reference photos. A distance $d$ becomes a match score:

$$ \text{score}(d) = \operatorname{clamp}!\left(\frac{d_{\text{weak}} - d}{d_{\text{weak}} - d_{\text{strong}}},\ 0,\ 1\right) $$

We score the whole frame, a center crop, and a crop around the most eye-catching object, then take the best of the three. Live scores are averaged over the last few frames. A checkpoint clears once the score stays above 85% for half a second, and a still photo is checked once more to confirm.

  • MultipeerConnectivity handles nearby play. The host sends the whole hunt to each player and broadcasts a shared start time, so everyone's countdown hits zero together.
  • VisionKit + Core Image for QR codes. The iPhone Camera app can even open quarry://join?code=… links directly.
  • ActivityKit for the Live Activity, Dynamic Island and Watch Smart Stack.
  • App Intents for Siri, Spotlight, Shortcuts and the Action Button.
  • Liquid Glass controls over a sky-and-grass look, a goose mascot drawn in code with Canvas and TimelineView, and a layered icon made in Icon Composer.

Challenges we ran into

  • Peer-to-peer is fussy. Phones kept connecting and then dropping a second later. We fixed it by keeping each phone's peer ID the same between sessions, simplifying the connection's encryption settings, adding retries and automatic reconnects, and waiting before shutting down discovery.
  • "Is that the right object?" is harder than it sounds. Comparing whole camera frames meant the background mattered as much as the object. Standing further back, or a different backdrop, caused misses. Checking several crops of each frame and smoothing over a few frames made matching much more forgiving without letting wrong objects through.
  • Three people redesigning in parallel. Two UI passes landed at once, and we spent a tense half hour untangling merge conflicts and a stray stash before combining them.
  • Watch quirks. A custom background color on the Watch removed the system's glass effect and made text hard to read, so we draw our own sky inside the Watch layout instead.

What we learned

  • How much Apple ships on-device: Vision, nearby networking, Live Activities and App Intents together can replace a backend for a lot of social apps.
  • Live Activities on iPhone and Apple Watch only update when the app sends new data, so the animation has to be designed around those updates.
  • Building the shared code (models and Live Activity data) first let three people work in parallel, until the redesigns collided.

What's next

  • Smarter matching: combine feature prints with on-device object labels, and set the match threshold for each checkpoint.
  • More modes: team races, timed rounds, and hints that cost time.
  • Share hunts beyond the room with CloudKit, so an orientation team could build a hunt once and run it every year.

Built With

Share this project:

Updates

Submission history