GS//DIGITAL ANCHOR
INITIATE →

DEPLOYMENTS / QUESTMODE

MOBILE APP

QuestMode

Real-life AI micro-quests. Claude generates challenges tailored to a venue, Claude Vision verifies photo proof with a witty verdict, and Supabase Realtime pushes XP to a projector-friendly leaderboard — stranger to player in under 90 seconds, and nothing on screen looks broken even when the AI fails.

CLIENT

Hackathon product

YEAR

2026

SYSTEMS

MOBILE · AI

STATUS

DEPLOYED

<90

s stranger → player → first quest

100%

demo uptime — even with AI down

1

server secret. Zero keys in the client bundle

[ THE BRIEF ]

The challenge we walked into.

A 3-minute demo window at a hackathon. The app had to onboard total strangers, run a full AI-driven loop live on a projector, and keep working even if venue wifi flaked and every API dropped. Nothing on screen was allowed to look broken. Zero manual moderation, zero visible error states, and the Anthropic key could never touch the client bundle.

[ TOPOLOGY ]

How the system is wired.

// SYSTEM TOPOLOGY

  1. LAYER 01

    Player Phone

    EXPO GO

    Projector

    LEADERBOARD

  2. LAYER 02

    Expo App

    RN + ZUSTAND

  3. LAYER 03

    Supabase Auth

    INSTANT SESSION

    Supabase Storage

    QUEST PHOTOS

    Supabase Postgres

    PLAYERS · QUESTS

    Realtime Channel

    WS PUSH

  4. LAYER 04

    claude-proxy

    EDGE FN

  5. LAYER 05

    Claude API

    GENERATE + VISION

[ WHAT WE SHIPPED ]

Feature by feature.

[ FEATURE // ONBOARDING ]

Under ten seconds from QR to playable.

Scan the QR on the projector, land in Expo Go, pick a nickname, tap a zone. Auth email confirmations are disabled for the event so registration yields a session instantly — no inbox round trip on venue wifi. Every player is a first-class Supabase user by the second screen.

  • Metro QR on the projector
  • Tap-to-pick zones — indoor GPS lies
  • Instant sessions, no email verify
  • players.id = auth.users.id (XP follows accounts)

[ APPROACH ]

How it came together.

01RESILIENCE

Fallbacks are the primary path, not the exception.

Every AI call has a mirror in seed data. The whole app assumes network flakes and API refusals will happen mid-demo — because they always do — and hides them under a working game. The default state is 'the game is fun'; the exceptional state is 'someone in the room notices something'.

02SECURITY

One server secret, zero keys in the bundle.

The Anthropic key lives in Supabase secrets, not in the app. Edge Functions proxy every AI call — even with the client bundle in hand, you cannot extract the key. RLS on players, quests and submissions keeps the demo from being weaponised by a bored engineer at the venue.

03DELIVERY DISCIPLINE

Everything the demo needs, nothing it doesn't.

No QR-share screen, no password reset flow, no in-app rules doc. The projector holds the QR, resets happen in the dashboard, and the rules are a 3-minute spoken intro. Every polish item was cut against the demo clock — if it didn't make the loop faster or the fallback safer, it didn't ship.

04TESTABLE AI

The parser has its own test file.

Claude's JSON isn't always JSON — sometimes it's fenced, sometimes it's prefaced, sometimes it's technically valid but shaped wrong. The parser layer both edge-fn actions depend on is covered by parse.test.ts under Deno test. The AI can misbehave in known ways and the app still runs.

[ DELIVERY ]

What the build looked like.

questmode.build.log◐ BUILDING…

01

[ TECH STACK ]

What’s under the hood.

TAP FOR ROLE

[ IMPACT ]

What changed.

QuestMode ran the full demo without a single visible error — every attendee got a quest, a verdict and their name on the projector. The resilience patterns proved under live conditions: the Anthropic API dropped once mid-demo and nobody in the room noticed. The patterns generalise: any consumer AI product needs the same discipline — schema-strict outputs, tested parsers, seed-data fallbacks and server-only keys.

[ POWERED BY ]

NEXT.JSREACTTYPESCRIPTTAILWIND CSSSUPABASEPOSTGRESQLVERCELSANITYSHOPIFYWOOCOMMERCESTRIPECLAUDEREACT NATIVEEXPOREMIXGRAPHQLZODTANSTACK QUERYSHADCN/UITHREE.JSDENORESENDLOOPSKLAVIYOPLAYWRIGHTVITESTRECHARTS