🌿 TrailMates: Less Scrolling, More Wandering | Open-Weight AI for Touching Grass A developer built TrailMates, an open-source outdoor activity planner that uses the open-weight Qwen2.5-7B-Instruct model via Hugging Face Inference Providers to generate personalized screen-free adventure plans. The FastAPI app validates the model's JSON output before labeling a plan AI-generated and falls back to a clearly labeled rule-based plan when inference is unavailable, with optional TabPFN suitability scoring, ElevenLabs audio briefings, and SerpApi park lookups. This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass https://dev.to/challenges/hacktoberfest-week1-2026-10-05 . What if AI didn't try to keep you on your screen, but helped you step away from it? TrailMates is an open-source outdoor adventure companion that turns spare time into small, screen-free adventures. Ever wanted to go outside but had absolutely no idea what to do? TrailMates helps you get started. Choose your available time, energy level, preferred setting, and interests. The app generates a personalized outdoor plan with practical activity steps, items to bring, safety reminders, a phone-free challenge, and a reflection question for afterward. Maybe you have 30 minutes and low energy. Maybe you want to explore a nearby park, notice birds, photograph tiny details, or simply take a mindful walk. You don't need a complicated itinerary. Sometimes, you just need a little nudge. I designed TrailMates to feel like a playful nature journal, with earthy colors, hand-drawn doodles, and a friendly interface that makes going outside feel inviting. The real goal? Make the app feel useful enough that you can put your phone away and enjoy the adventure. 🌱 🌿 Live app: https://trailmates-89sz.onrender.com/ https://trailmates-89sz.onrender.com/ 🔍 Health check: https://trailmates-89sz.onrender.com/health https://trailmates-89sz.onrender.com/health 📊 AI status: https://trailmates-89sz.onrender.com/api/status https://trailmates-89sz.onrender.com/api/status The application is hosted on Render, with a Python FastAPI backend. The AI experience depends on the configured model and inference provider. If inference is unavailable, the app can fall back to a clearly labeled rule-based demo plan rather than pretending that a model generated it. Note: The first request may take longer if the hosted service has been idle. 💻 GitHub repository: https://github.com/riyanshika7/TRAILMATES https://github.com/riyanshika7/TRAILMATES The project uses a lightweight architecture built around HTML, CSS, JavaScript, and Python FastAPI. Some key files: app/services/hf service.py static/index.html static/app.js render.yaml tests/test api.py Open-weight model — Hugging Face Inference Providers The core AI is Qwen/Qwen2.5-7B-Instruct, one of the models recommended on the HF Inference Providers documentation. It is called via the official OpenAI-compatible router endpoint: POST https://router.huggingface.co/v1/chat/completions https://router.huggingface.co/v1/chat/completions Authorization: Bearer $HF TOKEN The system prompt instructs the model to return a strict JSON schema title, steps, items to bring, safety tips, phone free challenge, reflection question . The extract ai result method in hf service.py validates the response — checking that choices 0 .message.content is non-empty, ≥80 chars, parses as JSON, and contains title and steps — before setting is ai generated: true. A rule-based fallback runs if any of those checks fail and is always clearly labelled. TabPFN Prior Labs The tabpfn package is in requirements.txt. When it loads on Render, the suitability scorer is labelled "TabPFN Prior Labs tabular model ". When it does not load e.g. local CPU-only environment , it falls back to a heuristic scorer labelled "Heuristic rule-based scorer" — the label is set from self.has official tabpfn. ElevenLabs elevenlabs SDK is wired up in elevenlabs service.py. When the API key is valid, it returns an audio URL for the plan briefing. When it returns 401 expired key or is unconfigured, the frontend falls back to window.speechSynthesis browser Web Speech API — users still get audio, just synthesised client-side. SerpApi serpapi service.py calls the Google Maps engine for local park results when a key and location are provided. Results include a "source": "serpapi-live" tag. Static defaults include "source": "static-default" so the frontend can and does show which data is real. Sentry sentry service.py wraps every service call in an AgentSpan context manager that records timing, inputs, and outputs in an in-memory list. When SENTRY DSN is set in environment variables, the same spans are forwarded to Sentry's trace dashboard. The startup log is honest about which mode is active. Render The app is deployed as a Python web service on Render using render.yaml: Build: pip install -r requirements.txt Start: uvicorn app.main:app --host 0.0.0.0 --port $PORT Health check: /health returning {"status": "healthy"} All API keys stored as Render environment variables — never sent to the client browser This distinction matters: an application should be honest about when its AI is working. I chose a lightweight architecture that keeps the frontend and backend straightforward to understand and extend. Render provides the public hosting environment for TrailMates and runs the FastAPI application that handles requests from the frontend. The backend is responsible for communicating with the configured inference provider, handling responses, and returning structured plans to the user. API credentials remain in server-side environment variables rather than being embedded in browser code. The application also provides a health-check endpoint for deployment monitoring. Using a single hosted application keeps the deployment relatively simple while leaving room to evolve the AI integration. For TrailMates, open innovation is about keeping the technology adaptable. I didn't want the future of this project to depend entirely on one proprietary model API. Open-weight models give developers opportunities to explore different models, compare their outputs, experiment with prompts, and adapt the behavior of an application to its users' needs. That flexibility matters for an outdoor companion. Someone with 15 minutes and low energy needs a different suggestion from someone looking for an active afternoon outdoors. I want to be able to experiment with how TrailMates plans those experiences without unnecessarily rewriting the entire application. Open innovation also encouraged me to think about transparency. When model inference is unavailable, the rule-based fallback can still provide a useful demo plan. But it should never be mislabeled as AI-generated. There are trade-offs. TrailMates currently relies on external inference infrastructure when using Hugging Face Inference Providers. Availability, latency, and cost depend on the configured provider and model. I am not claiming that the hosted application runs fully offline or that inference is free at scale. A future version could support local inference with a compatible model, giving users and contributors another way to run the planner and potentially reducing reliance on an external inference service. That would also introduce hardware and performance considerations. To me, open innovation isn't about claiming that open models are automatically better or cheaper in every situation. It's about having the freedom to investigate alternatives, learn from experimentation, and build something that can evolve. And that's what I like most about this project: the AI isn't meant to keep people interacting with AI. It's meant to help them discover something beyond their screens. Built with Antigravity AGY — the full multi-session conversation is what produced the code in this repository, including the endpoint correction, honest attribution logic, and this submission. I'm sharing the source code as the primary reference for the implementation. Best Use of Render — TrailMates is deployed as a Render-hosted web application with a FastAPI backend and a health-check endpoint. Best Use of a Hugging Face Open-Weight Model — Qwen/Qwen2.5-7B-Instruct via https://router.huggingface.co/v1/chat/completions https://router.huggingface.co/v1/chat/completions . Attribution is only shown after response validation. Best Use of TabPFN — Prior Labs tabpfn package installed; suitability scorer clearly reports "TabPFN Prior Labs tabular model " vs "Heuristic rule-based scorer" depending on what loaded. Best Use of ElevenLabs — ElevenLabs SDK integrated for audio trail briefing with graceful browser Web Speech API fallback. Best Use of Sentry — AgentSpan context manager records timing and metadata for every service call; forwarded to Sentry when DSN is configured. Best Use of SerpApi — Google Maps engine search for real local parks and green spaces when SERPAPI API KEY and location are present; results tagged "source": "serpapi-live" Technology doesn't always have to ask for more of our attention. Sometimes, it can help us give that attention back to the world around us. If you try TrailMates, generate a small adventure, put your phone away, and see what you notice outside. A little fresh air. A little curiosity. A little less scrolling. Even a tiny adventure counts. 🌿