For judges · one page
Loci turns a photo of your own room into a memory palace for a list you must learn in order, then lights each stop back up as you say the list in the dark.
The path to click, receipts from a real run on the live site, how to reproduce them, and what Loci doesn't claim. Every number on this page links to where it came from.
The 30-second path
No sign-up, no key, nothing to install. Any browser; a phone works.
- 1
The home screen shows the method on a real room.
- 2
Tap “Try it: 12 cranial nerves”
A palace made in advance in an AI-generated student room opens at stop 1. No AI call, so no wait.
- 3
Tap “Next stop” a few times
Each stop is a real object in the photo, with a strange scene for its item.
- 4
Tap “Lights out” (the moon) and type what you remember
A right answer turns its stop green and lights that part of the room.
occulomotor
counts for Oculomotor;Optic
at stop 5 stays dark. Read the result, then retry the misses
First-try score, learning time and recall time. Every stop green brings the whole room back.
The 12 answers, in order
Olfactory · Optic · Oculomotor · Trochlear · Trigeminal · Abducens · Facial · Vestibulocochlear (or “auditory”) · Glossopharyngeal · Vagus · Accessory · Hypoglossal
Stop 1 · Receipts
A real run on the live site, with nothing stubbed.
On 2026-10-04, 19:44–19:47 UTC, scripts/receipt.mjs built 9 palaces on devpost-learn-loci.vercel.app the way a person does: the three AI-generated example rooms, each uploaded as if it were your own photo, times the three example lists. The browser shrank each photo, the server called the real models, and the clock ran from “Build my palace” to the first scene.
Cost of the whole run: $0.1151 at list prices. DeepSeek, which wrote the scenes, bills that rate: $0.0115. The Gemini part, $0.1036 at paid rates, ran on a free-tier key and was not billed. The answers report the tokens each model used, and the script prices them at the rates published on 2026-10-05.
| Room × list | Objects found | Stops | Scenes | Wait | List price |
|---|---|---|---|---|---|
| Student room12 cranial nerves | 16 · gemini-3.5-flash | 12 | 12/12 spell their item · deepseek-flash | 28.00 s | $0.0230 |
| Student roomFirst 12 elements | 16 · gemini-3.8-flash | 12 | 12/12 spell their item · deepseek-flash | 14.43 s | $0.0076 |
| Student roomGrocery run | 16 · gemini-3.8-flash | 10 | 10/10 spell their item · deepseek-flash | 13.94 s | $0.0077 |
| Studio flat12 cranial nerves | 16 · gemini-3.1-flash-lite | 12 | 12/12 spell their item · deepseek-flash | 17.97 s | $0.0029 |
| Studio flatFirst 12 elements | 16 · gemini-3.5-flash | 12 | 12/12 spell their item · deepseek-flash | 16.95 s | $0.0236 |
| Studio flatGrocery run | 16 · gemini-3.5-flash | 10 | 10/10 spell their item · deepseek-flash | 13.43 s | $0.0247 |
| Kitchen12 cranial nerves | 16 · gemini-3.1-flash-lite | 12 | 12/12 spell their item · deepseek-flash | 13.92 s | $0.0027 |
| KitchenFirst 12 elements | 16 · gemini-3.1-flash-lite | 12 | 12/12 spell their item · deepseek-flash | 30.02 s | $0.0030 |
| KitchenGrocery run | 14 · gemini-3.5-flash | 10 | 10/10 spell their item · deepseek-flash | 14.45 s | $0.0199 |
- 102unit tests: the checker, route, voice, storage, the model ladder and the bugs we fixed
- 60,000generated answers per run: no wrong one ever turns a stop green
- 29browser checks on the production build, the AI stubbed
- 7live checks with the real AI, also run on the live site
Stop 2 · Reproduce
Run it yourself. The real path needs no key.
The receipt runs against the live site, so the server's own keys do the AI calls. The tests are a separate, deterministic replay: they stub the AI and never stand in for the product.
The real runlive AI
git clone https://github.com/edycutjong/loci && cd loci
npm ci && npx playwright install chromium
# 9 palaces on the live site → public/judge/receipt-<date>.json
npm run receipt
About 3 minutes. Prints one line per palace and the totals. BASE_URL=http://localhost:5174 points it at your own dev server and keys.
The testsAI stubbed
# 102 unit tests and 60,000 generated answers, no network
npm test
# 29 browser checks; the AI helpers and the microphone stubbed
npm run e2e
The same commands CI runs on every push, plus tsc and the production build.
One call, with curl and jqlive AI
curl -s https://loci.edycu.dev/rooms/kos.jpg | base64 | tr -d '\n' | jq -Rs '{image: .}' \
| curl -s https://loci.edycu.dev/api/anchors -H 'Content-Type: application/json' -d @- \
| jq '{model, ms, tried, usage, objects: [.anchors[].label]}'
The student room's photo, straight to the object finder: which model answered, how long it took, which models it passed over and why, the tokens it used, and the objects it found.
Stop 3 · Honest limits
What Loci doesn't claim.
Recall in one sitting, nothing more
Loci shows a first-try score, learning time and recall time. It makes no claim about next week and has no spaced repetition.
The receipt's rooms are AI-generated
Real rooms are messier. When free-tier Gemini quotas run out, objects come from gemini-3.1-flash-lite, which draws looser boxes.
Voice is Chrome and Edge only
It uses the browser's own speech recognition. Automated Chrome can't open a microphone, so voice is tested with a stand-in recognizer; typing works everywhere.
Your photo goes to an AI once
Gemini, or DeepSeek if Gemini is busy, sees it to find objects; the server keeps nothing. A free-tier Gemini key lets Google use what it receives, so leave people and papers out.
Stop 4 · Links
Everything in one place.
- The app
- loci.edycu.dev
- The video
- youtu.be/I5sx5C28xR0 · 2:30
- The story and the deck
- Story page · Pitch deck
- The code
- github.com/edycutjong/loci · MIT
- The event
- Build With AI: Basics · Devpost Learn