This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.
What I Built
Roam is a map-backed collection of place memories that helps someone decide where to go, then close the tab and actually go there.
The starting idea was simple: a photo of a park, a café, a trail, or a workshop is more useful when it comes with somebody's experience of being there. A long feed can make me want to travel without helping me take the first step. I wanted the map, the memory, and a practical plan in one place.
Roam combines a readable social feed with photography and nearby discovery. There is no signup wall. In the local prototype, someone can attach a photo, speak a short experience, review the transcript, confirm the place, and ask Gemma to help turn it into a memory. Another person can save that place and ask for a visit plan that fits the time they have.
The important design decision is that AI should help express the experience, not replace it. Saying “I went here and liked the quiet” must not turn into a fabricated review of food, facilities, or an event that the person never mentioned.
The intended audience is local explorers: people looking for a small outdoor visit, a walk, a café stop, or something nearby worth remembering. Workshops and cultural memories are supported too, but a memory is not a claim that an event is still running.
Demo
Watch the narrated Roam demo — 97 seconds, 1080p · Download MP4
Dated supplement — 12 October 2026: This video was added after the Week 1 deadline of 12:29 PM IST. The original submission was published at 12:06:07 PM IST before the cutoff. The video is an edited walkthrough of captured local application screens, with narration by ElevenLabs' Hope voice. It adds presentation material and does not claim new features or an additional prize category completed during the entry period. The README records the post-deadline addition.
The Render preview supports browsing, the map, place search, and nearby discovery. It is intentionally read-only: public posting is disabled while private photo storage is being connected, and the hosted preview does not yet have a GPU/Gemma service. Free Render can take time to wake after inactivity.
The full Gemma-assisted workflow runs locally with Ollama. These are screenshots of the implemented local prototype, not a claim that the cloud preview currently performs inference.
Local feed with clearly labelled fictional example memories and illustrative photography. The example photo is not evidence of an actual visit to the named park.
Gemma generated a plan from example memories, with those examples identified in the UI. Plans enforce a time budget and cite their source memories.
For this Misu example, retrieval supplied a restaurant category and mapped cuisine. The interface explicitly says no matching Wikipedia background was found; it does not invent the missing story.
To reproduce the local AI demo:
git clone https://github.com/Bitshank-2338/roam-touch-grass.git
cd roam-touch-grass
npm ci
ollama pull gemma3:4b
npm start
Use Node 24.14 or newer, keep Ollama running, and open http://127.0.0.1:4180. Add your own Geoapify key in a private .env for the selected map provider; the repository includes the configuration example. Model weights and credentials are not bundled.
Code
Public source and setup instructions
The application source is MIT licensed. Model weights, map data, fonts, and photographs retain their respective licenses or terms. This submission repository is a clean snapshot of the project built during the challenge window; it excludes operational secrets, private browser identities, user uploads, and private development history.
How I Built It
A small web stack, with local Gemma at the centre
The frontend uses plain JavaScript and CSS, Leaflet, and a forest-green “Trail R” identity. The backend uses Node.js, Express, Sharp for photo processing, and Ollama for Gemma 3 4B.
SQLite is the local default. An asynchronous PostgreSQL backend is implemented, and the hosted preview now connects to Tiger Data. The app already has a private S3-compatible media adapter tested against local MinIO; connecting Supabase Storage is the next deployment step.
The flow is:
Photo + reviewed voice transcript + confirmed place
|
server-side source retrieval
|
Gemma selects existing facts / assists fields
|
editable memory in private review
|
approved feed and map contribution
|
source-based, time-bounded visit plan
Browser speech recognition supplies a transcript for review; Gemma works on that reviewed text. Recognition can depend on the browser provider's online service. “Listen” uses the device's available speech voices, with Stop and cancellation when navigating away.
Grounding instead of a bigger hallucination
One challenge was expanding a one- or two-line experience without pretending to know more about the user's visit.
For short notes, the original experience remains verbatim. Roam retrieves place context and asks Gemma to select known fact IDs. Application code attaches the exact retrieved source text, rather than accepting arbitrary model-authored facts. The source metadata is signed so a client cannot simply attach invented attribution.
When suitable background is absent, Roam provides labelled visit guidance and an explicit limitation. It does not manufacture opening hours, admission fees, venue history, or workshop schedules.
Nearby discovery also needed correction: a road near the user is not automatically an interesting destination. Retrieval now prioritises named parks, viewpoints, cafés, restaurants, museums, and cultural places. Wikipedia/Wikidata background requires geographic checks.
Anonymous does not mean ownership-free
The server issues a random private browser identity. A recovery export restores ownership and saved memories; it is not a device fingerprint. Clearing browser storage without recovery loses that ownership.
Local posting requires a recent location receipt and confirmation of the public pin. This is a client claim, not proof of attendance. Photos are decoded, resized, stripped of metadata, and re-encoded before storage.
Reactions are real, with one heart per browser per post. Replies have moderation states. Trending uses approved, non-demo contributions, duplicate filtering, and independent-browser thresholds. Gemma explains an existing ranking with cited post IDs; it cannot invent a trending venue or change the ranking.
Safety has an explicit unfinished boundary
The application implements Checking, Needs review, Blocked, and Published states. Pending photos remain private; edits retain the previous approved version while the new revision is checked.
The ShieldGemma integration and evaluation harness are prepared, but the actual ShieldGemma models have not been installed or evaluated on the future GPU server. Automatic approval stays disabled. Contract tests verify failure handling with controlled responses; those tests are not a substitute for real model evaluation. New video uploads are disabled in this release.
What I verified
- 54 automated tests pass, with syntax checks passing.
- Coverage includes ownership/recovery, stale moderation decisions, private media, exact source attribution, reactions/comments, speech cancellation, and trend grounding.
- Isolated PostgreSQL/MinIO integration checks cover migration, access denial, interrupted media operations, and persistence.
- Live Geoapify search, named nearby discovery, tiles, and walking routes were checked.
- Real local Gemma produced sourced place context and time-bounded plans.
- Microphone capture and audible summary playback were confirmed on the intended device.
- Render health, search, feed, and trends pass. Tiger Data's provider-usage ledger and trend snapshot survived a Render redeploy.
These checks do not establish a completed public launch. Private cloud media, GPU inference, real moderation evaluation, and final Figma repairs remain pending.
Why Does Open Innovation Matter?
Gemma's open weights let the useful part of Roam run on a machine I control. A personal memory does not need to be sent to a proprietary paid inference API just to get help expressing it.
The model is also replaceable. Retrieval, source validation, identity, and publication decisions live in application code, so the model does not become the only place where the product's rules exist. I can inspect those rules, test them, and change the inference provider without rewriting the social application.
This is not an entirely offline app: maps and source retrieval need internet, and browser voice recognition may do so too. The local model makes the AI step independently runnable, while the UI states those limits honestly.
The best outcome for Roam is a short interaction: find a place, understand why someone remembers it, make a realistic plan, and spend the next hour outside.
My Agent Session
I developed Roam with Codex assistance, including implementation, test orchestration, and this submission write-up. This post was prepared and published by the agent under my instruction. I am not publishing the raw session because it includes private operational setup.
Inspiration included Leaf Peep by Souvik Biswas, which helped shape the idea of using an open model to encourage an actual outing. Roam's focus is the place-memory and social-discovery workflow.
Prize Categories
- Best Use of Gemma: local Gemma 3 4B assists memory drafting, selects grounded place facts, and generates plans from cited memories.
- Best Use of Render: the deployed web frontend/backend preview runs on Render, with public posting deliberately gated while durable photo storage is completed.
Credits
Ollama; Google's Gemma and ShieldGemma under their model terms; Geoapify; Leaflet; OpenStreetMap and OpenMapTiles; Wikipedia/Wikidata; Phosphor icons; Outfit and DM Sans; and illustrative Unsplash photography. The Trail R brand imagery was generated with imagegen. Example stories are fictional and are excluded from real trends.



Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.