Inspiration

Hotel booking data is some of the richest live data on the internet: prices shifting nightly, guest ratings, supplier channels, cancellation policies. Yet it's almost always presented the same way, as a card in a search grid. We wanted to invert that. What if the data wasn't the interface, but the mystery? The Fairmont Royal York, Toronto's grand 1929 railway hotel with real floor plans available, gave us the perfect haunted house. We rebuilt it foot for foot in three.js and asked what a hotel would feel like if its record was corrupted, and the only way out was to restore the truth from live inventory data. Add Presage's camera-based physiological sensing, and the oldest horror mechanic of all ("be quiet, it can hear you") becomes literal.

What it does

The Concierge is a first-person horror game inside a 1:1 recreation of the real Royal York's mezzanine and convention floors. A decayed concierge, hands pressed over its eyes, hunts you by sound alone, including your actual voice and breathing, detected through your mic and camera. Four Archive Generators around the hotel each restore a category of live Stay22 data (property identity, guest rating, supplier channels, rate policy), and reconstructing the corrupted record at the front desk requires answers only that data can give. The funnel is live too: every real attributed booking that lands in the Stay22 transaction ledger rings the reception bell in-game, "A NEW RESERVATION HAS ENTERED THE LEDGER / THE CONCIERGE CAN SEE", and for fifteen seconds the entity opens its eyes and hunts. Win, and the corrupted hotel resolves into a real property card with a disclosed affiliate booking link. The nightmare was fictional; the hotel is real.

How we built it

Vanilla JavaScript + three.js + Vite, with a zero-dependency Node server that owns all API keys. The browser only ever receives sanitized sessions and transaction events reduced to {id, campaign, at, simulated}. The hotel geometry is generated from a spec extracted from the actual floor plans (1 unit = 1 foot). The entity runs a noise-bus-driven state machine (patrol → suspicious → pursuit → hunt) with line-of-sight raycasts against room colliders. Biometrics run through a three-mode adapter: a documented SmartSpectra integration point, a local fallback engine (mic RMS + speech-band energy for talking; camera temporal-luminance motion for breathing, with nothing recorded or uploaded), and a zero-capture "PROCEED UNREGISTERED" mode that keeps the game fully playable. Everything works with zero API keys via a bundled snapshot, honestly badged FALLBACK; drop in a Stay22 key and the puzzle rebuilds itself from live data. We developed with parallel AI agents against strict per-module contracts, and every claim is executable: 100+ unit checks plus a puppeteer script that plays the entire game headlessly, from consent through jumpscare through victory, screenshotting every beat.

Challenges we ran into

The nastiest bug never threw an error. After the calibration screen started the capture engine with its own callback, the game's later start() call was silently ignored, so talking and breathing signals froze at zero forever. Playtesting showed the monster reacting to jumps but never to voice, and root-causing it meant tracing the signal path layer by layer from analyser to entity. Going live with Stay22 produced a subtler one: the API returned "Fairmont Royal York Gold Experience" (a sub-listing with 31 reviews and 1 supplier) before the main hotel, so our puzzle was quizzing players on the wrong property record. Our headless screenshot run caught two more that unit tests never would: a CSS align-items: center + overflow interaction that clipped the front-desk form's header off-screen at 1280×720, the exact laptop resolution judges would use, and a capture indicator visible before consent was given, contradicting our own privacy copy. Playtesting also revealed the sighted hunt speed was accidentally slower than the player's walk: a monster that could never catch anyone.

Accomplishments that we're proud of

The full loop closes: real commerce changes gameplay live, and the path from terror to booking link is one unbroken experience. The privacy design is something we'd defend anywhere: consent before any capture, local-only processing, an always-visible capture indicator, a no-capture mode that's fully playable, and we never ask a player to hold their breath. The whole project runs with zero keys and zero configuration (npm install && npm run dev:all), yet flips to live data with a single .env line. The verification culture held under hackathon pressure too. The puppeteer full-playthrough test caught real, judge-visible bugs, and the screenshots in our README are its unedited output against the live API.

What we learned

Integration seams fail silently. Two independently-correct modules (calibration and the game both "starting" capture) produced a dead feature with no error anywhere, and only end-to-end tracing found it. Real APIs are messier than their docs: the first search result isn't the canonical property, and "works with a key" isn't proven until you've watched live values flow into the win screen. Visual end-to-end testing has a different failure-detection spectrum than unit tests; our 100+ unit checks all passed while the desk form was unreachable at common laptop resolutions. And honest framing is a feature, not a disclaimer. Judges trust a SIMULATED badge and a FALLBACK label far more than an ambiguous demo.

What's next for The Concierge

More hotels. The architecture is property-agnostic: any hotel with floor plans and Stay22 inventory can become a case file on the landing page's case board. The SmartSpectra relay: our Presage integration point is documented and one function deep, and a small Node relay unlocks real pulse, HRV, and apnea-grade breathing signals. Creator mode: streamers get a unique campaign ID, so their viewers' real bookings trigger hunts live on air (the transaction watcher already supports it). A post-game showcase mode that relights the hotel in full, so the fear converts into genuine interest in the space. And an ElevenLabs voice concierge, so the thing at the desk can finally speak to you. Politely, of course. It has always been so very polite.

Built With

Share this project:

Updates

Submission history