{"slug": "your-next-ai-chat-is-earned-outside", "title": "Your Next AI Chat Is Earned Outside", "summary": "A developer built Touch Grass, an open-source Android app that gates a locally running Qwen2.5-0.5B-Instruct AI companion behind tokens earned by walking and completing outdoor missions. The app runs fully offline via llama.rn and llama.cpp, caches OpenStreetMap data through the Overpass API for mission generation, and benchmarks four inference threads at 37.8 tokens/sec on a 64-token completion. The developer disabled AI-generated mission text after the model fabricated details, switching to map-data templates with a grounding check for LEARN missions.", "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 didn't want to build another app that simply tells people to go outside. I wanted to try something different: make the AI itself the reward.\n\nTouch Grass is an Android app where you earn tokens by walking and completing outdoor missions. Those tokens unlock a small AI companion that runs locally on your phone. When your balance reaches zero, you need to get back outside and complete more activities to earn tokens.\n\nEach day, the app gives you different ways to get outside:\n\nWalking also earns 100 tokens for every 250 metres, up to 5 km per day. The app tracks progress through its history screen, daily streaks, and badges.\n\nThe idea is simple: give people a reason to use their phones for something useful, then encourage them to put the phone away and explore the world around them.\n\n**Video walkthrough:** The video will show the initial setup, airplane mode, the locked AI chat, outdoor missions, and the AI companion working after earning tokens.\n\n**Try it:** [Download the Android APK](https://github.com/neoquantx/Touch_Grass/releases/latest/download/app-release.apk).\n\nThe app requires an Android ARM64 device. The first setup downloads the AI model, approximately 470 MB, and nearby map data, so Wi-Fi is recommended. This testing build is signed with a debug key.\n\n**Stop doomscrolling. Touch actual grass. Earn free on-device AI tokens.**\n\nA 100% offline, privacy-first mobile exploration game that trades physical footsteps for local AI compute.\n\nHere is what **Touch Grass** looks like in action:\n\n| 1. Setup & Model Download | 2. Daily Quests ( `Today` ) | 3. Offline AI ( `Companion` ) | 4. Field Journal | 5. Stats & Badges ( `History` ) | \n|---|---|---|---|---|\n| *One-time Wi-Fi model grab & OSM area cache* | *GO / LOOK / LEARN daily quest cards* | *Private Qwen 0.5B LLM — 1 token per token* | *Scrapbook with geotags & proof photos* | *14-day activity chart & 9 Grass Badges* | \n\nThe source code is available on GitHub under the MIT License. The README includes the setup and build instructions.\n\nThe project also includes checks that can be run with Node.js. For example, `node scripts/check_missions.js`. The full set of checks is listed in `package.json`.\n\n**The model.** I built the app with React Native and Expo using JavaScript. The AI runs locally on the phone through `llama.rn`, which connects React Native to `llama.cpp`. The model is Qwen2.5-0.5B-Instruct, quantized as a Q4_K_M GGUF file of approximately 470 MB.\n\nI benchmarked different thread counts on a release build using a 64-token completion:\n\n| Threads | Tokens/sec | \n|---|---|\n| 2 | 21.6 | \n| 3 | 30.0 | \n| 4 | 37.8 | \n| 5 | 22.7 | \n| 6 | 26.8 | \n\nFour threads gave the best result in my test. Six threads were actually slower than three, which surprised me.\n\n**The map.** During setup, the app retrieves nearby OpenStreetMap data through the Overpass API and caches the results for an area within 1 km. Missions are generated from the cached map data using ordinary code, rather than asking the AI to choose places.\n\nI initially experimented with AI-generated mission descriptions. The model sometimes invented details, such as calling an ordinary park a \"tree sanctuary\" or making up distances. I turned off that feature and switched to templates based on the available map data.\n\n**Where the model is used.** The AI powers the Companion chat and helps summarise information for LEARN missions. For LEARN, the model receives the place's OpenStreetMap tags. A basic grounding check rejects certain unsupported numerical or historical claims and falls back to the raw tags when the check fails. It is not a guarantee that every answer is correct, and Companion chat is not checked by this validator.\n\n**Checks.** The app validates GPS accuracy and distance from a mission target, and rejects mock locations. Walk tracking filters inaccurate GPS fixes, tiny movements, and speeds above approximately 15 km/h to reduce GPS errors and obvious attempts to earn tokens from vehicle travel.\n\nWhen a photo includes an EXIF capture timestamp, the app checks that it is not older than ten minutes. The app does not identify the objects in photos. It can warn when a photo appears very dark based on its exposure metadata.\n\nI also learned that file size alone is not a reliable way to detect a covered camera lens. A nearly black photo can still be a full-size image, so I added a check based on EXIF information such as ISO and exposure time.\n\nRunning an open-weight model directly on the phone made this idea possible without sending every chat message to a cloud AI service. The token system, mission rewards, and chat lock are implemented in the app itself.\n\nA few things mattered to me:\n\nThe trade-off is response quality. A small 0.5B model can give short answers and sometimes get things wrong. For an app intended to encourage time away from the screen, I wanted to explore whether a small local model could still make the experience useful.", "url": "https://wpnews.pro/news/your-next-ai-chat-is-earned-outside", "canonical_source": "https://dev.to/himanshu_1817/your-next-ai-chat-is-earned-outside-3nhb", "published_at": "2026-10-11 21:30:46+00:00", "updated_at": "2026-10-11 21:33:50.755750+00:00", "lang": "en", "topics": ["ai-products", "large-language-models", "ai-tools", "ai-agents"], "entities": ["Touch Grass", "Qwen2.5-0.5B-Instruct", "llama.rn", "llama.cpp", "OpenStreetMap", "Overpass API", "React Native", "Expo"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/your-next-ai-chat-is-earned-outside", "markdown": "https://wpnews.pro/news/your-next-ai-chat-is-earned-outside.md", "text": "https://wpnews.pro/news/your-next-ai-chat-is-earned-outside.txt", "jsonld": "https://wpnews.pro/news/your-next-ai-chat-is-earned-outside.jsonld"}}