{"slug": "touchgrass-ai-i-built-an-outdoor-quest-app-with-ollama-and-local-first-storage", "title": "TouchGrass AI: I built an outdoor quest app with Ollama and local-first storage", "summary": "A developer built TouchGrass AI, an open-source outdoor quest app that uses a locally run Ollama model to generate short activity prompts and stores quests, progress, and photo evidence in the browser via IndexedDB. The app sends only activity, duration, and difficulty to a same-origin server route that requests structured JSON from Ollama, validates it against quest rules, and falls back to a pre-made quest when generation fails or is unusable. Photos are kept as local blobs and never uploaded, and the app shell loads offline once visited.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass](https://dev.to/challenges/hacktoberfest-week1-2026-10-05)*\n\nI built **TouchGrass AI**, a small outdoor quest companion. You choose how much time you have, what kind of outing sounds good, and how much effort you want. It makes a short quest, then the app gets out of the way so you can go do it.\n\nThe latest test was on my phone: I generated a quest, took a photo for one of its tasks, and the photo stayed available with the saved quest.\n\n**Project:** [TouchGrass AI on GitHub](https://github.com/Shashank0701-byte/TouchGrass)\n\nA quest is a handful of simple prompts for a walk, exploring a familiar area, noticing nature, or taking a photo walk. Tasks can ask for photo evidence. If they do, the task stays incomplete until a photo is saved.\n\nThe app keeps quests, progress, and photo evidence in the browser on that device. Photos are stored as blobs in IndexedDB, can be previewed or removed, and never go into the service worker cache. The app shell can load offline after it has been visited, and a saved quest can go with you when the signal does not.\n\nThe UI sends the selected activity, duration, and difficulty to a same-origin server route. That route asks Ollama for structured JSON, then validates the response against the quest rules before showing it. If generation is unavailable or the response is not usable, the route returns a ready-made quest instead.\n\nFor local development I run Ollama on my computer. For the hosted demo I configured Ollama's API with a Gemma model. The API key stays in the server environment; it is not included in browser code.\n\nThe browser stores the quest and its photos locally. In hosted mode, quest-generation settings and the prompt go to Ollama to produce the quest. The app does not ask for or send a location, and the photo evidence is not uploaded.\n\nI wanted the AI to help create a personal plan, not become the activity itself. Open models let me keep local inference as a real option, change the model, and inspect the boundary between generation and the rest of the app. The hosted API makes the demo accessible without requiring each visitor to install a model, while the offline part of the experience stays useful after a quest is saved.\n\nThat trade-off is deliberate: generation needs a connection in the hosted setup, but the walk, saved tasks, progress, and photo evidence do not depend on a live AI request. A model can suggest the next small thing to notice; it should not need a permanent place in the user's pocket once the walk starts.\n\nThe most important boundary was deciding what belongs on the server and what belongs on the phone. The server needs only the choices required to generate a quest. The browser owns the saved quest and evidence. Keeping those responsibilities separate made offline use and photo privacy easier to reason about.\n\nI also learned that “works on my laptop” is not the finish line for a camera feature. Testing the deployed app on a phone made the whole loop real: take or choose a photo, save it, see it attached to the task, and continue the quest.\n\nA lightly edited transcript of the build: practical decisions, one missing persistence bug, and the moment the quests briefly achieved enlightenment by vanishing into tranquility.\n\nIf you'd like to run it locally, clone the repository, install Ollama and the configured model, then follow the README setup steps.", "url": "https://wpnews.pro/news/touchgrass-ai-i-built-an-outdoor-quest-app-with-ollama-and-local-first-storage", "canonical_source": "https://dev.to/shashank_chakraborty_6362/touchgrass-ai-i-built-an-outdoor-quest-app-with-ollama-and-local-first-storage-2c4i", "published_at": "2026-10-06 21:32:15+00:00", "updated_at": "2026-10-06 21:47:55.724000+00:00", "lang": "en", "topics": ["ai-tools", "large-language-models", "ai-products"], "entities": ["TouchGrass AI", "Ollama", "Gemma", "IndexedDB", "GitHub", "Hacktoberfest"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/touchgrass-ai-i-built-an-outdoor-quest-app-with-ollama-and-local-first-storage", "markdown": "https://wpnews.pro/news/touchgrass-ai-i-built-an-outdoor-quest-app-with-ollama-and-local-first-storage.md", "text": "https://wpnews.pro/news/touchgrass-ai-i-built-an-outdoor-quest-app-with-ollama-and-local-first-storage.txt", "jsonld": "https://wpnews.pro/news/touchgrass-ai-i-built-an-outdoor-quest-app-with-ollama-and-local-first-storage.jsonld"}}