This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
A useful detail about a neighbourhood can be surprisingly hard to find. Does that entrance have steps? Is there a place to sit? Is the water point actually working?
I built Outside15, a short outdoor break with an optional small contribution. You choose five, fifteen, or thirty minutes, take a look at one amenity, and put the phone away. When you return, a sentence becomes a dated observation that you review before saving.
The purpose is simple: a short break for you, a useful detail for someone else.
You can walk, roll, pause outdoors, or contribute from a place you already visit. There is no leaderboard and no penalty for taking a break without a mission.
I deliberately made the useful observation the main feature. A route is only a way to get there.
Demo
Click here to watch the walkthrough and see the screenshots
Code
Outside15
A little outside. A little good.
A short outdoor break that leaves your neighbourhood a little better. Choose 5, 15, or 30 minutes, notice one optional amenity, put the phone away, and return with a sentence. An open-weight model organizes that observation; a person checks it before saving.
Started during the October 5–11, 2026 Hacktoberfest Week 1 challenge window. October 12, before the 12:29 p.m. IST deadline: added Gemma/Mastra integration, model evaluation, and GitHub Actions/Pages support. Any later commits must be dated and described here.
Local edition
Requirements: Python 3.10+, Node.js 22.22+ (recommended for the dependency tree), npm, and a modern browser. Python uses only its standard library. For AI, install Ollama and download a model separately.
npm.cmd ci
ollama pull gemma3:4b
python server.py
Open http://127.0.0.1:5173. Ollama normally runs on port 11434. If it is not running, start ollama serve in another terminal. Manual entry still works without…
How I Built It
The AI task is intentionally small: turn a brief observation into structured information, not a conversation.
The frontend uses HTML, CSS, and JavaScript. A Python standard-library server invokes a Mastra workflow and observation agent, which runs Gemma 3 4B locally through Ollama and requests schema-constrained JSON. There is no paid model API key. The output includes amenity type, reported usability, observed steps, shade, a short summary, and a quote from the original observation.
An example input is:
The east entrance has no steps and the gate is open. The path is clear, but there is no shade.
The model organizes that into an open entrance, no steps observed, and no shade observed. The person then checks it. The interface says “no steps observed” rather than declaring the place accessible.
The small-model experiment was useful precisely because it failed. Gemma 3 1B passed only 3 of 8 focused cases in the first integration: it misread “no steps,” and several drafts failed the exact-quote check. I kept that run in the repository rather than replacing it with a success story. The validator also keeps steps and shade unknown when the original sentence never mentions those topics.
The current Gemma 3 4B extractor passed 8 of 8 focused cases. Results are preserved in artifacts/evaluation.json, including every input, output, failure, and timing. The earlier Llama baseline and failed Gemma 1B run remain alongside it. These eight English cases are focused regression evidence, not a general accuracy benchmark. The larger model has a larger download and a noticeable cold start; the seven warm evaluation cases took roughly six to eight seconds on this machine.
Mastra gives the failure path a clear boundary. The extract-and-ground step runs the local agent and shared validator; a rejected draft gets one retry. The prepare-human-review step returns a draft and its attempt count. A controlled recovery demonstration injects a fabricated quote, rejects it, then performs genuine local inference. Repeated failure sends the person to manual entry.
No observation is saved during inference. Saving requires a human confirmation. Confirmed records stay in browser storage and, in the local edition, a local SQLite backup. A JSON export is the deliberate sharing step.
A recent blocked-footpath observation changes the longer demo suggestion. That is the feedback loop I care about: a small contribution should make the next outing more informed.
Why Does Open Innovation Matter?
Local open-weight inference changes the boundary of the product. A participant can organize their words on a computer they control, inspect the prompt and schema, or substitute a model. After installing the runtime and weights, inference needs no external internet connection or paid API account.
I can also preserve a real inference trace and test failures directly. That made it practical to narrow the AI’s job and build human review around its limits.
The application code is MIT-licensed. Gemma is open-weight under Google’s separate Gemma Terms of Use. Mastra is an open-source framework, and model weights are downloaded separately. Earlier Llama artifacts retain their attribution: Built with Llama, under Meta’s Community License. The repository also credits Ollama, Playwright, and the bundled open fonts.
Prize Categories
Overall prize — Touch Grass. Outside15 uses local open-weight AI to turn a short outdoor break into a human-confirmed neighbourhood observation, with the useful contribution at the center of the experience.
Best Use of Mastra. A local Mastra agent and workflow handle extraction, evidence checks, one bounded retry, and preparation for human review. The recovery evidence shows an injected invalid draft being rejected before genuine inference returns a reviewable result. The workflow never saves the observation.
Best Use of Gemma. Gemma 3 4B powers the central observation-to-structured-draft experience on my own computer. The repository preserves the real inference trace and both successful and failed regression runs; the static showcase labels replay as replay.
What I Learned, and What Comes Next
The important uncertainty is often the useful part. “I couldn’t tell whether the tap works” should not become “working.” A person seeing “unknown” can decide to check it next time.
This is a focused pilot. The map and route distances are illustrative; observations are not a public feed, an accessibility certification, or municipal reports. A public community layer needs real place identities, moderation, conflicting observations, consent, and field work with the people it aims to help.





Top comments (0)