DEV Community

Wal
Wal

Posted on

roamshot: photo side quests for walks, with open models running on the phone

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.

walk setup: pick a preset or type your own walk

the quest board with generated side quests

the capture viewfinder

the polaroid gallery

stats: streak, points and the model downloads

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
Walk Setup Quest Board Capture Viewfinder Polaroid Gallery Stats & Credits
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)