{"slug": "offline-adventures-lets-start-journey-with-ai", "title": "Offline Adventures - lets start journey with AI", "summary": "A developer built Offline Adventures, a local-first activity recommender that uses deterministic Python for hard constraints and a local llama3.1:8b-instruct-q4_K_M model via Ollama for semantic ranking and personalization, served through Streamlit on a local network. After an initial attempt to have the model generate the entire catalog produced repetitive, structurally valid but low-quality records, the architecture was changed so humans curate a 50-activity catalog while Python enforces rules and the model only selects and explains. The project ships with 19 passing tests, a catalog validator, and a real Ollama smoke test.", "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\nOffline Adventures is a local-first activity recommender designed to make choosing an activity quick, then get out of the way.\n\nThe user selects available time, energy level, current weather, accessible places, group type, and interests. The app returns one primary adventure and two alternatives. Each recommendation includes a short explanation, a mission, practical notes, a memory prompt, and a personalized local-AI twist.\n\nThe catalog covers walking, running, cycling, photography, nature, public art, local history, gardening, games, reading outdoors, family activities, sheltered activities, and indoor activities that prepare the next trip outside.\n\nThe interface is available through Streamlit on the local network, so I can open the recommendation on a phone and take the mission outside without carrying a laptop.\n\n**Demo video:** `https://youtu.be/z00-rhXgSLA`\n\nTested scenarios:\n\n**Dry weather, low energy, photography and nature**\n\n**Heavy rain, family, games and nature**\n\n**Restrictive conditions**\n\n**Repository:** `https://github.com/xDanielQ/offline-adventures`\n\nThe repository includes the curated 50-activity catalog, automated tests, a catalog validator, and a real Ollama smoke test.\n\nThe application uses a deliberately hybrid architecture.\n\nDeterministic Python code handles hard constraints:\n\nAfter filtering, up to 15 approved candidates are sent to a local `llama3.1:8b-instruct-q4_K_M` model through Ollama. The model performs semantic ranking, selects one primary activity and two alternatives, writes a natural explanation, and generates a small `personalized_twist` for each choice.\n\nPydantic generates the response schema and validates the structured JSON returned by Ollama. The model is not allowed to invent activity IDs. It also receives explicit boundaries against inventing locations, equipment, health advice, risky behavior, or laptop use during the activity.\n\nThe final flow is:\n\n```\nStreamlit input\n→ deterministic constraints\n→ varied approved candidate pool\n→ local open-weight model\n→ Pydantic-validated structured result\n→ short mission for the real world\n```\n\nI first tested using the model to generate the whole catalog. The records were structurally valid, but the content was repetitive, overused a \"find, photograph, research\" pattern, and did not provide the desired activity distribution. That experiment changed the architecture: people curate the activity catalog, Python enforces hard rules, and the model handles semantic choice and personalization.\n\nThe tested system used:\n\n`llama3.1:8b-instruct-q4_K_M`.\nAt submission time the project had 19 passing tests and a validated catalog distribution of 30 outdoor, 8 sheltered, and 12 indoor-bridge activities.\n\nLocal open-weight AI is important here for practical reasons, not just ideology.\n\nThe user's interests, available places, group context, and weather remain on the user's machine. The app does not need a hosted AI key, an account, or a per-request fee. The model can be replaced or its prompt and behavior can be inspected and changed. The project can continue to work in a local network even without an external AI service.\n\nA closed API could generate similar text, but it would add a remote dependency to an application specifically designed to shorten screen time and keep everyday context private. Local inference makes the architecture match the product goal.\n\nOpen tooling also made the failures visible. I could inspect candidate lists, validate every output with Pydantic, compare model-generated catalog content with curated content, and keep deterministic rules outside the model.\n\n[https://dev.to/agent_sessions/building-offline-adventures-with-local-open-weight-ai-3rciyc](https://dev.to/agent_sessions/building-offline-adventures-with-local-open-weight-ai-3rciyc)\n\n`{% agent_session building-offline-adventures-with-local-open-weight-ai-3rciyc %}`\n\nThe session documents the design decisions, catalog experiment, structured-output validation, local-model integration, and the choice to keep safety constraints deterministic.\n\nI am entering the overall Hacktoberfest Open-Source AI Challenge: Week 1, Touch Grass category.", "url": "https://wpnews.pro/news/offline-adventures-lets-start-journey-with-ai", "canonical_source": "https://dev.to/xdanielq/offline-adventures-lets-start-journey-with-ai-709", "published_at": "2026-10-08 20:38:52+00:00", "updated_at": "2026-10-08 20:48:53.807898+00:00", "lang": "en", "topics": ["ai-tools", "large-language-models", "ai-products"], "entities": ["Offline Adventures", "Ollama", "llama3.1:8b-instruct-q4_K_M", "Streamlit", "Pydantic", "GitHub", "Hacktoberfest"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/offline-adventures-lets-start-journey-with-ai", "markdown": "https://wpnews.pro/news/offline-adventures-lets-start-journey-with-ai.md", "text": "https://wpnews.pro/news/offline-adventures-lets-start-journey-with-ai.txt", "jsonld": "https://wpnews.pro/news/offline-adventures-lets-start-journey-with-ai.jsonld"}}