I just woke up hungry during Hack the North. Let’s see what’s for breakfast. Oh nice! There’s an egg right there. Let me grab it real quick.

OH NO. IT FELL AND CRACKED… Wait… is that a nest? HONK! HONK! HONK! Flapping noises start getting closer. I GOTTA RUN!!! THE GOOSE IS CHASING ME. HELP!

It’s running fast. NOW IT’S FLYING! I hear its wings flapping behind me, but I can’t see it. My phone is facing forward, and every honk gets louder. The haptics start going crazy. WAIT IT CAN ACTUALLY NAVIGATE THROUGH THE BUILDING?!

I quickly turn my phone around. LET'S HIDE BEHIND THIS CHAR. OH MY GOODNESS. IT JUMPED THAT CHAIR. I turn around again. THAT WAS A MISTAKE! The goose lands on me, flaps wildly, and screams: “THAT WAS MY EGG!”

The screen shakes. My phone vibrates. The goose wins. I GOT GOOSED!


The geometry behind GOOSED.

Our Unity/ARKit chase uses body-sized capsule casts against scanned room geometry for local obstacle avoidance.

What if the chair or object appears after the goose lands? LiDAR builds the room incrementally, so new geometry can arrive around an already-standing goose. We resolve overlaps horizontally to keep its feet on the floor. Given this separation:

$$ \Delta\mathbf x=\frac{d\,\mathbf n_h}{|\mathbf n_h|^2}. $$

Near-vertical contacts use a separate rule that ignores shallow floor noise and searches outward for a free standing spot when the goose is embedded in furniture.

Making its shadow survive a noisy floor scan. The shadow catcher checks virtual-object depth and real-world depth separately. For the real-world test, it uses:

$$ V_{\mathrm{real}}=\operatorname{smoothstep}!\left(-1.6\tau,-0.4\tau,D_{\mathrm{real}}-D_{\mathrm{floor}}\right). $$

The asymmetric band keeps the shadow visible when the two depths nearly agree, while fading it out when a real object sits sufficiently in front of the floor. A separate virtual-depth test prevents the floor shadow from drawing over the goose itself.

Sponsor integrations

  • Cloudflare: persistent, low-latency goose intelligence: Cloudflare Workers and the Agents SDK run the Goose Director, which manages the goose’s dialogue, mood, and behavior. Durable Objects give the goose persistent memory so it can remember the player’s previous escapes and hold grudges across runs. R2 stores generated voice assets, while Workers AI handles transcription and lightweight dialogue tasks. This keeps the goose responsive even when network conditions are imperfect, while cached assets allow the core experience to continue offline.
  • ElevenLabs: Audio as a gameplay and accessibility channel- ElevenLabs gives the goose an expressive personality through dynamic taunts, honks, and wing sounds. OpenAI supplies the goose’s emotional state such calm, suspicious, furious, or panicked and ElevenLabs turns that state into appropriate audio. The sounds are 3D spatialized with Unity and cached on the phone so players can understand how close the goose is without constantly looking at the screen. This makes audio and haptics a parallel gameplay channel rather than just decorative effects.
  • Sentry: performance and accessibility through observability - Sentry helps link phone and backend traces with errors, frame-time measurements, AR tracking status, audio latency, haptic timing, and game-state context. I use it to identify stutters, tracking failures, slow voice requests, and delayed danger cues. These measurements help us make the game smoother and more accessible. A player who relies on audio, haptics, or brief glances at the screen should receive those cues consistently and on time. Sentry lets us verify that performance problems are not making the game unfair or impossible to follow for older devices. It also helps advance accessibility by allowing for performance tuning and benchmarking to expand reliability across multiple devices.
  • Elastic: Turning chaotic gameplay data into adaptive goose behaviours. Elasticsearch, ES|QL, semantic search, and time-series queries combine goose dialogue, player shouts, round history, AR telemetry, obstacle interactions, haptic events, and catch outcomes. Agent Builder and Workflows analyze this messy data to answer questions such as “Why was the player caught?” or “Which warning cues arrived too late?” The system can then flag confusing encounters and recommend changes to goose speed, warning timing, audio intensity, or obstacle behavior. Elastic helps transform the raw gameplay events into evidence for improving fairness, accessibility, and replayability.
  • OpenAI: AI for the advancement of goose grudges. An adaptive antagonist instead of a scripted character. The API acts as the Goose Director. It receives compact game-state information -- survival time, distance, near misses, player movement, obstacle encounters, and previous escapes -- and returns structured mood, taunt, and behavior decisions. Those decisions control the goose’s personality and are passed to ElevenLabs for expressive audio. This makes each chase feel personally directed rather than repeating the same fixed script. The game also includes deterministic fallback behavior so the chase remains playable if the API is unavailable.

Built With

Share this project:

Updates

Submission history