DEV Community

Dmytro Voytko
Dmytro Voytko

Posted on

🧭 StrideHunter: transform daily walks and runs into quests

Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass Submission 🌿

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass

What I Built

StrideHunter is a free, open, install-free scavenger hunt PWA. An organizer (parent, teacher, team lead β€” or just you, for yourself) describes a place, picks walk/run, effort level, and quiz count, and gets a complete outdoor quest: point-tiered missions (50/150/300), POI quiz stops with typo-tolerant answers, a 500-pt golden finale, countdown with speed bonus. Players scan one QR code β€” no account, no app install β€” and go outside to play it.

It's for three cravings I kept seeing:

  • desk workers who sit all week and need a reason to move,
  • hosts who want to take a crew outside without planning for hours, and
  • teen squads who'll go anywhere if it's a game.

The phone becomes a compass, not a couch: missions only resolve out there β€” photos at viewpoints, quiz answers in front of statues, GPS check-ins at bonus stops.

Features

  • Choose your effort: Chill / Normal / Beast, plus walk / run modes and time-of-day adaptation
  • AI quest generation (BYOK OpenRouter or local Ollama): point tiers 50/150/300/500, golden mission, POI quiz stops with lenient typo-tolerant answers
  • Outdoor-proof play: GPS β€œyou’re close” hints with honor fallback, countdown + speed bonus, offline PWA after first load
  • Honest sharing: the link carries the whole quest (capped, trimmed, QR-friendly); draft β†’ edit gate β†’ publish flow
  • Privacy-first: no accounts, no analytics; hunt data lives in the link, API keys stay in your browser (session-only unless you opt in)

Demo

Generate Dark theme, mobile
Generate tab with a filled quest form Share tab with QR stage and draft tag

Live demo: StrideHunter app is deployed via GitHub Pages.

Try the zero-setup demo hunt first β€” no key needed - just scroll to the bottom and click "Try demo instead" button.

Code

GitHub repo: 🧭 StrideHunter

index.html        tabs (Generate / Share / Play) + settings drawer
css/style.css     theme vars, dark mode, 44px touch targets
js/app.js         everything (~1200 lines, plain scripts, zero build)
js/prompts.js     prompt templates (effort/quiz/weather/fallback branches)
sw.js             offline PWA (dev default OFF)
Enter fullscreen mode Exit fullscreen mode

The core trick is the share link β€” the entire quest lives in the URL hash, so there's no backend to run.

And the AI output is never trusted blindly: JSON is extracted from plain model text, validated, organizer-approved in a preview gate β€” plus an unverified flag (gated in code, so models can't self-apply it) marks anything the AI guessed while map data was down.

How I Built It

  • Open-weight models, BYOK style: generation runs on open models ( google/gemma-4-31b-it, or free Nemotron) through OpenRouter with your own free key β€” or fully local via Ollama. Deliberately no structured-outputs requirement: the app parses JSON out of plain text, so any instruction-following model works, free or paid.
  • Zero-build vanilla JS on free static hosting (GitHub Pages): no framework, no bundler, no server. If it can't be served from a static folder, it doesn't ship.
  • Open data instead of a POI vendor: OpenStreetMap (Overpass/Nominatim) + Open-Meteo, with endpoint fallbacks, caching, and request politeness baked in after real-world 504s taught us respect.
  • Open libraries, vendored: QR encoder, confetti β€” pinned locally, working offline.
  • Open process: prompt templates live in the repo, no telemetry, tracking, etc.

Why Does Open Innovation Matter?

Honestly? This project exists because everything was open.

  • No budget meant no POI vendor β€” OSM's free data plus three public mirrors (with fallbacks I only needed because they were transparent about their limits) replaced a contract.
  • No AI budget meant BYOK open-weights instead of a platform lock-in β€” and designing for β€œany model that emits JSON” made the app more robust than a single-model integration would be.
  • No backend budget meant inventing the self-contained share link, which turned into the best feature: private-by-architecture (your hunt never touches my server, because there isn't one), offline-capable, and forkable by anyone β€” clone the repo, serve the folder, run the demo with zero keys.

Openness wasn't the theme of this build. It was the building material.

Top comments (0)