{"slug": "walkguide-studio-local-gemma-tours-for-independent-guides", "title": "Walkguide Studio: Local Gemma Tours for Independent Guides", "summary": "A developer built Walkguide Studio, an open-source tool that lets independent walking-tour operators turn their own stop notes into self-guided tour packages using Gemma running locally through Ollama. The tool drafts narration for each stop and applies a grounding check that rejects unsupported names and numbers, retrying once at lower temperature before falling back to a deterministic template built from the source facts. The project, submitted to the Hacktoberfest Open-Source AI Challenge, produces a static tour with a route map, transcripts, optional audio, and an offline ZIP, with no hosted model API or per-narration charge.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)*\n\nBuilt during **Hacktoberfest Week 2** for the [DEV Open-Source AI Challenge: Side Hustle](https://dev.to/devteam/join-the-hacktoberfest-open-source-ai-challenge-side-hustle-2550-in-prizes-across-18-winners-55ba?bb=264692).\n\nClick the thumbnail to watch the video.\n\nWalkguide Studio helps an independent walking-tour operator turn their own stop notes into a self-guided tour package. The operator enters the route and their local knowledge once; Gemma, running on the operator's computer through Ollama, drafts a short narration for each stop. A grounding check rejects unsupported names and numbers. The result is a static tour with a route map, transcripts, optional audio, and an offline ZIP that the operator can share or sell through their existing channel.\n\nThe main product flow is built around open-weight AI: Studio requires a local Gemma model before it can create a package. There is no hosted model API in the path and no per-narration API charge. The original command line tools remain available for automation and for the separate…\n\nTo run the Studio:\n\n```\nollama pull gemma3:1b\npython studio.py\n```\n\n**A failure shaped the design:** Gemma sometimes returned generic introductions or echoed a stop heading, causing the grounding check to reject its narration. I tightened the prompt, cleaned up echoed headings, and made the Studio show why the guard rejected a draft. **Unsupported narration is still blocked** rather than quietly packaged as a finished tour.\n\n**Open-weight AI makes it practical to experiment with a specialized tour product** without first building around a closed provider’s API and pricing. The trade-off is that operators need a capable computer and detailed source notes; incomplete notes may lead to rejected narration.\n\nBuild a stdlib-only Python 3.9+ project called \"walkguide\" (no pip dependencies; optional external tools:\n\nOllama for a local Gemma model, Piper for offline TTS). It has two products that share code:\n\nA) WALK GUIDE: an offline-first audio guide that narrates places near you while you walk.\n\nB) TOUR PACK: for small tour operators; turns their stop list + notes into an offline, narrated, self-guided\n\n   tour (a static folder: index.html + audio files).\n\nFILES\n\n- sources.py: haversine, bearing, compass(deg)->\"north-east\" etc. Fetch POIs from OpenStreetMap Overpass\n\n  (two endpoint fallbacks; query named historic / tourism(museum|artwork|attraction|viewpoint|gallery) /\n\n  leisure(park|garden|nature_reserve) / place_of_worship / natural(peak|water|spring|wood) plus trees with\n\n  species; \"out center tags 80\") and Wikipedia geosearch (generator=geosearch, extracts+coordinates, intro,\n\n  plaintext, 4 sentences). Convert OSM tags to plain English sentences (\"It is a church.\", \"It dates from\n\n  1890.\"). Skip OSM places with fewer than 2 facts. Merge by case-insensitive name (Wikipedia wins, add up\n\n  to 3 OSM facts). Cache per 0.01-degree cell (~1.1 km, fetch radius 800 m around the cell centre) as JSON\n\n  files; only cache when BOTH sources succeeded. Support offline mode (cache only).\n\n  nearby(lat, lon, cache_dir, offline, max_dist) returns POIs with dist and bearing, sorted by distance.\n\n- narrator.py: build a prompt (Place, Location, up to 8 \"Fact:\" lines) and call Ollama /api/chat\n\n  (stream false, temperature 0.4, num_predict 140, default model gemma3:1b). Accept a custom system prompt\n\n  and max sentence count. GROUNDING GUARD: reject output if any number is not in the source text (name +\n\n  location + facts), or if any capitalised word that is not the first word of a sentence is not in the\n\n  source (allow \"I\" and compass words). On rejection retry once at temperature 0.1, then fall back to a\n\n  deterministic template built from the facts. Strip markdown, trim to N sentences. Return (text, meta)\n\n  with meta = {source: \"llm\"|\"template\", attempts, rejected: [...], latency_s}. Never crash if Ollama is down.\n\n- speak.py: make_speaker(piper_model) returns a blocking speak(text) using, in order: Piper (+ aplay/\n\n  afplay/paplay/ffplay), termux-tts-speak, macOS say, espeak-ng/espeak, Windows System.Speech; None if\n\n  nothing is found. synth(text, base_path, piper_model) writes <base>.wav (Piper, `say -o ... --data-format=`, or espeak -w), converts to .mp3 if ffmpeg exists, returns the path or None.\n\n  LEI16@22050\n\n- app.py (walk loop; CLI via argparse): location sources: --lat/--lon (fixed, 3 ticks), --walk\n\n  \"lat,lon;lat,lon\" (interpolated every 20 m), --gpx file, --termux (termux-location JSON, retry every 5 s\n\n  on failure). Flags: --model, --ollama-host, --piper-model, --trigger 60 (m), --cooldown 15, --tick 2,\n\n  --offline, --prefetch (cache 3x3 cells then exit), --no-speak, --reset. Each tick: track heading from\n\n  movement >5 m, find unvisited POIs within the trigger distance, pick the best by richness (fact length,\n\n  +2 for Wikipedia) minus dist/40, describe position as \"about 40 metres ahead of you / on your left /\n\n  behind you / on your right\" (or a compass direction when heading is unknown), narrate, speak, persist\n\n  visited IDs, append to metrics.jsonl, honour the cooldown. Simulated walks use a virtual clock at\n\n  1.4 m/s; --termux uses the wall clock. Print a summary on exit (narrations, model vs template,\n\n  guard rejections, mean latency) and save walks/walk-<timestamp>.json + .html.\n\n- summary.py: build_html(walk) makes a self-contained Strava-style HTML page: SVG route map (equirectangular\n\n  projection fitted to the box, start green, end red, numbered pins for narrated places), stats (distance,\n\n  time, pace, places, avg model latency, guard rejections), a narration timeline (elapsed time, place,\n\n  position, sentence, badge \"model name\" or \"template fallback\", guard blocks). Light/dark via\n\n  prefers-color-scheme, mobile responsive, no external resources. Also `--demo` (fictional sample data)\n\n  and `summary.py walks/x.json`.\n\n- tourpack.py: input JSON {title, operator, stops:[{name, lat, lon, notes}]}. For each stop: split the\n\n  operator's notes into sentences (FIRST and highest priority), optionally add up to 3 OSM/Wikipedia facts\n\n  when the name clearly matches or a Wikipedia POI is within 40 m (--no-enrich disables), location text\n\n  \"Stop i of N\", narrate with a tour-guide system prompt (3-5 short spoken sentences, use ONLY the facts,\n\n  start by saying which stop this is), then synth audio. Output tours/<slug>/index.html, audio/, and\n\n  build_report.json (per-stop source, latency, rejections, audio yes/no). index.html is ONE static file with\n\n  the tour data embedded (escape \"</\"): SVG map with dashed route + numbered pins (current / played\n\n  states), tap-to-play stops with transcript text, an <audio> element, an \"Auto-play when I arrive\"\n\n  checkbox using navigator.geolocation.watchPosition (arrival radius 40 m, play each stop once, don't\n\n  interrupt playback, needs HTTPS), a blue \"you\" dot, and a fallback to speechSynthesis when a stop has\n\n  no audio file. Light/dark, mobile-first, no external resources.\n\n- tests.py: plain-assert offline tests (guard accepts grounded text and rejects invented numbers/names,\n\n  template fallback works with no model, model-offline falls back, walk interpolation, where() phrasing,\n\n  offline cache round-trip).\n\n- sample_tour.json (clearly FICTIONAL stops) and README.md (setup for Ollama/Piper/Termux, all commands).\n\nRULES\n\n- Stdlib only. Never crash on network failure: print a short notice and degrade gracefully.\n\n- Every sentence spoken must pass the grounding guard or be replaced by the template.\n\n- Do not invent facts about real places in any sample data; label samples as fictional.\n\n- After writing, run tests.py, run `python3 tourpack.py sample_tour.json --model \"\" --no-enrich`, syntax-check\n\n  the player's JavaScript, and fix anything that fails. Report what you could not test (live network, Ollama,\n\n  real TTS, browser rendering).\n\nThe project is in [outputs](%5Blocal%20path%5D). It includes the walking guide, offline place cache, grounded narrator, optional speech adapters, self-contained walk summaries, static tour builder, tests, and setup instructions.\n\nThe sample tour was generated at [index.html](%5Blocal%20path%5D); its build report is [build_report.json](%5Blocal%20path%5D). Start with the [README](%5Blocal%20path%5D).\n\n**Verification:** `tests.py` passed, the requested sample tour command completed, all Python modules compiled, and the tour player JavaScript passed `node --check`. The Windows `python3` launcher was unavailable, so I ran the checks with the installed Python 3.13 `python` command. Live network lookups, Ollama, real TTS, and browser rendering were not tested.\n\nA possible DEV Challenge angle is Hacktoberfest Week 2’s Side Hustle theme, whose listed deadline is October 19; the project would need open source AI to be central to its use to be a clear fit. I can draft a DEV post about the build if you’d like.\n\nThe DEV research was limited to two adjacent posts. One describes building a zero dependency Python CLI and its tradeoffs; the other stresses durable local storage and controlled retries for offline resilience. Neither directly evaluates this project’s geospatial or narration design.\n\n**Source**: [Pravin Kumar](https://dev.to/pravin_kumar_23f5008c06b2)\n\n**Tags**: `cli`, `python`, `softwareengineering`, `testing`\n\nThe author describes replacing common CLI and testing packages with Python’s standard library, including explicit JSON persistence and dependency auditing. This supports the stdlib-only constraint, though the article covers a different tool.\n\n**Source**: [Kaustubh Alandkar](https://dev.to/kaustubhalandkar)\n\n**Tags**: `mqtt`, `python`, `systemdesign`\n\nThe author emphasizes persisting data before relying on a downstream service, and making retry behavior explicit. That reinforces treating cache writes and graceful network failure as core behavior; the post’s SQLite buffer is a different use case.\n\nhow to record a demo for this\n\nFor a quick demo, record a **screen capture of the sample tour**. It works without network access, Ollama, or audio hardware.\n\n`outputs/tours/the-imaginary-lantern-walk/index.html` in a browser.\nFor a demo of the walking guide itself, run a simulated route with `python app.py --walk \"lat,lon;lat,lon\" --offline --no-speak`, using coordinates from a cached area. You can prefetch an area first with `python app.py --lat LAT --lon LON --prefetch` while online.\n\ngive complete path its not opening\n\nThe complete path to the sample tour is:\n\n`[local path]`\n\nCopy that into File Explorer’s address bar and press Enter.\n\ni dont understand what i have to do in thiss and how is open source used\n\n`walkguide` has two parts:\n\nThe sample tour is fictional, so it’s just a demonstration. Open this file in a browser:\n\nYou’ll see a map and three sample stops. Click **Play** to hear a stop if your browser supports speech synthesis; otherwise, read its transcript.\n\n**How open source is used:** the project itself is code you can inspect and change. It also *can* use the open-weight Gemma model through Ollama to write narrations locally. That’s optional: without Ollama, it uses simple templates based on the supplied facts. The sample tour was built with the model turned off, so it demonstrates the template fallback—not Gemma.\n\nTo try Gemma, install Ollama, download the `gemma3:1b` model, start Ollama, then build a tour with:\n\n```\npython tourpack.py sample_tour.json --model gemma3:1b --no-enrich\n```\n\nThe tour’s notes remain the narration’s facts; the model turns those facts into spoken sentences. The open-weight model runs on your computer rather than requiring a paid model API.\n\n[https://dev.to/devteam/join-the-hacktoberfest-open-source-ai-challenge-side-hustle-2550-in-prizes-across-18-winners-55ba?bb=264692](https://dev.to/devteam/join-the-hacktoberfest-open-source-ai-challenge-side-hustle-2550-in-prizes-across-18-winners-55ba?bb=264692) i am building it for this so build accordingly considering it should be worth winning\n\nI reshaped Walkguide around one customer: **independent tour operators who want to turn their own local knowledge into offline tours they can share or sell.** The new [local Studio](%5Blocal%20path%5D) guides them through entering stops and notes, using Gemma locally to draft grounded narration, previewing the tour, and downloading a ZIP for customers. Gemma is required in that Studio flow; the template fallback remains available in the CLI tools.\n\n**To try it:** install Ollama, then in PowerShell run:\n\n```\ncd \"[local path]\"\nollama pull gemma3:1b\npython studio.py\n```\n\nStudio opens at `http://[REDACTED]:8765`. Replace the clearly fictional sample stops with real operator notes and coordinates, then create, preview, and download the tour. Setup details are in the [README](%5Blocal%20path%5D).\n\n**Important for the challenge:** the page says Week 2 submissions are due October 18 at 11:59 PM PDT—about 15½ hours from now in India—and that open-weight AI must be central. It also says writing quality carries the most weight and encourages showing a real user’s feedback. [Challenge details](https://dev.to/devteam/join-the-hacktoberfest-open-source-ai-challenge-side-hustle-2550-in-prizes-across-18-winners-55ba)\n\nThe checks passed: offline assertions, sample tour generation, Python compilation, and JavaScript syntax checks. **Ollama isn’t installed on this computer**, so I couldn’t verify a real Gemma narration. The sandbox also blocked local browser connections, so I couldn’t visually verify Studio running. Before submitting, run it with Gemma, record the real workflow, and—if possible—have one tour operator try it. Don’t present the fictional sample as a real tour or claim customer validation you haven’t done.\n\ni get oolama is not recognized\n\nIt sounds like Ollama isn’t installed yet. On Windows, download and run the installer from [Ollama’s official download page](https://ollama.com/download/windows), then **close and reopen PowerShell**. The installer adds the `ollama` command; reopening PowerShell lets it find it. ([Official Windows download](https://ollama.com/download/windows))\n\nThen run these commands one at a time:\n\n```\nollama --version\nollama pull gemma3:1b\ncd \"[local path]\"\npython studio.py\n```\n\nIf the first command still says “not recognized,” restart your computer and try it again.\n\nits working now how to record demo\n\nHere’s a simple demo flow:\n\nYou can narrate: “I’m a small tour operator. I add my own notes, Gemma runs locally to turn them into a grounded audio guide, and I download a tour I can share with visitors.”\n\nIf Game Bar doesn’t start, press **Win + G** and enable recording, or open **Snipping Tool** and choose **Record**. ([Microsoft’s recording options for Windows](https://support.microsoft.com/en-us/windows/apps/steps-recorder-deprecation))\n\ngive me tour around banglore\n\nI’ve set Studio’s default route to **Bengaluru: Green Spaces & Granite**. Restart Studio so the updated stops appear: in the PowerShell window running it, press **Ctrl+C**, then run:\n\n```\ncd \"[local path]\"\npython studio.py\n```\n\nRefresh the Studio page. It will be prefilled with this short central Bengaluru route:\n\nWait for Gemma’s status to show **Ready**, then click **Create Gemma tour**. The pins are approximate outdoor viewpoints, and the map’s connecting line is not pedestrian turn-by-turn directions—check local access and walking paths before visiting.\n\nI also saved the tour data in [bengaluru_demo_tour.json](%5Blocal%20path%5D) and the [source and coordinate notes](%5Blocal%20path%5D). The JSON and Python checks passed.\n\nGemma did not produce any grounded narration. No tour ZIP was offered; revise the notes and try again. i am getting this\n\nYour notes are fine. The saved report shows Gemma’s formatting—such as “Stop 1 of 3: Welcome…”—was tripping the grounding check.\n\nI’ve updated the code to normalize that stop heading and tighten the prompt. **Restart Studio** so it loads the fix:\n\n`python studio.py` again.\nIf it still fails, the updated error should include the guard blocks. The full report is at `[local path]`.\n\nThe offline tests and the specific stop-heading guard check pass. I couldn’t call your local Ollama service from this sandbox, so please retry in your running Studio.\n\nis it now safe to add on git with proper readme and stuff ? also [https://youtu.be/NbL-dx2ZQpA](https://youtu.be/NbL-dx2ZQpA) embed this video in readme and also mention that its builr in hacktoberfest week2\n\n**The project files look safe to put in a public Git repository**, and I updated the README with the demo video and the Hacktoberfest Week 2 credit. I also added a `.gitignore` to keep generated tours, local walk data, Python cache files, and speech model files out of Git.\n\nOne catch: **this `outputs` folder is not currently a Git repository**, so nothing has been added or committed yet. Open this folder in your terminal to start:\n\n```\ncd \"[local path]\"\n```\n\nIf you want, I can help you connect it to a new GitHub repository next.\n\n<!-- What does it do, and who would pay for it? What problem does it solve for them? -->\n\n<!-- Share a deployed link or a video demo. -->\n\n<!-- Show us the code! You can embed a GitHub repo directly into your post. -->\n\n<!-- Which open-source AI did you use (open-weight models, agent harnesses, frameworks, local inference), and how is your project built around it? -->\n\n<!-- Why does open innovation matter for what you built? What did it make possible that a closed API wouldn't? -->\n\n<!-- Optional, but judges love it. Save your session with DevRelay and embed it with the agent_session tag (see the challenge page), or link to it. -->\n\n<!-- Optional, but this is where bonus points live. Did someone use it? Who were they, what did they say, and did they pay? If not, remove this section. -->\n\n<!-- Which partner categories are you entering? List every one that applies, or remove this section. -->\n\n<!-- Team Submissions: Please pick one member to publish the submission and credit teammates by listing their DEV usernames directly in the body of the post. -->\n\n<!-- Thanks for participating! --> fill this template too for me\n\nI saved the completed post as a **DEV draft**: [Open and edit it on DEV](https://dev.to/ishavishwakarma29/walkguide-studio-local-gemma-tours-for-independent-guides-2o6f-temp-slug-6595471/edit).\n\n**Before publishing:** replace the GitHub placeholder with your public repository URL. Your project folder isn’t a GitHub repository yet, so the draft says that plainly. I left out the optional “My First User” and “My Agent Session” sections because we don’t have real user feedback or a session link to include. The draft is marked as AI-assisted (`some_ai`).\n\nThe Week 2 deadline is **October 19 at 12:29 PM IST**. The draft has the required `hf26challenge` tag and lists “Best Use of Gemma.” [Challenge details](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)\n\nWalkguide Studio turns a local tour operator's own notes into a self-guided walking tour. The operator enters stops, coordinates, and facts; Gemma drafts short narration grounded in those notes. Walkguide checks the generated text for unsupported names and numbers, then packages a map, transcripts, optional audio, and an offline tour ZIP.\n\nThe intended customer is an independent walking-tour guide, museum, or neighborhood business that wants to offer a self-guided tour without commissioning a custom app or paying for a hosted AI call for every narration. They could sell or bundle the tour ZIP with their existing booking or visitor experience. Walkguide does not handle payments, and I have not yet validated willingness to pay with an operator—this is the customer problem I built toward.\n\n**GitHub repository:** [Add the public repository URL here before publishing.]\n\nThe project is currently in my local folder, so there is no public repository URL to share yet.\n\nWalkguide is written in Python 3.9+ using the standard library. The Studio UI and local server are built into the project. It calls Gemma 3 (1B) through Ollama on the operator's computer; the app does not send tour notes to a hosted model API. The operator's notes are the grounding source. A validation step rejects narration that introduces unsupported names or numbers, and the generated tour is a static package that can be opened offline.\n\nOne failure shaped the implementation: Gemma sometimes returned generic introductions or echoed stop headings instead of starting with grounded narration. I tightened the prompt and normalized echoed headings, while keeping the grounding check as a hard stop. If the model still cannot produce grounded narration, the build reports the rejection instead of quietly presenting it as a successful tour.\n\nThe local, open-weight model is part of the product's business case. A small tour operator can run narration generation on their own computer, keep their route notes in that local workflow, and avoid a hosted-model charge for each tour. They can also inspect and adapt the generation and validation code for local history, languages, and operating constraints. That makes it possible to experiment with a niche tour product without first committing customer data or the business model to a closed API provider.\n\n[https://github.com/ishavishwakarma29/WalkguideStudio](https://github.com/ishavishwakarma29/WalkguideStudio) add this repo and also add the dev relay session also the points are not mentioned such that it describes problem and emphasises solution properly. writing carries most weight in judging\n\nUpdated the existing DEV draft with your [GitHub repository](https://github.com/ishavishwakarma29/WalkguideStudio), embedded a new [DevRelay session](https://dev.to/agent_sessions/building-walkguide-studio-with-local-gemma-uf8pxg), and rewrote the post to make the operator’s problem, Walkguide’s solution, and the unvalidated customer assumptions clearer.\n\n[Open the updated DEV draft](https://dev.to/ishavishwakarma29/walkguide-studio-local-gemma-tours-for-independent-guides-2o6f-temp-slug-6595471/edit). It remains unpublished for your review and is marked AI-assisted.\n\nits not updated yet\n\nI checked DEV’s saved draft: it **does** contain the GitHub link, the DevRelay session embed, and the revised sections. It’s still unpublished, so the public post won’t show those edits yet.\n\nOpen the [draft editor](https://dev.to/ishavishwakarma29/walkguide-studio-local-gemma-tours-for-independent-guides-2o6f-temp-slug-6595471/edit) and refresh the page. If you were looking at the public post, switch to the draft editor instead.\n\nno when i copy and open this link it doesnt show\n\nI found the issue: the link opens DEV’s **sign-in page** because you aren’t signed in there in this browser. The draft is saved, but you’ll need to sign into the DEV account **Isha Vishwakarma (`ishavishwakarma29`)** to see its editor.\n\nThe DEV sign-in page is open in the in-app browser. After signing in, open the [draft editor](https://dev.to/ishavishwakarma29/walkguide-studio-local-gemma-tours-for-independent-guides-2o6f-temp-slug-6595471/edit) again.\n\neven in signed in tab in chrome its not showing\n\nSorry—I was too certain that signing into Chrome would make that link work. I can verify DevRelay saved the draft under **`ishavishwakarma29`**, but I can’t see which DEV account Chrome is signed into.\n\nIn Chrome, open your [DEV dashboard](https://dev.to/dashboard), choose **Drafts**, and look for **“Walkguide Studio: Local Gemma Tours for Independent Guides.”** DEV says drafts are available from your dashboard. [DEV Help: Writing, Editing and Scheduling](https://dev.to/help/writing-editing-scheduling)\n\nCheck that your profile handle is **`ishavishwakarma29`**. If the draft still isn’t listed under that account, tell me what you see on the Drafts page—or share a screenshot—and I’ll help fix the mismatch.\n\ngot it now, write up is not nice, it should be point by point with bold etc to emphasize give me markdown here only\n\n**The problem:** A walking-tour guide may know the stories behind every stop, but turning that knowledge into a self-guided product takes extra work: shaping notes into short narrations, checking facts, preparing audio, and packaging everything for visitors.\n\n**The solution:** Walkguide Studio turns an operator’s own route notes into a self-guided walking tour. The operator adds stops, coordinates, and facts. **Gemma drafts the narration from those notes**, and Walkguide checks it for unsupported names and numbers before packaging a map, transcripts, optional audio, and an offline ZIP.\n\n**Who could pay:** Independent walking-tour operators and small local museums that want to offer a self-guided option without commissioning a custom app. They could sell or bundle a tour ZIP with an existing tour or visitor experience.\n\n**What’s built today:** Walkguide creates and packages tours; **it does not process payments or host a storefront**. I haven’t yet tested willingness to pay with an outside operator, so the customer and pricing assumptions still need validation.\n\n**The design principle:** Grounding is a gate. If the narration includes unsupported details, Walkguide reports the failure instead of offering an ungrounded tour ZIP as ready.\n\n```\nollama pull gemma3:1b\npython studio.py\n```\n\n**A failure shaped the design:** Gemma sometimes returned generic introductions or repeated a stop heading, causing the grounding check to reject the narration. I tightened the prompt, cleaned up echoed headings, and made the Studio show the guard’s reasons. **The check still blocks unsupported narration** instead of quietly weakening the factual standard.\n\nOpen-weight AI makes it practical to experiment with a small, specialized tour product without building around a closed model provider’s API and pricing. **The trade-off is that operators need a capable computer and good source notes**; incomplete notes may lead to rejected narration.\n\n{% agent_session building-walkguide-studio-with-local-gemma-uf8pxg %}\n\nin markdown here\n\n```\n*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)*\n\n## What I Built\n\n**The problem:** A walking-tour guide may know the stories behind every stop, but turning that knowledge into a self-guided product takes extra work: shaping notes into short narrations, checking facts, preparing audio, and packaging everything for visitors.\n\n**The solution:** Walkguide Studio turns an operator’s own route notes into a self-guided walking tour. The operator adds stops, coordinates, and facts. **Gemma drafts the narration from those notes**, and Walkguide checks it for unsupported names and numbers before packaging a map, transcripts, optional audio, and an offline ZIP.\n\n**Who could pay:** Independent walking-tour operators and small local museums that want to offer a self-guided option without commissioning a custom app. They could sell or bundle a tour ZIP with an existing tour or visitor experience.\n\n**What’s built today:** Walkguide creates and packages tours; **it does not process payments or host a storefront**. I haven’t yet tested willingness to pay with an outside operator, so the customer and pricing assumptions still need validation.\n\n**The design principle:** Grounding is a gate. If the narration includes unsupported details, Walkguide reports the failure instead of offering an ungrounded tour ZIP as ready.\n\n## Demo\n\n[![Watch the Walkguide demo](https://img.youtube.com/vi/NbL-dx2ZQpA/hqdefault.jpg)](https://youtu.be/NbL-dx2ZQpA)\n\n## Code\n\n[WalkguideStudio on GitHub](https://github.com/ishavishwakarma29/WalkguideStudio)\n\n## How I Built It\n\n- **Language:** Python 3.9+, using only the standard library.\n- **Local AI:** Gemma 3 (1B) runs through Ollama on the operator’s computer.\n- **Grounding:** The operator’s notes are the source for each stop’s narration. A validation step checks generated names and numbers against those notes.\n- **Output:** Walkguide packages a map and transcripts into a static tour ZIP that visitors can open offline. Audio is optional.\n\nTo run the Studio:\n\n``` powershell\nollama pull gemma3:1b\npython studio.py\n```\n\nmarkdown is incomplete\n\n```\n*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)*\n\n# Walkguide Studio: Local Gemma Tours for Independent Guides\n\n## What I Built\n\n**The problem:** Walking-tour guides often have the local knowledge already. Turning it into a polished self-guided tour takes additional work: organizing notes into short narrations, checking facts, preparing audio, and packaging the route for visitors.\n\n**The solution:** Walkguide Studio turns a tour operator’s route notes into a self-guided walking tour. The operator provides each stop’s name, coordinates, and facts. **Gemma drafts narration from those notes**, and Walkguide checks the generated text for unsupported names and numbers before creating a map, transcripts, optional audio, and an offline ZIP.\n\n**Who it’s for:** Independent walking-tour operators and small local museums that want to offer a self-guided option without commissioning a custom app.\n\n**Who might pay:** An operator could sell the tour ZIP or bundle it with an existing tour, booking, or visitor experience. Walkguide creates and packages tours; **it does not process payments or host a storefront**. I haven’t yet tested willingness to pay with an outside operator, so this is a customer and pricing hypothesis that still needs validation.\n\n**What makes the solution useful:** The operator’s notes remain the source of truth. If narration includes unsupported details, Walkguide reports the rejection instead of packaging it as a finished tour.\n\n## Demo\n\n[![Watch the Walkguide demo](https://img.youtube.com/vi/NbL-dx2ZQpA/hqdefault.jpg)](https://youtu.be/NbL-dx2ZQpA)\n\n## Code\n\n[View WalkguideStudio on GitHub](https://github.com/ishavishwakarma29/WalkguideStudio)\n\n## How I Built It\n\nWalkguide is written in **Python 3.9+ using only the standard library**. The local Studio interface collects the route and notes, then Ollama runs **Gemma 3 (1B)** on the operator’s computer to draft narration.\n\nThe main flow is:\n\n1. **Enter the route:** Add stop names, coordinates, and source notes.\n2. **Draft narration:** Gemma generates concise narration using the provided notes.\n3. **Check grounding:** Walkguide checks generated names and numbers against the notes.\n4. **Package the tour:** The app creates a map, transcripts, optional audio, and a static ZIP that visitors can open offline.\n\nTo start the Studio:\n\n``` powershell\nollama pull gemma3:1b\npython studio.py\n```\n\n**A failure shaped the design:** Gemma sometimes returned generic introductions or echoed a stop heading, causing the grounding check to reject the narration. I tightened the prompt, cleaned up echoed headings, and made the Studio show why the guard rejected a draft. **Unsupported narration is still blocked** rather than quietly packaged as a finished tour.\n\nOpen-weight AI makes it practical to experiment with a specialized tour product without first building around a closed provider’s API and pricing. The trade-off is that operators need a capable computer and sufficiently detailed source notes; incomplete notes may lead to rejected narration.\n\nits still half markdown half normal text\n\n[View WalkguideStudio on GitHub](https://github.com/ishavishwakarma29/WalkguideStudio)\n\n```\nollama pull gemma3:1b\npython studio.py\n```\n\nstill same problem\n\n```\n*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)*\n\n# Walkguide Studio: Local Gemma Tours for Independent Guides\n\n## What I Built\n\n- **Problem:** Walking-tour guides know the stories behind their stops, but turning those stories into a self-guided product takes time: organizing notes, writing narration, checking facts, preparing audio, and packaging the route.\n- **Solution:** Walkguide Studio turns an operator’s route notes into a self-guided walking tour. The operator enters each stop’s name, coordinates, and facts. **Gemma drafts narration from those notes**, and Walkguide checks the narration for unsupported names and numbers.\n- **Output:** A map, transcripts, optional audio, and an offline tour ZIP.\n- **Who it’s for:** Independent walking-tour operators and small local museums that want a self-guided option without commissioning a custom app.\n- **Who might pay:** An operator could sell a tour ZIP or bundle it with an existing tour, booking, or visitor experience.\n- **Current limitation:** Walkguide creates and packages tours; it does not handle payments or host a storefront. I haven’t tested willingness to pay with an outside operator, so the customer and pricing assumptions still need validation.\n- **Grounding:** The operator’s notes are the source of truth. If narration includes unsupported details, Walkguide reports the rejection instead of packaging it as a finished tour.\n\n## Demo\n\n[![Watch the Walkguide demo](https://img.youtube.com/vi/NbL-dx2ZQpA/hqdefault.jpg)](https://youtu.be/NbL-dx2ZQpA)\n\n## Code\n\n[View WalkguideStudio on GitHub](https://github.com/ishavishwakarma29/WalkguideStudio)\n\n## How I Built It\n\n- **Language:** Python 3.9+, using only the standard library.\n- **Local AI:** Gemma 3 (1B) runs on the operator’s computer through Ollama.\n- **Narration:** Gemma drafts each stop’s narration from the operator’s notes.\n- **Validation:** Walkguide checks generated names and numbers against those notes.\n- **Packaging:** The app creates a map, transcripts, optional audio, and a static ZIP that visitors can open offline.\n\nTo run the Studio:\n\n    ollama pull gemma3:1b\n    python studio.py\n\n**A failure shaped the design:** Gemma sometimes returned generic introductions or echoed a stop heading, causing the grounding check to reject its narration. I tightened the prompt, cleaned up echoed headings, and made the Studio show why the guard rejected a draft. **Unsupported narration is still blocked** rather than quietly packaged as a finished tour.\n\n## Why Does Open Innovation Matter?\n\n- **Lower usage costs:** Local Gemma avoids a hosted-model API charge for each narration. The operator still needs hardware capable of running the model.\n- **Local processing:** The Studio sends narration requests to Ollama on the operator’s computer rather than to a hosted model API.\n- **Adaptability:** Operators can inspect and modify the prompts and validation code for their neighborhood, language, and editorial standards.\n\n**Open-weight AI makes it practical to experiment with a specialized tour product** without first building around a closed provider’s API and pricing. The trade-off is that operators need a capable computer and detailed source notes; incomplete notes may lead to rejected narration.\n\n## My Agent Session\n\n{% agent_session building-walkguide-studio-with-local-gemma-uf8pxg %}\n\n## Prize Categories\n\n- **Best Use of Gemma**\n```\n\npriz =e categories also need detail\n\n```\n## Prize Categories\n\n- **Best Use of Gemma:** Gemma 3 (1B) is the core narration model in Walkguide Studio. It runs locally through Ollama and turns an operator’s notes for each stop into concise tour narration. Walkguide then checks names and numbers against those notes and rejects unsupported narration. Gemma is central to generating the tour content, not an optional add-on.\n- **Other partner categories:** None. Walkguide does not currently integrate the other challenge partners’ technologies.\n```\n\nthe dev relay session is incomplete it should be from start\n\nThe saved DevRelay session is incomplete; it should cover the project from the start.", "url": "https://wpnews.pro/news/walkguide-studio-local-gemma-tours-for-independent-guides", "canonical_source": "https://dev.to/ishavishwakarma29/walkguide-studio-local-gemma-tours-for-independent-guides-o3j", "published_at": "2026-10-18 21:45:10+00:00", "updated_at": "2026-10-18 21:48:39.503507+00:00", "lang": "en", "topics": ["artificial-intelligence", "large-language-models", "ai-tools", "generative-ai"], "entities": ["Walkguide Studio", "Gemma", "Ollama", "Hacktoberfest", "DEV", "Piper", "OpenStreetMap", "Wikipedia"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/walkguide-studio-local-gemma-tours-for-independent-guides", "markdown": "https://wpnews.pro/news/walkguide-studio-local-gemma-tours-for-independent-guides.md", "text": "https://wpnews.pro/news/walkguide-studio-local-gemma-tours-for-independent-guides.txt", "jsonld": "https://wpnews.pro/news/walkguide-studio-local-gemma-tours-for-independent-guides.jsonld"}}