travel-management-travellers is a functional, AI-first travel management platform for web and mobile. It exists so that travellers can plan, organize, and manage multi-booking trips — flights, hotels, ground transport, and activities — through chat or voice, with an AI travel agent that retrieves verified trip data, suggests itinerary changes, compares options, and generates recovery plans.
The product's intent is a calm, intelligent concierge that visibly handles complexity: a single translucent cockpit that layers many sources of truth (bookings, travellers, constraints, live status) without hiding any of them. The audience is mobile-first, competent, and slightly anxious about money and missed connections. They want the platform to feel like it is handling the complexity for them — not a spreadsheet, and not a discount OTA.
The platform is built incrementally, with all core workflows using persistent data and working end to end. Real integrations are used where credentials are available; clearly labelled mocks are used otherwise. Hosting, CI/CD, secrets management, and payment infrastructure are handled externally.
The platform delivers a traveller-facing web and mobile application (TypeScript with React Native/Expo) backed by a TypeScript backend with typed APIs and a relational database. It provides:
Actors. The active human personas are the Traveller and the Approver / Authorizing Traveller. The AI Travel Agent (conversational assistant) is a system actor that serves travellers through tool-calling agents. External travel providers, payment providers, maps, speech-to-text, and text-to-speech services are provider-owned or externally handled.
Narrow exclusions. Hosting, CI/CD, secrets management, and payment infrastructure are handled externally and are not built by this product. No functionality may be claimed as verified unless it is actually implemented and tested.
Delivery ownership. The platform owns its own application identity: travellers self-enroll through Sign Up and return through Login, and protected destinations require an established session. The Landing page is anonymously reachable and explains the product before any identity is established. All protected destinations — Dashboard, Assistant, Trip Workspace, Trips, Import Bookings, Booking Review, Trip Data, Preferences, AI Operations, Approvals, Activity Log, and Disruptions — require an authenticated session and enforce server-side access controls.
Provider and external ownership. Travel search, booking retrieval/changes/cancellations, flight status, maps, speech-to-text, text-to-speech, and payment execution are provider-owned or externally handled. The platform integrates with them through modular adapters and never claims provider functionality it has not verified. Where credentials are unavailable, clearly labelled mocks stand in for the provider.
Current vs. future. Everything described in this document is current. Hosting, CI/CD, secrets management, and payment infrastructure are explicitly external and are not part of the current build. No future-horizon product capabilities are asserted.
No reference directive in this project declares content_source authority, so no source content inventory is included.
FR-1 — Self-service traveller enrollment (required_inference) As a Traveller, I should be able to create my own account through Sign Up so that I can begin using the platform without an invitation.
FR-2 — Returning verification and secure session establishment (required_inference) As a Traveller, I should be able to log in through Login so that I can resume my protected travel data and actions.
FR-3 — Session management (explicit) As a Traveller, I should have my session managed securely so that my protected travel data and actions remain bound to me.
FR-4 — Dashboard for upcoming trips, bookings, alerts, and pending approvals (explicit) As a Traveller, I should see upcoming trips, bookings, alerts, and pending approvals on my Dashboard so that I know what needs my attention.
FR-5 — Conversational AI with streaming responses (explicit) As a Traveller, I should converse with the AI travel agent and see responses stream in so that I get fast, readable answers.
FR-6 — Voice input (explicit) As a Traveller, I should speak to the AI travel agent so that I can plan and manage trips hands-free.
FR-7 — Tool-calling agents retrieve trip data (explicit) As a Traveller, I should have the AI travel agent retrieve my trip data through tool calls so that answers reflect my actual bookings.
FR-8 — Suggest itinerary changes (explicit) As a Traveller, I should receive suggested itinerary changes from the AI travel agent so that I can improve my trip.
FR-9 — Compare options (explicit) As a Traveller, I should have the AI travel agent compare options so that I can choose between alternatives.
FR-10 — Generate recovery plans (explicit) As a Traveller, I should have the AI travel agent generate recovery plans so that I can respond to a disruption.
FR-11 — Ground responses in verified data (explicit) As a Traveller, I should have AI responses grounded in verified data so that I am never misled about bookings, prices, availability, or travel times.
FR-12 — Editable user memory (explicit) As a Traveller, I should be able to edit the AI travel agent's memory of me so that its behaviour reflects my current situation.
FR-13 — Versioned prompts (explicit) As a Traveller, I should have the AI travel agent's prompts versioned so that changes are traceable.
FR-14 — Debugging traces (explicit) As a Traveller, I should be able to inspect debugging traces so that I can understand how a response was produced.
FR-15 — Automated AI evaluations (explicit) As a Traveller, I should have automated AI evaluations run so that agent quality is checked continuously.
FR-16 — Create trips (explicit) As a Traveller, I should create trips so that I can organize multi-booking travel.
FR-17 — Manage flights, hotels, transport, and activities (explicit) As a Traveller, I should manage flights, hotels, transport, and activities within a trip so that every part of my journey is covered.
FR-18 — Import booking confirmations from emails, PDFs, and screenshots (explicit) As a Traveller, I should import booking confirmations from emails, PDFs, and screenshots so that I do not have to re-enter them.
FR-19 — Extract, validate, and store booking details (explicit) As a Traveller, I should have booking details extracted, validated, and stored so that my trip data is accurate.
FR-20 — Correct extracted booking errors (explicit) As a Traveller, I should be able to correct errors in extracted booking details so that my stored data is right.
FR-21 — Treat imported documents as untrusted data (explicit) As a Traveller, I should have imported documents treated as untrusted data so that a malicious document cannot corrupt my trip data.
FR-22 — Central source of truth for bookings, travellers, constraints, and dependencies (explicit) As a Traveller, I should have a central source of truth for bookings, travellers, constraints, and dependencies so that every part of the platform agrees.
FR-23 — Separate mandatory travel constraints from optional preferences (explicit) As a Traveller, I should separate mandatory travel constraints from optional preferences so that the platform never treats a preference as a hard rule.
FR-24 — Interactive trip workspace with booking cards (explicit) As a Traveller, I should work with booking cards in an interactive trip workspace so that I can see and manage each booking.
FR-25 — Editable itinerary timeline (explicit) As a Traveller, I should edit the itinerary timeline so that I can reorder and adjust my trip.
FR-26 — Maps (explicit) As a Traveller, I should see maps in the trip workspace so that I can understand where my bookings are.
FR-27 — Travel options (explicit) As a Traveller, I should see travel options in the trip workspace so that I can consider alternatives.
FR-28 — Separate read, write, and action permissions (explicit) As a Traveller, I should have read, write, and action permissions separated so that reading my data never implies the ability to change or act on it.
FR-29 — Explicit user authorization before booking, paying, or cancelling (explicit) As an Approver / Authorizing Traveller, I should explicitly authorize before any booking, payment, or cancellation so that nothing happens without my consent.
FR-30 — Itemized approval requests with providers, prices, and booking details (explicit) As an Approver / Authorizing Traveller, I should receive itemized approval requests with providers, prices, and booking details so that I know exactly what I am authorizing.
FR-31 — Record actions and their actual execution results (explicit) As an Approver / Authorizing Traveller, I should have actions and their actual execution results recorded so that I can confirm what really happened.
FR-32 — Enforce server-side access controls and protect user data (explicit) As a Traveller, I should have server-side access controls protect my data so that my travel information stays private.
FR-33 — Payment approval workflows through external APIs (explicit) As an Approver / Authorizing Traveller, I should have payment approval workflows run through external APIs so that payments are handled by the payment infrastructure.
FR-34 — Detect flight or booking changes (explicit) As a Traveller, I should have flight or booking changes detected so that I learn about disruptions without hunting for them.
FR-35 — Identify affected itinerary items (explicit) As a Traveller, I should see which itinerary items are affected so that I understand the impact.
FR-36 — Suggest feasible alternatives (explicit) As a Traveller, I should receive feasible alternatives so that I have a way forward.
FR-37 — Review and approve a recovery plan (explicit) As a Traveller, I should review and approve a recovery plan so that recovery happens only with my consent.
FR-38 — Responsive, accessible UI with light/dark themes (explicit) As a Traveller, I should use a responsive, accessible UI with light and dark themes so that the platform works wherever I am.
FR-39 — Notifications (explicit) As a Traveller, I should receive notifications so that I learn about changes and pending approvals.
FR-40 — Deep links (explicit) As a Traveller, I should be able to follow deep links so that I land directly on the relevant trip, booking, or approval.
FR-41 — TypeScript, typed APIs, and a structured database (explicit) As a Traveller, I should have the platform built on TypeScript, typed APIs, and a structured database so that behaviour is predictable and data is consistent.
FR-42 — Background jobs, retries, idempotency, verified webhooks, and streaming responses (explicit) As a Traveller, I should have background jobs, retries, idempotency, verified webhooks, and streaming responses so that long-running work completes reliably and never duplicates.
FR-43 — Modular integrations (explicit) As a Traveller, I should have modular integrations for travel search, booking retrieval/changes/cancellations, flight status, maps, speech-to-text, and text-to-speech so that each provider can be used or replaced independently.
FR-44 — Real integrations where credentials are available; clearly labelled mocks otherwise (explicit) As a Traveller, I should have real integrations used where credentials are available and clearly labelled mocks otherwise so that I always know what is real.
FR-45 — Do not claim unverified functionality (explicit) As a Traveller, I should never be shown a claim of functionality that has not been verified so that I can trust the platform.
Product context. The Traveller is the primary human actor. They are mobile-first, competent, and slightly anxious about money and missed connections. They plan, organize, and manage multi-booking trips — flights, hotels, ground transport, and activities — through chat or voice, and they expect the platform to visibly handle complexity on their behalf.
Primary goal. To keep a multi-booking trip coherent and under control: know what is coming up, keep every booking accurate, and be able to change or recover the trip without losing money or missing a connection.
Distinct accepted responsibilities. The Traveller signs up and logs in and maintains a secure session. They view a Dashboard of upcoming trips, bookings, alerts, and pending approvals. They converse with the AI travel agent through streaming chat and voice input. They work in an interactive trip workspace with booking cards, an editable itinerary timeline, maps, and travel options. They create trips and manage flights, hotels, transport, and activities. They import booking confirmations from emails, PDFs, and screenshots, and correct extracted booking errors. They separate mandatory constraints from optional preferences. They review and approve recovery plans after disruptions. They use a responsive, accessible UI with light and dark themes, notifications, and deep links.
Relevant inputs and decisions. Which trip to open; which booking to edit; whether an extracted field is correct; which items are mandatory constraints versus optional preferences; whether a suggested itinerary change or compared option is worth taking; whether a recovery plan is acceptable.
Interactions with other accepted participants. The Traveller initiates nearly every journey. They hand off to the AI Travel Agent (conversational assistant) for retrieval, suggestions, comparisons, and recovery plans, and they receive grounded responses with sources chips. They hand off to the Approver / Authorizing Traveller role — which they themselves may occupy — for explicit authorization before booking, paying, or cancelling. They interact with external providers indirectly through the platform's modular integrations.
Observable success. The Dashboard shows an accurate picture of upcoming trips, bookings, alerts, and pending approvals. Imported bookings appear correctly in Trip Data after review. The itinerary timeline reflects their edits and warns them when a constraint is violated. Approved actions show their actual execution results. A disruption produces a reviewed and approved recovery plan that is applied to the itinerary.
Product context. The Approver / Authorizing Traveller is the human actor who holds the decision over money and irreversible actions. In many trips this is the same person as the Traveller, but the responsibility is distinct: this role exists wherever a booking, payment, or cancellation must be explicitly authorized before it happens. They are the person who would be upset if money moved without their consent.
Primary goal. To authorize only what they actually intend, with full knowledge of the provider, price, and booking details, and to be able to confirm afterwards that the approved action executed as intended.
Distinct accepted responsibilities. They review itemized approval requests containing providers, prices, and booking details. They grant explicit authorization before booking, paying, or cancelling. They rely on separated read, write, and action permissions so that reading data never implies the ability to act on it. They rely on recorded actions and their actual execution results to confirm that approved actions executed as intended. They also review and approve recovery plans that contain bookings, payments, or cancellations.
Relevant inputs and decisions. The itemized provider/price/time breakdown on an approval card; whether the price and provider are acceptable; whether to drag the authorize slider and confirm; whether to decline; whether a recovery plan's alternatives are acceptable.
Interactions with other accepted participants. The Approver / Authorizing Traveller receives approval requests generated from the Traveller's and the AI Travel Agent's work. They hand the authorized action back to the platform for execution through external provider and payment APIs, and they receive the execution result stamped onto the same card and recorded in Activity Log.
Observable success. Every booking, payment, or cancellation they authorized executed as described, and every one they declined did not execute. The Activity Log shows the requested action and its actual execution result. No action executed without their explicit authorization.
Product context. The AI Travel Agent is the system actor that serves travellers through tool-calling agents. It is not a human persona; it is the conversational intelligence of the platform, and it is deliberately visible — its voice is rendered in the primary violet, and its work is shown as streaming text, tool-call traces, and sources chips.
Primary goal. To answer travellers accurately and usefully while never inventing bookings, prices, availability, or travel times.
Distinct accepted responsibilities. It retrieves trip data, suggests itinerary changes, compares options, and generates recovery plans through tool calls. It grounds every response in verified data. It maintains editable user memory, versioned prompts, debugging traces, and automated AI evaluations. It treats imported documents as untrusted data and validates extracted information before it becomes trusted.
Relevant inputs and decisions. The traveller's chat or voice input; retrieved trip data; tool-call results; user memory; the active prompt version; validation outcomes for imported documents.
Interactions with other accepted participants. It serves the Traveller directly in Assistant and Trip Workspace. It surfaces approval requests to the Approver / Authorizing Traveller rather than executing booking, payment, or cancellation itself. It calls external provider integrations for travel search, booking retrieval/changes/cancellations, flight status, maps, speech-to-text, and text-to-speech.
Observable success. Every response carries a sources chip row naming the exact bookings it was grounded in. No response contains an invented booking, price, availability, or travel time. Traces exist for responses, prompt versions are retained, evaluations run, and imported documents are validated before their data is trusted.
The creative direction is authoritative for this section. The muse is Michal Malewicz, and the headline idea is layered translucency for an AI travel cockpit — frosted glass over a twilight gradient, one hot amber signal. The visual metaphor is a single translucent surface that layers many sources of truth (bookings, travellers, constraints, live status) without hiding any of them.
| Role | Value |
|---|---|
| Background | #EFE9FB |
| Surface | #FBF8FF |
| Text | #171326 |
| Primary | #4B2AC7 |
| Accent | #F26B2A |
| Muted | #6E6690 |
The background is a soft lavender-tinged gradient field from #EFE9FB to #F6D9E8 to #DCE9FF at 160deg — never pure white. Cards and panels are frosted white at 62–78% opacity with a 1px rgba(255,255,255,0.75) top edge and a #FFFFFF 8% bottom edge, blur(18px). Primary #4B2AC7 is used for the AI agent's own voice, active nav, focus rings, and links. Accent #F26B2A is the single hot signal reserved for anything requiring the traveller's decision: pending approvals, disruption alerts, the record button, and price deltas. Muted #6E6690 carries metadata, timestamps, and secondary labels.
Ground flips to #0E0B1A with panels at #1B1630 / 78%. Accent text rises to #FF8A4D for contrast. Primary becomes #A78BFA for the AI voice.
-0.02em, sentence case for product copy and uppercase micro-labels at 11px with 0.14em tracking for section eyebrows and status chips. Headings sit large and confident; the dashboard greeting is a display moment, not a label.clamp(34px, 6vw, 56px) for the hero line; clamp(24px, 3.2vw, 34px) for page titles; 20px section heads; 16px body; 14px dense table text; 13px metadata.Generous continuous radii: 28px for hero glass panels, 20px for booking and approval cards, 14px for inputs and buttons, 999px for pills, chips, and the voice record control. Cards are never flat rectangles — each has a 1px luminous top border, a soft inner highlight, and a diffuse shadow 0 18px 40px -24px rgba(23,19,38,0.35). Blob and capsule shapes appear only as ambient background decoration behind the hero, never as containers for text. Icons are 1.75px stroke, rounded caps, drawn on a 24px grid.
A layered dashboard: a full-bleed gradient field sits behind everything, and content floats on it in stacked translucent planes. Desktop (1280px) uses a 12-column grid with a persistent 260px left rail (Trips / Bookings / Approvals / Agent) rendered as a frosted panel, a centre workspace column, and a right-hand agent dock (360px) that stays open for chat and voice. Tablet (768px) collapses the rail to an icon strip and moves the agent to a bottom sheet. Mobile (375px) is a single column: sticky glass header with trip switcher, scrollable day timeline, floating voice button bottom-right, agent as a full-height sheet. The trip workspace is a horizontal day-strip above an editable vertical itinerary; booking cards sit in a responsive 1/2/3-up grid. All text and controls stay whole inside their panel at every breakpoint; the gradient and decorative blobs bleed off-edge freely.
No stock photography of people or planes. The visual vocabulary is the interface itself plus abstract material: soft 3D gradient blobs and glass primitives floating behind the hero, and — for each destination — a tinted duotone map fragment or a generative gradient tile generated from the booking's coordinates and dates, sitting behind the itinerary header. Airline and hotel marks appear as small monochrome glyphs inside glass chips. Disruption and approval views use a diagrammatic route line drawn as a luminous stroke over the gradient, with amber nodes marking affected segments.
The layered glass cockpit. The first screen is not a centred headline with a button. A full-bleed gradient field (lavender → blush → sky) fills the viewport. On the left, a 28px-radius frosted panel occupies columns 1–7 and holds the traveller's next trip: an oversized destination line set at clamp(34px, 6vw, 56px) in Plus Jakarta Sans bold, spanning the panel width, with the trip dates, traveller count, and a live "next event in 14h 20m" counter beneath it. Overlapping the bottom-right corner of that panel, offset by −40px, sits a second, smaller glass card showing the active agent: a streaming one-line status ("Checking BA117 status…"), a 5-bar voice waveform, and an amber "Review 2 approvals" pill. To the right, columns 8–12, a vertical stack of three narrow glass booking chips (flight, hotel, transfer) with tabular times, each slightly rotated 0.5deg and staggered vertically so they read as physical cards on the surface. A thin luminous route line is drawn across the gradient behind the panels, entering from the left edge and exiting bottom-right off-canvas.
The concept recomposes only accepted content and controls: the trip, its dates and traveller count, the agent's streaming status and voice waveform, the pending-approval count, and the flight/hotel/transfer bookings. It introduces no new behaviour, page, or destination. There is no centred composition, no blue button, and no gradient blob behind a headline.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
translateY(12px) + opacity reveal, staggered 60ms, so the layered cockpit assembles itself plane by plane; the agent's status line streams in word-group by word-group at 40ms intervals with a subtle upward 4px drift, and the waveform responds to amplitude — the outcome is a cockpit that reads as alive and already handling complexity, without any invented data or new behaviour.translateY(12px) + opacity panel reveals staggered 60ms; a 30s gradient drift loop at 2% translate; a 5-bar amplitude-reactive waveform; a single pulse on record-button activation (never continuous); a 3px lift and brightened top edge on booking-card hover; a single amber sweep for disruption alerts sliding in from the right.NFR-1 — Grounding constraint (explicit) AI responses must be grounded in verified data. The platform must never invent bookings, prices, availability, or travel times. Rationale: the traveller makes money and connection decisions on this information.
NFR-2 — Untrusted imported documents (explicit) Imported documents must be treated as untrusted data, and extracted information must be validated before it becomes trusted. Rationale: imported emails, PDFs, and screenshots are attacker-controllable input.
NFR-3 — Separated permissions (explicit) Read, write, and action permissions must be separated. Rationale: reading travel data must never imply the ability to change or act on it.
NFR-4 — Explicit authorization (explicit) Explicit user authorization is required before booking, paying, or cancelling. Rationale: these actions move money and are not trivially reversible.
NFR-5 — Server-side access control and data protection (explicit) Server-side access controls must be enforced and user data protected. Rationale: client-side checks alone cannot protect private travel data.
NFR-6 — Real integrations and labelled mocks (explicit) Real integrations must be used where credentials are available, and clearly labelled mocks otherwise. Rationale: the traveller must always know what is real.
NFR-7 — No unverified claims (explicit) The platform must not claim unverified functionality. Rationale: trust in an AI-first travel product depends on honest capability reporting.
NFR-8 — External infrastructure (explicit) Hosting, CI/CD, secrets management, and payment infrastructure are handled externally. Rationale: these are explicitly out of the product's build scope.
NFR-9 — Reliability of long-running work (explicit) Background jobs, retries, idempotency, verified webhooks, and streaming responses must be implemented. Rationale: import extraction, provider calls, and webhook delivery are long-running and must not duplicate effects.
NFR-10 — Responsive and accessible UI (explicit) The UI must be responsive and accessible, with light and dark themes, notifications, and deep links. Light mode is the default. Rationale: the audience is mobile-first and uses the product across devices.
NFR-11 — Readable text and controls stay whole (explicit)
At 375px, 768px, and 1280px, headlines, wordmarks, labels, numbers, cards' text, and controls must stay entirely inside the viewport and their container, wrapping or scaling (for example font-size: clamp(...) with its mobile size) to fit, and no other element may cover any part of them. Imagery, decoration, and motion may be cropped, bled off an edge, rotated, overlapped, or cut as the direction asks, as long as they cover no readable text or control. Moving and scrollable content may cross the viewport or container edge by design, judged by whether it actually moves or scrolls and whether every item becomes fully readable as it passes. With prefers-reduced-motion, a usable static arrangement must be provided — items wrap into rows or scroll horizontally so each can be brought fully into view. Rationale: the layered glass composition must never obscure the information the traveller needs.
NFR-12 — Persistent data and end-to-end workflows (explicit) All core workflows must use persistent data and work end to end. Rationale: the platform is built incrementally and must be functional at each step.
NFR-13 — Contrast (explicit) Heavy blur must not be stacked so deep that it obscures text or drops below 4.5:1 contrast on body copy. Rationale: frosted surfaces must remain legible.
redis_required: true).Assumptions
Constraints

Watching your trip for changes and flagging anything that needs you.
What the platform does
travel-management-travellers keeps your flights, stays, transport and plans in a single trip — then lets you plan, organize and manage it all through chat or voice with a travel agent that works from your own bookings.
Multi-booking trips
Bring flights, hotels, ground transport and activities into one place, kept together as a single trip. Add each booking as it lands and the itinerary stays the source of truth for dates, times and travellers — so nothing is scattered across inboxes and screenshots.
Chat or voice
Read your trip, adjust an itinerary or compare options by typing or speaking. The agent works on the trip you already have, so answers stay tied to the bookings and details you entered.
Grounded agent
The agent retrieves your trip data on request, suggests itinerary changes, compares options and drafts a recovery plan when something changes — always from what is recorded in your trip.
Grounded in verified dataResponses are grounded in the trip data you have recorded. The agent does not invent bookings, prices, availability or travel times.
Create an account to start planning, organizing and managing multi-booking trips — flights, hotels, ground transport and activities — through chat or voice.
No paid plan required to start. Your bookings and traveller details stay under your account.

Watching your trip for changes and flagging anything that needs you.
What the platform does
travel-management-travellers keeps your flights, stays, transport and plans in a single trip — then lets you plan, organize and manage it all through chat or voice with a travel agent that works from your own bookings.
Multi-booking trips
Bring flights, hotels, ground transport and activities into one place, kept together as a single trip. Add each booking as it lands and the itinerary stays the source of truth for dates, times and travellers — so nothing is scattered across inboxes and screenshots.
Chat or voice
Read your trip, adjust an itinerary or compare options by typing or speaking. The agent works on the trip you already have, so answers stay tied to the bookings and details you entered.
Grounded agent
The agent retrieves your trip data on request, suggests itinerary changes, compares options and drafts a recovery plan when something changes — always from what is recorded in your trip.
Grounded in verified dataResponses are grounded in the trip data you have recorded. The agent does not invent bookings, prices, availability or travel times.
Create an account to start planning, organizing and managing multi-booking trips — flights, hotels, ground transport and activities — through chat or voice.
No paid plan required to start. Your bookings and traveller details stay under your account.
No comments yet. Be the first!