What I Built
Phone Jail is a web app that locks you out for 15, 30 or 60 minutes with one job: go outside and do a quest. An open-weight Llama model writes a quest, ElevenLabs reads it aloud, and the cell screen shows it with a countdown. When time is up you take one photo, Llama checks it, and the bars slide open.
It's for anyone who says "I'll go for a walk" and then doesn't. The quests are small and work anywhere, like finding the longest shadow or a plant older than you.
Demo
https://phonejail.festachq.workers.dev.
Code
https://github.com/festac-dev/phone_jail. It's three files: index.html, worker.js and a README. No build step.
How I Built It
The browser talks to a Cloudflare Worker, which calls Llama 4 Scout 17B on Workers AI and ElevenLabs. The same open model does both jobs: it writes the quest from your approximate location and the weather, then looks at your photo and says whether it plausibly proves the quest. The worker holds the keys, so nothing secret reaches the browser.
What went wrong, and what I changed:
Gemma 4 was too slow here. It's a reasoning model, and its thinking ate the token limit before it wrote the JSON, so I moved to Llama.
The AI has no map. It sent me to a park with a pond, and there's no park or pond within 4 miles of me. It also wanted me to hop around the pond on one foot. Now the prompt requires quests built from things found anywhere (sky, ground, plants, light, shadows) and bans named places, climbing, water edges and traffic.
Free tiers are fragile. Free OpenRouter models rotated out or got rate-limited, and a free ElevenLabs account can't use library voices through the API. I settled on Workers AI and a voice my plan allows.
A web page can't really lock a phone. So there are two modes: Honor mode, and Real lock, which walks you through your phone's own pinning feature (Guided Access or App pinning) before it starts.
My outing: [What quest you got, where you went, what happened, whether the photo passed, and anything that broke. Be honest about the funny and awkward parts.]
Why Does Open Innovation Matter?
Open weights let me swap the model by changing one string, and the same code could run on a self-hosted vLLM or Ollama setup. When one provider's free model disappeared, nothing else had to change. A closed vision API would have tied the quest writer and the photo judge to one vendor's pricing and rules. I also found the model's flaws by reading its output, and fixed them in the prompt.
My Agent Session
curl -s https://festac.festachq.workers.dev/quest \
-H 'Origin: http://localhost:8080' -H 'Content-Type: application/json' \
-d '{"lat":40.7,"lng":-74.0,"weather":"clear, 18C","duration":15}' | head -c 400
{"quest":{"title":"Urban Oasis","instruction":"Find a spot with a great view, climb up and sit on a low wall or ledge with your feet dangling, and strike a relaxed pose.","proof_hint":"Your feet dangling over the edge"},"audio_base64":"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjYwLjE2LjEwMQAAAAAAAAAAAAAA//uQwAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAEJAAGySAADBggLDhATFhgaHR8iJScqLS8yNDY5Oz5BQ0ZJS01QUlVYWl1gYmVn
Best Use of ElevenLabs: every quest is spoken aloud with ElevenLabs. If the voice fails, the browser's built-in speech takes over.
Top comments (0)