Roameo is a text-first AI travel planning workspace with one canonical session snapshot driving:
- chat
- itinerary
- map routes and markers
- saved POIs
- agent traces
- planning state
- session memory and preferences
The primary product surface is the split workspace:
- chat on the left
- map or itinerary on the right
- header controls for destination, dates, travelers, budget, and trip metadata
Backend/: Express + TypeScript backendroameo-frontend/: Next.js 16 + React 19 frontendpackages/contracts/: shared Zod schemas and TypeScript typesdatabase/: SQL and persistence assets
The source of truth is SessionSnapshot in packages/contracts/src/index.ts.
It contains:
- session metadata and provider settings
- session memory and planning state
- the active plan snapshot
- the canonical POI catalog
- conversation messages
- saved POI ids
- agent trace events
Canonical codepaths:
- Backend/src/api/router.ts
- Backend/src/runtime/turn-runner.ts
- Backend/src/runtime/subagents.ts
- Backend/src/services/plan-mutation-service.ts
- Backend/src/services/agent-tool-service.ts
- Backend/src/services/travel-tools.ts
- Backend/src/services/session-repository.ts
- roameo-frontend/app/chat/chat-page-client.tsx
- roameo-frontend/lib/session-store.ts
- roameo-frontend/lib/session-view.ts
Roameo is moving toward a router-first agentic runtime:
- lightweight conversational fast path for trivial turns
- semantic router for normal travel understanding
- deterministic tool execution and validation
- narrative/planning generation from canonical state
Important current runtime behavior:
- explicit new asks like
show me some restaurantsorshow me some staysoverride stale follow-up context - explicit new trip requests replace stale active-trip destination context
- multi-city trips preserve the active destination set instead of collapsing to one city
- itinerary and map route state update only when the canonical itinerary changes
- the map can still display discovered non-itinerary POIs without turning them into itinerary routes
Roameo uses deterministic orchestration plus LLM understanding. The goal is not “freeform autonomous code everywhere”; it is:
- semantic understanding by model
- explicit tool selection
- deterministic canonical state writes
- fail-fast validation
Current first-class internal agent tools live in Backend/src/services/agent-tool-service.ts:
getSessionSnapshotupdateTripHeadereditItineraryupdateSessionMemoryresetActiveTripContextsaveFollowUpContext
Those tools let the runtime and future autonomous agents read and modify the active session without bypassing the canonical repository and plan mutation paths.
AI providers:
- Gemini
- OpenAI
Direct product integrations:
- Google Places
- Google Geocoding
- Google Directions / Maps
- Open-Meteo
- Tavily
- Nager.Date
- Supabase
The current product direction is:
- direct Google Places/Maps remain the canonical POI and route truth
- Tavily remains editorial enrichment, not the primary POI source
- Gemini Maps grounding is useful as an optional semantic expansion/reranking layer, not as a replacement for canonical Places retrieval
The current backend config is aligned to live-tested Gemini model IDs:
- working text models:
gemini-flash-latestgemini-2.5-flashgemini-2.5-flash-litegemma-3-27b-itgemma-4-31b-it
- working embedding model:
gemini-embedding-001
Current defaults in the backend:
- router / understanding:
gemma-4-31b-itwithgemini-2.5-flashfallback - narrative / synthesis:
gemini-flash-latestwithgemini-2.5-flashfallback
Requirements:
- Node.js
>=22 - npm workspaces
GOOGLE_MAPS_API_KEY- at least one of
GEMINI_API_KEYorOPENAI_API_KEY
Install:
npm installRun backend:
npm run devRun frontend:
npm run dev:frontendBuild all workspaces:
npm run buildTypecheck:
npm run typecheckTest:
npm run testCore backend environment variables:
PORTAPP_BASE_URLWS_BASE_URLGEMINI_API_KEYGEMINI_MODEL_FASTGEMINI_MODEL_BALANCEDGEMINI_MODEL_DEEPGEMINI_MODEL_ROUTERGEMINI_MODEL_ROUTER_FALLBACKGEMINI_MODEL_NARRATIVEGEMINI_MODEL_NARRATIVE_FALLBACKGEMINI_MODEL_GROUNDINGGEMINI_MODEL_GROUNDING_FALLBACKGEMINI_MODEL_EMBEDDINGOPENAI_API_KEYOPENAI_MODEL_FASTOPENAI_MODEL_BALANCEDOPENAI_MODEL_DEEPGOOGLE_MAPS_API_KEYTAVILY_API_KEYSUPABASE_URLSUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYROAMEO_ENCRYPTION_SECRET
Frontend runtime:
NEXT_PUBLIC_BACKEND_URL
Start with docs/README.md.
Core docs:
- docs/AUTONOMOUS_AGENTS.md
- docs/CANONICAL_ARCHITECTURE.md
- docs/API_REFERENCE.md
- docs/PLANNING_RUNTIME.md
- docs/FRONTEND_SURFACE.md
- docs/OPERATIONS_AND_TESTING.md
Supporting note: