Travel Project ◆ Hello Romy
Tech Stack Map
◆ Build Status →
To make the PDF: press Ctrl/Cmd + P → Destination Save as PDF → Paper A4 → Margins None → tick Background graphics → Save. This grey strip won't print.  ·  ← Back to the live Build Status
Travel Project .

Technology
Stack Map

The whole estate on one foundation. Three product arms, the operational spine that joins them, and every third party they touch. An orientation brief for the team.

Prepared for
The team
Owner
Matt Coyle, Director
Date
July 2026
Version
v3.5 · live stack
The three arms
Arm 1 · Marketing & Lead — the page builder (WRLD) Arm 2 · Rapid Book — the quote engine Arm 3 · Hello Romy — the concierge
Status markers
Live in production In progress Planned Built, off Parked — awaiting access

One foundation under everything. Every arm runs on the same four tools — Netlify (hosting/deploys), Supabase (data, auth, storage), Claude (the AI), Resend (email) — and the same security pattern. Learn it once and it applies across the whole estate.

Travel Project · Confidentialtravelproject.au · helloromy.ai
Overview · how it all fits togetherThe whole estate
Read this page first

The big picture

A client moves left to right through the business. Each stage is owned by one arm. Safari Portal is the operational spine they all write to and read from. Underneath sits one shared foundation and one shared supplier core.

DiscoverEnquireQuoteBook (agent · human)Travel
Arm 1
Live
Marketing & Lead

The page builder, now a self-serve product WRLD. Branded Stay & Journey pages, AI auto-fill, lead capture, cross-sell. Top of funnel.

Next.js · Supabase · Netlify · Stripe
Arm 2
To build
Rapid Book

The client-facing quote engine. Assembles flights, hotels, transfers, touring, cruise into a costed, on-brand itinerary. Quotes, doesn't book.

brief written
Arm 3
Core live
Hello Romy

The AI concierge. A traveller PWA plus a staff Studio. Romy holds the whole trip and helps proactively while the client travels.

PWA · Supabase · ElevenLabs
▼ all three write to & read from ▼
Operational spine · Safari Portal

System of record for the agency: deals, pipeline, invoicing, financials, the guest portal for passports and PII, itineraries and lookbooks. Rapid Book writes quotes and invoices here; booking documents from here feed Hello Romy. Not a thing we're rebuilding.

Shared foundation · same under every arm

Netlify · Supabase · Claude · Resend. Hosting and git-push deploys, Postgres with auth/storage/RLS, the Claude API for extraction, and branded email.

Shared supplier core

HotelBeds · Stuba · Room-Res · Mozio. Hotels and rate-compare (Otto), transfers and experiences (York). Drawn on by Rapid Book and Hello Romy alike.

The one-line version · Arm 1 finds and captures the client. Arm 2 quotes the trip. A human books it. Arm 3 looks after them while they travel. Safari Portal sits in the middle holding the truth, and one shared toolchain runs the lot.

OverviewPage 2
Arm 1 · Marketing & LeadWRLD · wrld.au
Live
Arm 1

Marketing & Lead

An internal web app — now a self-serve SaaS product, WRLD — to build, save and publish branded landing pages for travel offers, capture leads, and cross-sell across pages. The builder is login-gated; published pages are public static HTML served from storage.

The stack
Framework — Next.js 15 + TS (App Router, React)
Hosting / CI — Netlify, auto-deploy from GitHub tp-page-builder
Data / Auth — Supabase (Google OAuth, RLS on tracking schema)
AI — Claude, brief → JSON page data
Payments — Stripe (subscription + card capture)
Email — Resend (send.travelproject.au)
Supporting services
Maps — MapLibre GL + OpenFreeMap
Geocoding — Google Places (New) for exact hotel pins, OSM fallback
Images — sharp · Uploads — direct-to-Supabase signed URLs
Reviews — Elfsight Live
Media — Google Drive Built, off (needs service-account key)
Hosts

Builder / product wrld.au · published pages stays. / journeys.travelproject.au · collection hub collection.travelproject.au (per-agent /m/, /c/ …).

What makes it clever
  • Per-agent hubs. A URL letter scopes pages and cross-sell to that agent — no cross-promotion between agents.
  • Live cross-sell. Pages read a catalogue index at runtime, so new deals appear in older pages automatically.
  • Collection hub with an interactive globe map — type / price / "best time" filters, far-side pins auto-hidden, hotel-exact Google pins.
  • Baked-in social proof. Luxury Travel Gold List 2025 + 5.0 Google rating + Elfsight reviews, served by URL.
  • Brief templates with tier tags (t1/t2/t3) the extractor honours.
Roadmap

The multi-tenant tracking & attribution layer, packaged as WRLD — a standalone commercial product. Enquiry + funnel events done; page-view tracking, Stripe Connect bookings and reporting views next.

Arm 1 · Marketing & LeadPage 3
Arm 2 · Rapid BookQuote engine · to build
To build
Arm 2

Rapid Book

A client-facing engine that turns a destination, dates and a party into a fully costed, on-brand itinerary in minutes. It assembles and prices — the agent books. Its own landing page / product, distinct from Hello Romy. Brief written; recommended to live in the same stack.

What it pulls together · search & price only, no booking
Flights — Sabre (fare shopping, no ticketing)
Hotels — Otto (Stuba + HotelBeds + Room-Res: rate, room, cancellation, markup)
Hotel perks — Design Hotels · LTC · Signature
Ground — Mozio + rail · Cruise — Cruise HQ
Touring — Tour Atlas (Tour Tek REST API — access requested)
Context — traveller profiles (perks + personalisation)
The on-brand guard rails
  • Great timings. Real transfer times, arrival buffers, no over-packed days.
  • On-brand picks. Considered, private where it counts, personalised — never generic filler.
  • Brand voice on any client copy.
The hard line
  • Quote & assemble only — never book, hold inventory, or take payment.
  • Safari Portal is the source of truth — Rapid Book writes to it, never replaces it.
  • The agent can override any engine choice and commits the booking.
Arm 2 · Rapid BookPage 4
Arm 3 · Hello Romyhelloromy.ai
Core live
Arm 3

Hello Romy

A white-label AI travel concierge. Two surfaces over one shared backend. Romy — the voice & chat concierge — holds each traveller's whole trip and helps proactively. Core live; proactive engine in progress.

Surface A · PWA Live
app.helloromy.ai

Installable PWA, offline service worker, web push, auto-updating. Renders the trip: itinerary, docs, weather, SOS, checklist, Romy.

Surface B · Studio Live
studio.helloromy.ai

Staff dashboard. Onboards clients, runs Otto & York, deploys the traveller app. Multi-tenant per agency.

Backend Live
Supabase (Sydney)

One project, single source of truth. Postgres, magic-link auth, private storage, RLS. Two Netlify sites, one monorepo.

The engine pieces · all keyed server-side in Netlify functions
PieceServiceStatusNotes
ConciergeElevenLabsWiring keysRomy voice/chat, signed URL per session. Turning on: keys on the app site + publish the agent.
OnboardingClaude parseLiveDrop many booking PDFs → one structured itinerary + editable review panel
HotelsOttoLiveSearch by hotel name (via hotel_xref) → room types & rates → compare vs Stuba. Room-Res booking engine wired, parked behind its token. Multi-room occupancy.
Ground / exp.YorkLiveMozio transfers + HotelBeds experiences
Visa & safetySmartravellerLiveFree Australian-Gov feed → visa/entry + safety level + official apply link. Powers SOS (per-country + Australian embassy). Tool check_entry_requirements.
Romy memorySupabaseReadyremember_about_guestprofiles.memory, surfaced next session. Plus interests.
EscalationResendReadynotify_designer emails the creating designer (resolved server-side). Also the branded welcome email.
Insurancenib TravelParkedget_insurance_quote (OAuth → Quotes API). Awaiting partner API access. Presents quote + PDS, never advises.
ExperiencesViatorParkedsuggest_experiences (freetext). Awaiting API key. Booking + Stripe to come.
Weatheropen-meteoLiveWeather + geocoding from the city name, free, no key
WelcomeHeyGenIn progressAI-avatar welcome video, async render
Flight + dataRapidAPIIn progressAeroDataBox flight status (push) + FX.
PaymentsStripePlannedIn-app checkout: prebook → pay → book, plus Viator/nib purchase + proactive offers

Romy's tools (ElevenLabs server tools): check_entry_requirements, remember_about_guest, notify_designer, get_insurance_quote, suggest_experiences. All secured by a shared X-Romy-Secret header + client_ref dynamic variable.

Arm 3 · Hello RomyPage 5
Reference · Foundation & IntegrationsEvery service, who uses it
The shared toolchain, then every integration

Foundation & integrations

Badges show which arm uses each service. MK Marketing & Lead · RB Rapid Book · HR Hello Romy.

ServiceRoleAuthUsed byStatus
NetlifyHosting + serverless functions, git-push deployPlatform credsMK RB HRLive
SupabasePostgres, Auth, Storage, RLSpublishable + service-roleMK RB HRLive
Anthropic ClaudePDF/brief → structured dataAPI key (env)MK RB HRLive
ResendBranded email (per-arm verified domain)API key + domainMK HRLive
HotelBeds ApitudeHotels (Otto), activities (York)API key + X-SignatureRB HRLive
Stuba (Yanolja HAPI)Hotel rate compare vs HotelBedsAuthApiKey, IP-whitelistedRB HRLive · proxy
Room-ResHotel booking engine (search / prebook / book / cancel)Bearer JWT (env)RB HRAwaiting token
MozioGround transfers (York)API-KEY headerRB HRLive
QuotaGuard StaticStatic-egress proxy → fixed IPs for IP-locked suppliers (Stuba)proxy URL (env)RB HRLive
SmartravellerVisa/entry + safety advisories + apply links (SOS)None, freeHRLive
nib TravelTravel insurance quote/purchaseOAuth2 password grantRB HRAwaiting API
Viator Partner APIBookable tours/experiences (merchant)API key (exp-api-key)HRAwaiting key
ElevenLabsRomy voice/chatAPI key → signed URLHRWiring keys
HeyGenAI-avatar welcome videoAPI keyHRIn progress
RapidAPIAeroDataBox flight status, FX, OTA price benchmark (Otto)X-RapidAPI-KeyHRIn progress
open-meteoWeather + geocodingNone, freeHRLive
Google Maps (Places New)Hotel name → exact map pin (OSM fallback)API key (env)MKLive
StripeWRLD subscription; in-app checkout for offers; Connect for Arm 1 attributionAPI key (env)MK HRPlanned
Sabre · Cruise HQ · Tour Atlas · Design Hotels/LTC/SignatureRapid Book sourcesvarious (confirm)RBPlanned
MapLibre + OpenFreeMap · sharp · ElfsightMaps · images · reviewsnone / embedMKLive
Google DriveMedia import (optional — direct upload added)service-account keyMKOff
Safari PortalOperational spine — deals, invoicing, PII, itineraries, lookbooksAPI key (env)RB HRLive
Reference · Foundation & IntegrationsPage 6
Reference · Security & GlossaryRead before you touch anything
The pattern that repeats everywhere

Security model

The rule that holds across all arms
  • No secret ever reaches the browser. The client only gets the Supabase publishable key. Service-role + every supplier key live only in serverless function env.
  • All privileged writes go through functions using the service role. RLS + column grants stop client roles writing sensitive fields.
  • Tenant isolation derived server-side from the staff row, never trusted from the request.
  • Travellers see only their own trip. RLS on the profile row; documents private via owner-scoped signed URLs.
  • Romy tools use a shared secret header + a client_ref dynamic variable; the designer's email is resolved server-side and never exposed.
Auth at a glance

Hello Romy — passwordless magic-link for staff & travellers (same provider, different authorization). Page builder / WRLD — Supabase Auth + Google OAuth, builder fully gated.

For the security-minded partner

The model is sound and consistent: secrets in functions, RLS for isolation, signed URLs for private docs. The Stuba IP watch-item is resolved — calls egress through a static-IP proxy (QuotaGuard), fixed IPs whitelisted with Stuba, so it no longer breaks on Netlify IP rotation.

Names a developer will hear · glossary
Otto — hotel name search + cross-platform price compare (HotelBeds + Stuba + Room-Res via hotel_xref).
York — ground transfers (Mozio) + experiences (HotelBeds activities).
Romy — the ElevenLabs voice/chat concierge holding each traveller's trip.
hotel_xref — ~120k-row table mapping Stuba ↔ HotelBeds (↔ Expedia) IDs + names.
profiles — one row per traveller: PII, itinerary, documents, interests, memory, feed.
Safari Portal — operational spine: deals, invoicing, PII, itineraries, lookbooks.
The loop — Romy's proactive feed: scheduled nudges + offers (flight-landing, geofence).
Deploy — Studio action that builds a traveller's app from their parsed itinerary.
WRLD / PWA / RLS — the page-builder product / installable traveller app / Postgres Row-Level Security.
Rapid Book / Lookbook — the quote engine / on-brand trip presentation.
First-week orientation · the one-paragraph version

Three arms, one foundation. Marketing & Lead (WRLD) is a live Next.js page builder that finds and captures clients. Rapid Book is a quote engine to be built that prices a trip and hands it to Safari Portal. Hello Romy is a live concierge — a traveller PWA and a staff Studio over Supabase, with Romy on ElevenLabs looking after the client as they travel. Everything runs on Netlify, Supabase, Claude and Resend; secrets stay in serverless functions; and Postgres RLS keeps tenants and travellers apart. Learn that pattern first and the rest follows.

Reference · Security & GlossaryPage 7