This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
Living in Dublin inspired me to explore the history of the city I call home before setting off to discover the rest of Europe. That's how Travelist came to life.
Travelist is a travel companion for, Android and the web that turns "where should I go?" into "put the phone away and walk". With 198 cities across 52 countries and over 22,756 attractions, Travelist helps you discover new places, plan your routes, and spend less time looking at your screen and more time experiencing the world around you.
And if your city isn't on the list, no worries! Travelist will automatically search for historical attractions in your city, so you can discover its history and hidden gems wherever you are.
Here's what Travelist has to offer:
- Suggested Historic Walks & Smart Routes. Discover themed walking routes featuring the city's most popular historic attractions, intelligently grouped by walking distance and starting from the location nearest to you. Travelist optimises your stops, calculates walking time and distance, and provides accurate routes that follow real streets, ready to open in Google Maps or Apple Maps. A local open-weight AI model generates route titles in English and Portuguese, while the application handles route planning and validation.
- In-app navigation that follows you and keeps the places readable, so the screen is a map you glance at, not a feed you scroll.
- A trip planner that interviews you Travelist interviews you to understand your interests, travel preferences, and ideal experience, then recommends destinations that match your personality, the time of year, and expected weather conditions, using ten years of historical climate data.
- Offline trips. Save a trip on the device (stops, street path, place texts, photos and a map area on a phone) and open it, and navigate it, with no connection.
- A "visited" mark per place, so the next suggested route stops treating a place you have already seen as a priority.
- A city builder. If you are somewhere the app does not cover, it builds the city from your position (attractions, texts, climate, facts, routes) using open data.
It is for people who travel on foot: the traveller who wants a good two-hour walk instead of a list of 40 pins.
The design goal is that the screen is the shortest part of the experience: plan in a minute, then walk.
Demo
Code
Wayfarer
Shown to users as Travelist (logo — a white swallow on a brick-red tile,
BrandMarkincomponents/app-menu.tsx— app name, About page, sign-in emails). Wayfarer remains the project's code name: repository, packages (@wayfarer/*), deep-link scheme (wayfarer://) and bundle id.
Cross-platform travel companion (iOS · Android · Web) built with Expo + Supabase and a local open-source AI model.
Purpose
Travelist helps a traveller decide where to go, prepare for the trip and walk the places once there, on iOS, Android and the web, without sending their data to anyone: the AI that suggests routes and plans trips is an open-weight model that runs on the owner's own machine.
- Before you go: a checklist personalised to your passports (visa, passport validity, power, weather, money, safety, practical info) and a trip planner that interviews you and proposes destinations that fit the month, the weather and the kind…
How I Built It
Open-source AI
-
Gemma 3 (
gemma3:4b) served by Ollama, running on my own machine. Qwen 2.5 is the default when no model is chosen, andOLLAMA_MODELor--modelswaps between them without touching code. The model writes three things: route titles, the three interview questions of the trip planner, and the reason for each proposed destination. - A local model writes, code decides. Every filter, distance, score and validation is plain code, so the model cannot invent a place or a number. If no model is running, rule-based planners take over, and the app still works.
-
Nomic embeddings (
nomic-embed-text) through Ollama, stored with pgvector in Postgres, for hybrid semantic + keyword search of attractions.
Open data
Wikidata, OpenStreetMap (Overpass, Nominatim), Wikipedia, Wikimedia Commons and Open-Meteo, with the source and licence kept next to every place. MapLibre with OpenFreeMap tiles draws the maps with no API key.
App and backend
Expo SDK 57 / React Native 0.86 with Expo Router (one codebase for iOS, Android and web), TanStack Query, Zustand, react-hook-form + zod and i18next (EN / PT). A shared TypeScript package holds schemas, ranking and route-ordering logic used by both the app and the backend. Supabase provides Postgres 17 + PostGIS, Auth, row-level security and Deno Edge Functions. A Python pipeline ingests the open data into committed SQL seeds, and a local Python service (wayfarer_pipeline serve) builds missing cities and answers the planner.
Why Does Open Innovation Matter?
- Your travel profile stays on your machine. The passports, preferences and interview answers that shape a trip are processed by a model running locally, not sent to a server I do not control.
- It costs nothing to run. There is no per-call fee for route titles, questions and reasons, so I can regenerate routes for every city while iterating.
- I can swap the model. Moving from Qwen to Gemma was an environment variable. That let me compare them on the same inputs and pick by latency and by whether the output survives validation, instead of accepting what one API gives me.
- I can change how the agent behaves. I constrained the model's output with a JSON schema and made code the authority on facts. With an open model I could see exactly where it failed (wrong language, invalid answer) and fix the prompt.
- It degrades gracefully. Because the model is only a writer, losing it means plainer titles, not a broken app.
Honest limits: a 4B model on a laptop takes tens of seconds for the planner's ranking, and the model runs on my PC, so the phone reaches it over the local network rather than on the trail. A fully on-device model is the next step.
My Agent Session
Prize Categories
-
Gemma (Google): Gemma 3 (
gemma3:4b) runs locally through Ollama as the model behind suggested routes and the trip planner, compared against Qwen on the same requests. -
Sentry Agent Tracing: a
gen_ai.chatspan per model call with model, latency and input/output tokens (JSON log lines even without Sentry). <!-- TODO before publishing: add a screenshot of the traces in Sentry (Insights → Agents). --> -
ElevenLabs:
POST /narrateturns a route or an attraction text into MP3 narration (English and Portuguese), so a walker can listen instead of looking. <!-- TODO: confirm it has been run end to end and mention a real result. --> -
SerpApi:
GET /places/webbrings live web results about a city into the service. <!-- TODO: confirm it has been run end to end. --> -
MongoDB Atlas: the planner's remembered interviews and the cities it picked (
GET /plan/history).







Top comments (0)