Cairn
Tagline: Cairn doesn't tell you not to ski it. It helps you ski it safely.
Demo: [TODO: Render URL or cloudflared link]
Video: [TODO: 2-minute demo]
Repo: [TODO: GitHub link, branch skeleton-map]
Inspiration
Two years ago, a family friend skied off a cliff at Spanky's Ladder at Whistler Blackcomb and broke his jaw in four places. Expert terrain isn't the problem. Surprise is.
Cairn is a voice safety agent for advanced and expert skiers on Spanky's Ladder and the Glacier bowls (Garnet, Ruby, Diamond, Sapphire). It never tries to talk you out of skiing hard lines. It acts like a local who knows where the cliffs are: a short briefing on entry, guidance when your heading points at a hazard, and "Stop now" only when you're inside a cliff zone or within about 15 m.
Silence is a feature. A clean line through a bowl should produce only that entry briefing, then nothing else.
What it does
- Before you ski (slow path): Creao agents build a hazard map from conditions and terrain. Conditions Analyst → Terrain Scout → Route Planner. Incident Responder sits off-chain and only runs after a failed crash check-in.
- While you ski (fast path): GPS replay → smoothing → geofence against the hazard map → Claude coordinator (short 6–10 word lines) → Cartesia Sonic voice → live dashboard.
- Speech levels: briefing (bowl entry, once), guidance (cliff ahead on your heading, names the hazard and safe line), warning ("Stop now").
- Crash check-in: fast run then sudden stop → "Are you okay?" with a 30s countdown. "I'm okay" or resumed skiing cancels. Help or timeout escalates to a simulated patrol console. No real patrol or 911 is ever contacted.
- Demo scenarios: clean Garnet line; drift toward a cliff then recover onto Garnet Bowl Right; GPS jitter that stays silent; crash check-in with skier / patrol views.
How I built it
Stack: FastAPI backend, MapLibre 3D map, Cartesia Sonic 3.6 (WebSocket TTS) + Managed Agent for check-in, Claude for on-slope line wording, Creao agents for the precomputed hazard map, cached hazard_map.cached.json so the demo never waits on agent runs.
Hard rules in code: cliff geofence hits always speak even if a model fails; no agent can remove a zone; Route Planner lines are authoritative for the cliffs they cover; direction words are validated; after a warning, other-cliff guidance is suppressed for 8s (closures/boundary still speak).
Built solo with a team of agents: Maia as founder; Creao agents for the map; our code for Geofence → Coordinator → Voice. The dashboard org chart shows that handoff live.
Challenges I ran into
- GPS noise near cliffs (Garnet Bowl Right is only ~9 m from a hazard). Smoothing and jitter handling mattered more than clever prompts.
- A late sharp turn can skip guidance and go straight to a warning. We documented that instead of pretending it's solved.
- Crash detection from noisy GPS: a perfectly "still" skier still reads several km/h, so thresholds live in config (
STOP_KMH=10) and were tuned on simulated crashes. - Cartesia Managed Agent safety: we fail closed if the agent config can't be read or if transfer/SMS tools are enabled. Check-in tools are allow-listed client functions only.
- Public demo vs live pitch: Render runs with
CAIRN_PUBLIC_DEMO=1and no credit-burning keys; Sonic + live check-in stay on localhost/tunnel for judging.
Accomplishments that I'm proud of
- A working end-to-end voice demo on real Whistler geometry (19 hazard zones, 7 safe lines, replay scenarios).
- 20/20 silent jitter variants near a cliff, with ignored fixes visible on the map.
- Live Cartesia check-in session that trusts the agent, speaks the ask, and cancels cleanly on "I'm okay".
- An agent org chart judges can see: Creao (purple) and our code (teal), lighting up as work happens.
- Keeping the product honest: simulated patrol only, avalanche rating left "not available" when we don't have it, no invented directions.
What I learned
- For safety voice UX, what you don't say is as important as what you do.
- Agent chains are great for slow, expensive context (the hazard map). The hot path has to be deterministic geofence + a tiny language model with a strict budget.
- "It works in the Playground" is not the same as "the WebSocket bridge trusts the agent." Version/config URLs and tool allow-lists are part of the product.
- Demo reliability beats geometric perfection (scenario 2 ends ~4 m short of an exit tip on purpose so cliff guidance doesn't false-fire).
What's next
- Microphone audio so the Managed Agent can call
skier_ok/request_helpitself. - Per-session check-in state for concurrent public visitors.
- Closed-run reroute scenario.
- Resort pilot: patrol console for real staff, with human confirmation before any live dispatch.
- Eventually: glasses / on-body audio so you're not looking at a phone in a bowl.
Tracks
- Creao / Best One Person Company: one founder + agent org chart; Creao agents produce the hazard map the product depends on. Closing line: Remove the agents, and Cairn has no hazard map, so it can't warn anyone.
- Anthropic: narrow community (expert Whistler skiers on named terrain), real injury-motivated problem, working demo, Claude used carefully with validation and fallbacks where it can go wrong.
- Cartesia: voice is the product surface (briefing / guidance / warning + crash check-in). Sonic for on-slope lines; Managed Agent for check-in; browser speech fallback; known limitations documented in the README.
Try it
- Open this link: https://cairn-nvjo.onrender.com/
- Tap once to enable sound.
- Run Scenario 2 for the cliff story, then Scenario 4 and switch to Patrol view after escalate.
Local full voice (Sonic + optional live check-in): see README. Start with
.venv/bin/uvicorn main:app --app-dir backend --port 8000
Built With
- anthropic-claude
- cartesia-managed-agents
- cartesia-sonic-3.6
- creao-agents
- fastapi
- geojson-/-osm-derived-hazard-zones
- maplibre
- python
- render
- sse-replay