This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
roamshot is an Android app for walks with something to look for. you pick a walk (a park, your neighborhood, a forest trail, or whatever you type in) and it hands you 3 to 5 photo side quests. each one has an objective and a difficulty. you go find something that fits, take the photo, and a small vision model checks whether it matches. if it misses you can retry or skip.
completed photos go into a gallery of instant-photo frames. a quest is worth 10, 20 or 30 points depending on difficulty, plus 5 for getting it on the first try, and one verified quest a day keeps your streak alive.
the point is that the phone is only there to give you a reason to look up. the quests point you at things in the world, and the answer is outside. there are no accounts, no backend, no social feed and no maps. it's for anyone who walks anyway and wants to pay a bit more attention.
quests are not allowed to ask for photos of people or faces, trespassing, private property, roads or traffic, unsafe night activities, or purchases. night walks, yes. horror-movie decisions, no.
Demo
no video demo.
i ran the whole thing on a low end budget phone, the worst one i have, on purpose. i also tested it offline, and the models downloaded and loaded on it, so the quests were generated by Qwen and not pulled from the built-in pool.
Code
Polaroam πΈ
An indie Android walking game with on-device AI side quests and instant photo checks.
Crafted with β€οΈ by @walsoup β’ Version 1.0.0
Polaroam turns everyday walks into retro photo scavenger hunts. Pick a walk style (or type your own), get creative on-device AI side quests, snap what you find through a pixel viewfinder, and pin your developed Polaroids to your corkboard gallery.
π± Screenshots
| Walk Setup | Quest Board | Camera Viewfinder | Polaroid Gallery | Stats & AI Config |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
| Pick presets or custom walks | AI-generated side quests | Viewfinder with pixel reticle | Corkboard with Polaroids | Streak, score & @walsoup credits |
β¨ Features
- πΆ Curated & Custom Walks: Choose from 7 themed presets (Neighborhood, City park, Forest trail, Coastal walk, Rainy stroll, Mountain trail, Night walk) or type whatever walk you're taking.
- π― On-Device AI Quests: Generates 3β5 tailored photo objectives per walk with difficulty tiers (1β3 pips) andβ¦
Kotlin, Jetpack Compose, CameraX, Room, Hilt. the code lives in the repo under the package app.polaroam, which is the name the app had before it was roamshot.
How I Built It
every AI piece is an open model and runs on the phone.
| job | model | runtime |
|---|---|---|
| writing quests | Qwen3-0.6B (Apache-2.0) | LiteRT-LM (Apache-2.0) |
| checking photos | CLIP ViT-B/32 (MIT), int8 ONNX export | ONNX Runtime (MIT) |
quests. Qwen3-0.6B gets a system prompt and a walk type and writes the quests as JSON. the output goes through a parser and a safety filter. if it fails, the app retries once, and if that fails too it falls back to a built-in pool of canned quests, so a walk never starts with an empty board. there's also a smaller option, SmolLM2-360M, if the phone struggles with Qwen.
photo check. CLIP runs zero-shot. a script (tools/clip/build_label_embeddings.py) precomputes a text embedding for every label the quests can use, plus a few distractors like person, car and food, so an off-target photo has somewhere to land. on the phone, only CLIP's image encoder runs. a photo counts as a match when the quest's target labels together reach 20% and beat every other single label. that second rule is what stops a sandwich passing as a mushroom.
models are not in the APK. the Stats screen downloads both on Wi-Fi, about 700 MB with the default pair. the downloads are pinned to a specific Hugging Face commit and checked with sha256. until they're there, quests come from the built-in pool and photos can't be checked.
swapping models. the generator and the verifier are two interfaces (QuestGenerator, PhotoVerifier), and the choice of implementation lives in one file, di/AiModule.kt. you can point local.properties at a different .litertlm or ONNX file and rebuild. a different CLIP needs its own label embeddings.
Why Does Open Innovation Matter?
- photos stay on the phone. the thing being sent to a model is a picture of wherever you are. with CLIP running locally, nothing you photograph leaves the device.
- it works with no signal. after the one-time download, a walk needs no connection, and i tested it offline. trails are where signal is bad.
- it costs nothing to run. there's no API bill, so no backend, no accounts and no limit on how many quests anyone generates.
- I could swap models. the first plan was different (I looked at Gemma through LiteRT, which was slow to load on my phone, and at Moondream2). because the weights are open and the runtimes are open, trying Qwen3 and CLIP instead was a change to a config and a few classes, not a new vendor.
the tradeoff is honest: a 0.6B model writes plainer quests than a hosted one would, and CLIP zero-shot gets some photos wrong. that is the price of running on a phone, and for a "go look at a tree" app I think it's fine.










Top comments (0)