An AI travel companion & social network — it discovers seasonal destinations, plans your trips, travels beside you as a proactive agent, and runs on the trust of friends who have been there.
A GPS-verified travel social network with a proactive AI agent — discover seasonal destinations, plan & live trips, and get location-aware nudges ranked by the trust of friends who have actually been there, all in one app.
Travel apps today split planning, social proof, and recommendations across separate tools and lean on gameable star ratings. NOMAD's moat is GPS-verified visits — defensible social proof no competitor can fake — feeding a self-hosted AI agent on data no one else has.
Flutter app + NestJS microservices on AWS. Verified check-ins build a trust graph that ranks discovery, feed, and a self-hosted fine-tuned LLM agent. Monetize via Pro, affiliate bookings, and a B2B tourism-board dashboard. Launch India → MENA.
NOMAD is a travel companion, not a directory. It fuses three things that live in separate apps today — trip-planning utility, the social proof of a travel network, and a proactive AI agent that surfaces recommendations while you travel.
Location-aware nudges for food, stays, hidden gems, and friends' tips — ranked by social trust, triggered only on meaningful events.
A PlaceVisit is only created when GPS confirms the user is inside a geofence for a minimum dwell. Not self-reported. Not gameable.
Every recommendation is ranked by who in your network has actually been there. This is the moat that Google Maps and TripAdvisor cannot replicate.
Verified trip counts, visited-places count, and a timeline profile built from GPS-proven history — not curated posts.
Incognito mode is a filter, not deletion. Every feature works invisibly. Per-record visibility controls on visits, posts, and diary entries.
Trip bundle auto-downloads before travel begins. Works with zero signal — exactly when connectivity is worst and travellers need it most.
This is the single most important strategic fact about NOMAD. Every product decision should be evaluated against whether it feeds this loop.
Google Maps can aggregate reviews but cannot verify anyone was actually at a place. TripAdvisor can surface ratings but cannot prove your friend went there last month. NOMAD's credibility compounds with every trip logged — and that history belongs exclusively to the network that built it.
Discovery and social trust must ship before the AI agent. The agent is only as good as the graph it ranks against. Building the agent before the social graph is the most expensive mistake this project can make.
Trust → Graph → Agent. In that order.
Full feature set across all four delivery phases. Each phase ends with a shippable, testable product increment.
| Feature | What it does | Phase | Priority |
|---|---|---|---|
| Seasonal destination discovery | Top destinations ranked by location, season & weather | 1 | Hook |
| Friend / follower visit history | Shows who in your network has actually been to a place | 1 | Core |
| Itinerary builder + map | Route, places to visit, best stops, trip weather per location | 1 | Core |
| 3D map view | Interactive 3D terrain & buildings for route preview; 2D fallback | 1 | Enhanced |
| OAuth login | Google, Apple, Facebook sign-in — no password required | 1 | Core |
| Phone login | WhatsApp-style phone OTP (MSG91, Twilio fallback); additive Firebase Phone Auth path can auto-verify with zero code entry on supported Android devices, falling back to OTP automatically | 1 | Core |
| GPS visit check-in | Geofence auto-logs a verified visit. No manual check-in. The moat. | 2 | Core |
| Travel profile & timeline | Map of everywhere you've verifiably been; solo/group counts | 2 | Core |
| Travel Passport & badges | GPS-verified country stamps, region & category achievements | 2 | Engagement |
| Group trips | Create a group at trip start; add users or invite by SMS/email | 2 | Growth |
| Offline mode | Trip bundle auto-downloads; works without signal; safe purge | 2 | Core |
| Incognito mode | All features work; user's activity hidden from others | 2 | Privacy |
| Chat & snaps | DMs, group chats, ephemeral geo-tagged snaps (1h–24h custom expiry) | 2 | Core |
| Message reactions & receipts | Emoji reactions (real-time via Redis), read receipts, typing indicator | 2 | Engagement |
| Voice messages | Record m4a in-chat → S3 upload → waveform playback bubble | 2 | Engagement |
| Message translation | One-tap translate via LibreTranslate; cached per session; 12 languages | 2 | Utility |
| Solo traveler safety mode | Emergency contacts, scheduled check-ins, SOS alerts (manual + stillness) | 2 | Trust |
| Currency & budget tracker | Offline converter, live rates, trip expense tracker, group split bill | 2 | Utility |
| Post-trip shareable recap | Beautiful shareable card; Instagram Stories + WhatsApp | 2 | Growth |
| Reviews & ratings | Rate places, stays, transport; guarded by verified visit | 2 | Enhanced |
| Trip templates | Publish verified itineraries; others clone into their own trips | 2 | Growth |
| Real-data trip grounding | Live. Real Google Places, geocoding, driving times, weather, air quality & road routes ground every plan — any destination, not a seeded demo corridor | 3 | Moat |
| Real flights & hotels | Live. Real fares/stays via RapidAPI (booking-com15), deterministic ranking, deep-link Book/View cards in the plan — affiliate commission (Skyscanner/Booking.com partner programs) in progress | 3 | Revenue |
| Fine-tuned agent model | Live. Self-hosted QLoRA fine-tune on Mistral-7B, promoted only if it beats the prior version on a held-out eval set — no blind ships | 3 | Companion |
| Affiliate booking | Commission-bearing partner programs (Amadeus / Booking.com / Skyscanner) on top of the live RapidAPI data layer above | 3 | Revenue |
| Proactive AI travel agent | Live nudges ranked by social trust; pre-departure briefing | 3 | Companion |
| AI trip planner (premium) | Full itinerary from a prompt, grounded in social graph + budget | 3 | Revenue |
| Memory agent | Cross-trip recall — "you visited this café 2 years ago" | 3 | Delight |
| Annual Travel Wrapped | Yearly stats card — shareable, viral acquisition spike | 4 | Engagement |
| Verified Traveler creator program | Paid template marketplace; GPS-proven creator credibility | 4 | Revenue |
| Social price context | Friends' reported prices on place cards; ATM & exchange desk ratings | 4 | Utility |
| Live travel timeline & map | Real-time location sharing — opt-in, time-boxed, instant kill | 4 | Social |
| In-app media player | Destination playlists & videos via Spotify / YouTube SDKs | 4 | Future |
Two primary flows drive the entire product. The social layer connects them — a photo posted in the feed pins on the planning map; a friend's verified visit surfaces in discovery and on the route.
Social activity in the feed directly improves planning for everyone in the network. A photo posted → pins on the planning map. A verified visit → surfaces in discovery AND on route suggestions. A completed trip → cloneable as a template. Nothing is siloed.
Small team of 3–5 engineers. Each phase ends with a shippable increment. Scope discipline is enforced by the data flywheel — no feature ships before the data it depends on exists.
Demo deadline: August 2, 2026. The consumer product is built and live on real devices; Phases 3–4 (monetization, B2B, scale) are the raise.
| Phase | Status |
|---|---|
| Phase 1 — Foundation & Discovery MVP | ✓ ~100% |
| Phase 2 — Social trust, profiles, group trips | ✓ ~90% |
| Phase 3 — Monetization + proactive agent | ~40% — agent core, real Google Maps data grounding, real flights/hotels, and a fine-tuned model with an eval gate all live; subscription/affiliate revenue not started |
| Phase 4 — Creators, scale, engagement | ~5% |
Overall: demoable consumer MVP ≈ 85–90% · full 4-phase vision ≈ 50–55%.
Closed since v11 (no longer risks):
llm.nomad-social.com live (fixed URL, DNS on Cloudflare) (was #1 demo risk)Demo-critical next (Tier 1):
The agent shifts NOMAD from pull (user searches) to push (the app travels with you). It lives or dies on one rule: every interruption must be worth it.
1 · Detect — device GPS + time + pace + budget
2 · Decide — is this worth an interruption?
3 · Rank — by social trust, recency-weighted
4 · Notify — one glanceable line
5 · Learn — tap = more (LLM expands on demand)
Every location event could hit Maps + Places + an LLM. NOMAD's rule: LLM is called only when the user taps "tell me more" — never for every GPS ping. Batch and cache by area. Monthly AI cost is bounded because it fires on explicit taps, not background events.
The 7B model never invents a number — Python computes it, the LLM only writes prose around it. One Google Maps Platform key powers Places, Geocoding, Distance Matrix, Air Quality, Weather, and real road routes (Routes API); RapidAPI adds real flights and hotel fares. This works for any destination, live, not just a seeded demo corridor.
Replies render as markdown with day-by-day accordions; places become tappable photo cards with a detail drawer; Directions draws the actual road route on an in-app map, not a straight line. Users tick candidate places once ("pick your places") and the plan is built around that order.
| Nudge type | Trigger | Example |
|---|---|---|
| Place history | Dwelling near a landmark | "You're passing an 18th-century fort — ~40 min to explore." |
| Food | Mealtime + nearby + trust signal | "Lunchtime — 2 people you follow ate at a dhaba 300m ahead." |
| Stay | Evening + no booking detected | "No stay tonight yet — 3 highly-rated options within 2km." |
| Hidden gem | Passing a high gem-score place | "Only 4% of visitors find this spot — 3 of your friends have." |
| Memory recall | Near a place from a prior trip | "You rated a café here 5 stars 2 years ago — you're 300m away." |
| Pace check | Over-scheduled day | "You've hit 6 places today — your usual pace is 3–4. Slow down?" |
| Budget alert | Spend outrunning trip budget | "60% through budget, 4 days left — 3 affordable options nearby." |
| Pre-departure brief | Night before departure | Weather, friends' tips, first stop distance, open booking warnings. |
| Group divergence | Group members splitting up | "Looks like the group is splitting — want to set a meet-up point?" |
The agent runs fully self-hosted — no third-party API. The gateway's
LlmService calls an OpenAI-compatible endpoint. Live in dev:
Ollama serves the model on the dev box, exposed to the AWS gateway via a named
Cloudflare tunnel (llm.nomad-social.com — a fixed hostname, so the per-restart
tunnel-URL update this depended on earlier is gone for good); vLLM on a GPU instance for
production — swap by LLM_BASE_URL alone. The model is a fine-tuned open
instruct base, Mistral-7B-Instruct-v0.2 (Apache-2.0, ungated); the local 4-bit
data → train → eval QLoRA pipeline is proven on the dev box, with a strict gate —
a new version (v0 → v1 → v2 so far) is only promoted if it beats the prior one on the full held-out
eval set, never on vibes. Freshness comes from
RAG first, with periodic retraining layered on after launch.
⟳ Weekly (optional): retrain the model on accumulated data
Seven independent NestJS microservices, each with its own PostgreSQL database. Gateway service is the single HTTP entry point; messaging and feed use gRPC for internal transport. The agent additions introduce an Intelligence & Agent layer on top.
| Layer | Choice | Why |
|---|---|---|
| Web | Next.js (App Router) | SSR for place-page SEO; image optimization (Phase 3+) |
| Mobile | Flutter (Dart) | Cross-platform iOS + Android; background GPS, push, BLE in one codebase |
| Backend | NestJS microservices — 7 services | Independent deploys; gRPC for messaging/feed; HTTP proxy for explore/trips/media |
| Primary DB | PostgreSQL (6 isolated DBs via Prisma) | One DB per service; strong consistency; native geofence queries |
| Cache / realtime | Redis pub/sub | Message reactions, typing indicators, feed fan-out events |
| Media | S3 presigned URLs (6 upload contexts) | Client uploads direct to S3; media service manages MIME policy and signed URLs |
| Realtime | Socket.IO (notifications service, port 3005) | Chat events + push notifications — one persistent transport |
| Push | Firebase FCM (firebase-admin) | Background push for messages, likes, SOS; stale token cleanup built-in |
| Auth | JWT + Google OAuth + Apple Sign In | LinkedAccount table; Apple mandatory on iOS; Facebook deferred to Phase 2 tail |
| Translation | LibreTranslate (self-hosted Docker) | 12-language in-chat translation; no per-call API cost; session-cached in Flutter |
| Infra MVP | Docker Compose (local) | 7 services + 6 DBs + Redis in single compose file; AWS ECS path when scaling |
| Infra growth | ECS Fargate + ALB + ElastiCache + SQS | Auto-scaling; agent worker extracted separately |
Multiple complementary revenue streams that compound as the user base grows. None require selling or exposing individual user data.
500+ active users in launch corridor; discovery session time >3 min average
Trust signal shows on >30% of place views; group trip feature used in >20% of trips
Agent nudge tap-through >15%; Pro conversion >3% of MAU; nudges-per-mute <5
| Risk | Severity | Mitigation |
|---|---|---|
| Cold-start empty social graph | High | Launch one travel corridor (not one city); seed with Verified Traveler creators; group-trip invites are the organic acquisition loop |
| Notification fatigue | High | Trigger on meaningful events only; nudge budget per day; user-set chattiness; earn escalation |
| Background-location / App Store | High | Transparent consent flow; granular controls; Safety Mode as the positive framing for location permission |
| Chat abuse & unsolicited snaps | High | Block/mute/report + image moderation + rate-limit DMs from non-followers — ships with v1 messaging |
| Live-location stalking risk | High | Opt-in only, selected friends, time-boxed, instant kill; incognito as global override; never on by default |
| Apple Sign In omission | High | Apple Sign In is mandatory on iOS if any other social login is offered — build alongside Google/Facebook in Phase 1 |
| Over-scoping | High | Discovery + trust first; agent only in Phase 3 once graph data exists; evaluate every feature against the data flywheel |
| Media-player licensing | High | Never self-host commercial audio/video; embed licensed SDKs only; gate to Phase 4; legal review required before any music features |
| Battery drain | Medium | OS significant-change APIs only; never a GPS polling loop; continuous battery testing and published impact numbers |
| Agent cost per nudge | Medium | Cache by area; LLM only on "tell me more" tap; vector store for memory (cheaper than LLM inference) |
| GPS spoofing / visit gaming | Medium | Generous geofence + minimum dwell; flag statistically improbable position jumps; manual-confirm fallback indoors |
| Competing with Google / TripAdvisor | Medium | Compete only on social-trust + verified companion angle they cannot replicate; never compete on directory scale |
| Decision | Resolution | Notes |
|---|---|---|
| Mobile stack | ✓ Resolved Flutter (Dart) | Cross-platform iOS + Android. Riverpod for state, just_audio for voice playback, record for voice recording. |
| Backend architecture | ✓ Resolved NestJS microservices | 7 independent services. gRPC for messaging + feed; HTTP proxy for explore, trips, media. Each service owns its DB. |
| Weather provider | ✓ Resolved OpenWeatherMap | Per-location, per-date forecasts for trip itinerary. Good accuracy, reliable API. |
| Repo structure | ✓ Resolved Three-repo setup | nomad-api (NestJS monorepo with shared proto package) + nomad-app (Flutter) + nomad-ai (private — self-hosted LLM dev + QLoRA pipeline). Shared proto definitions via packages/proto. |
| Translation | ✓ Resolved LibreTranslate (self-hosted) | Docker service in compose stack. 12 loaded languages. Gateway proxy at /translate. Session-cached in Flutter — zero per-call cost. |
| LLM provider (Phase 3) | ✓ Decided Self-hosted open instruct model — no third-party API | Gateway LlmService calls an OpenAI-compatible endpoint — live in dev (Ollama on the dev box exposed to AWS via a Cloudflare tunnel) → vLLM on a GPU instance for prod; swap LLM_BASE_URL. The @anthropic-ai/sdk path is removed. QLoRA-tune Mistral-7B-Instruct-v0.2 (Apache-2.0) on NOMAD data — local 4-bit pipeline proven. Will benchmark a newer base (Llama-3.1-8B-Instruct) before production training; stock → fine-tuned swap gated on a held-out eval. RAG now → periodic retraining later. |
| Mobile auth & push (Firebase) | ✓ Resolved Firebase project nomad-1d31a |
Android applicationId com.nomadsocial.app (publishable; com.example.* is banned on Play). Google Sign-In via /auth/google/mobile (idToken with Web serverClientId); Apple Sign In; phone OTP (MSG91, Twilio fallback) with an additive Firebase Phone Auth path (auto-verify on supported Android devices, falls back to OTP automatically — 2026-07-05). FCM push via firebase-admin — backend reads a base64 service-account key from the EC2 .env, confirmed live. |
| Vector store (Phase 3) | Open pgvector recommended | Already in Postgres — zero new infra. Migrate to Pinecone / Qdrant if query latency degrades at scale. |
| 3D map provider | Open Mapbox GL recommended | Predictable billing and offline tile support (critical for the offline bundle). Deferred to Phase 3. |
| Launch corridor | Open India → MENA | India launch base (existing user community); UAE / Abu Dhabi as MENA expansion hub aligned with Hub71 strategy. |
| Pro pricing | Open Test both tiers | $4/mo or $40/yr vs $6/mo or $50/yr. Annual reduces churn. Consider $25/year founding-member for first 500 users. |
| B2B pilot targets | Open | UAE / Abu Dhabi (DCT Abu Dhabi), India tourism corridors (Rajasthan, Kerala). Aligned with Hub71+AI programme geography. |
NOMAD — Product Roadmap & System Architecture v11.0 · Updated July 2026 · Supersedes v10.0 · Source docs: nomad-api/apps/*/prisma/schema.prisma · packages/proto/messaging.proto · nomad-api/docs/*.md · docs/checklist.md