Skip to content

A trip assistant that still answers with roaming switched off

A companion app for a tour operator's guided trips, whose assistant answers questions about a traveler's own itinerary on-device. The moment people land abroad they turn data roaming off, and most apps go dark exactly when they're needed.

12:40
Day 4 of 8 · Thu 8 OctMarenca
Whole trip on this phone · 84 MBDownloaded Tue · works with roaming off
Today5 items
08:45Meet Inés in the lobbyHotel Almirante
09:30Palace of the CountsGuided visit · ticket in Docs
13:00Lunch at Casa RibeiraIncluded · drinks not includedNext
15:30Old-town walk6 stops · 2.2 km · map stored
19:30Free eveningDinner not included
Next 3 daysMon 12 Oct home
Day 5Coach to SolveraFri 9 Oct · 4
Day 6Coast path & harbourSat 10 Oct · 5
Day 7Salt pans & farewell dinnerSun 11 Oct · 4
Up to date as of Wed 7 Oct, 22:14 · hotel wifi
TodayAskDocsMap

The shape of the work

Industry
Tour Operators
Duration
12 weeks
Cooperation model
Fixed price, phased
Services
React Native buildOn-device assistantVoice input
Integrations
Amadeus GDSStripeSkyscannerSendGrid
Technologies
React NativeTypeScriptOn-device language modelSpeech recognitionSQLiteApp Store & Play Store release
Team
1 Project lead1 Product designer2 Mobile engineers1 Backend engineer1 QA engineer

Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.

Introduction

What we were brought in to do

Travelers had a perfectly good app that stopped working the moment they landed and switched roaming off. We rebuilt it so the questions people actually ask in-trip (when's my transfer, what's included, where do I meet the guide) are answered on the phone, from their own trip data, with no connection at all.

A tour operator whose app worked beautifully on hotel Wi-Fi and went dark the moment travelers landed and switched roaming off. The support cost was concentrated and visible in the call logs: guides and the office fielding the same handful of questions (transfer times, what's included, where to meet) clustered in exactly the hours travelers were offline.

Mobile Engineering & AI

The problem

Where the old way broke

Every question the app couldn't answer became a phone call to a guide or the office, and the calls clustered in exactly the hours when travelers were offline and anxious. The assistant only worked on hotel Wi-Fi, which is the one place travelers didn't need it.

The assistant required a connection for every answer, including questions that were entirely about data the traveler had already been sent. Asking what time is my transfer needed a round trip to a server to read a field from an itinerary that was fixed at booking. That specific absurdity is what made the offline rebuild worth twelve weeks.

We shipped one React Native codebase that downloads each traveler's itinerary the moment they book, then runs a small assistant on-device against it. Voice input handles the hands-free case (walking, luggage in both hands), and heavier open-ended questions route to the cloud only when there's a connection to use.

Itinerary on the device

The full itinerary downloaded at booking, before the trip and the roaming decision.

The itinerary downloads at booking, which is the last moment the traveler is reliably on their own Wi-Fi and before the roaming decision gets made. Flights, hotels, transfers and confirmations are stored in SQLite as structured records instead of a cached page, so the assistant can answer questions about them, not just re-display them. Changes sync when a connection appears.

What shipped
  • Downloaded at booking, before the roaming decision
  • Stored as structured records, not a cached page
  • Changes reconcile whenever a connection appears
19:43
Trip packMarenca & the Solvera Coast · booking TJ-48217
Ready for roaming off5 of 584 MBon this phoneTue 29 Sep, 19:42 · Home wifi · 6 days before departure
In the packDownloaded at booking
Itinerary46 structured records1.2 MB
Map · MarencaOld town + walking routes31.0 MB
Map · SolveraTown + coast path21.0 MB
Documents8 passes & vouchers14.6 MB
Assistant trip dataYour trip, indexed to ask16.2 MB
Itinerary · 46 recordsSQLite on the phone
Flights2Stays3Transfers4Tours & visits11Meals14Meeting points12
Stored as records the assistant can read, not a saved page. Changes reconcile whenever a connection appears.
On screen

The pre-trip download: itinerary, two city maps, documents and the assistant’s trip data pulled onto the phone over Wi-Fi at booking, six days before departure, with the itinerary kept as 46 structured records.

12:52
Ask about your tripMarenca & the Solvera Coast · day 4 of 8Offline
What time is my transfer tomorrow?
Friday 9 Oct, pickup 08:30 at the front entrance of Hotel Almirante. The coach to Solvera takes about 2 h 10 min, and Inés travels with you.Answered on this phoneTransfer 3Meeting point 7
Is lunch included today?
Yes. Lunch at Casa Ribeira at 13:00 is included in your trip. Drinks aren’t included.Answered on this phoneMeal 9
Earlier today · 6All answered offline
11:48Where do we meet after free time?
11:05Is there a luggage limit on the coach?
10:40How long is the palace visit?
09:12Where’s my palace ticket?
08:02Do I need my passport for the palace?
07:58What time do we meet the guide?
Ask about your trip…
TodayAskDocsMap

Answers with roaming off

On screen

Ask, with roaming off: two questions answered on the phone from the traveler’s own itinerary records, above the six they asked earlier today.

A small assistant running on-device against the traveler's own itinerary.

A small language model runs on the device against the traveler's own itinerary, so what time is my transfer and which terminal am I in answer with the phone in airplane mode. The model is scoped to itinerary reasoning, with no general knowledge to carry, which is what lets it be small enough to run locally and reliable enough to be worth asking.

What shipped
  • On-device model answers with the phone in airplane mode
  • Scoped to itinerary reasoning, not general knowledge
  • Open-ended questions routed to the cloud only when connected

Voice for hands-full moments

Speech input for the walking, luggage-in-both-hands case that dominates travel days.

Travel days are hands-full days. Speech recognition runs on-device so voice works without signal, and the assistant answers aloud as well as on screen for the walking-through-a-terminal case. It's push-to-talk, never always-listening, because a permanently open microphone isn't a trade a travel app has earned.

What shipped
  • On-device speech recognition: voice works without signal
  • Spoken answers for walking, luggage-in-both-hands moments
  • Push-to-talk, never always-listening
15:12
ListeningSpeech recognized on this phone · push to talkOffline
Holding to talkWhere do I meet the guide for the old-town…
Answers on this phone · 6Spoken aloud too
What time is my transfer tomorrow?
Is dinner included on day 6?
Where do I meet the guide?
Which terminal do I fly home from?
What’s my hotel in Solvera?
Show my palace ticket
Needs a connection · 1
Is there a pharmacy open late near the hotel?Not in your trip · asked when there’s signal
Release to askThe microphone is on only while you hold. Never always-listening.
On screen

Push-to-talk voice input mid-sentence, recognized on the phone, with the six questions that answer on-device listed against the one that needs a connection.

What we built together

  1. 01

    Pulled the full itinerary onto the device at booking, before the trip starts

    Booking was chosen as the moment after testing the alternatives: a download prompted at check-in or on arrival is one most travellers never see.

  2. 02

    Ran the itinerary assistant on-device so it answers with roaming off

    It's stored as structured records instead of a cached page, so the assistant can reason about it, not only redisplay it.

  3. 03

    Added voice input for the hands-full moments that dominate travel days

    A small on-device model scoped to itinerary reasoning answers with the phone in airplane mode, and speech recognition runs locally so voice works too.

  4. 04

    Reserved cloud calls for open-ended questions, only when signal allowed

    Open-ended questions route to the cloud only when a connection exists. The cloud is the exception, never the default path with an offline fallback.

Operational results after launch

-38%

In-trip calls to guides

All of them

Itinerary answers available offline

4.7★

App store rating

In-trip calls compares the operator's own guide and office call logs for the season after launch with the season before, on comparable trip volumes. Offline itinerary answers is a capability claim: every question about itinerary data is answerable on-device. The rating is the rolling store average for the six months after launch.

Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.

Process

Phase by phase

  1. Phase 1: Pre-load

    Before they land

    Pulled the full itinerary onto the device at the moment of booking, well before the trip starts.

    • Sync design
    • Local schema
  2. Phase 2: Answer offline

    On-device, against their own trip

    Ran the itinerary assistant on-device so it answers with data roaming switched off.

    • On-device assistant
    • Grounding logic
  3. Phase 3: Add voice

    Hands full, walking

    Added voice input for the hands-free moments that make up most of a travel day.

    • Speech input
    • Voice UX
  4. Phase 4: Reserve the cloud

    Only when there is signal

    Routed open-ended questions to the cloud only when a connection was actually available.

    • Routing policy
    • Graceful degradation
    • Store release
15:24
Old-town walk · 15:30Marenca · stored map · loading nothing31 MB
1234566 stops · 2.2 km You · GPS, no data
1Almirante Square350 m
2Cathedral steps600 m
3Old Salt Market280 m
4Dyers’ Lane450 m
5Rampart Lookout520 m
6Hotel AlmiranteEnd
TodayAskDocsMap
On screen

The stored map of Marenca with the day’s walking route, six stops and the distance between them, loading nothing.

About our collaboration

  • A cross-functional team of 5 worked on a fixed price, phased basis over 12 weeks, covering React Native build, On-device assistant, Voice input. We ran a standing mid-week checkpoint and written decisions in place of status meetings. Nothing shipped that they had not seen working first.

    Phased so the itinerary download and the offline data model landed before any assistant work, because the assistant is only as useful as what it can read without a connection. Field testing was done in airplane mode on real itineraries, not with a throttled connection, since the failure mode being fixed is no connection at all, not a slow one.

What we'd carry into the next one

  • Travelers switch roaming off the moment they land, so an online-only assistant goes dark exactly when it's needed.

    Roaming off is the normal state of an international traveler, so an online-only assistant is unavailable during precisely the window it was built for.

  • Grounding the assistant in the traveler's own itinerary made a small on-device model sufficient.

    A model that only has to reason over one itinerary can be small; the size problem is caused by general knowledge, which this use case never needed.

  • Voice wasn't a novelty here: both hands are genuinely occupied for most of a travel day.

    Push-to-talk voice earned its place because both hands are occupied for most of a travel day. It's an accessibility answer to a physical constraint, not a novelty.

Day four, roaming off

Ask about the trip, and the phone already knows.

Pick a kind of question a traveler asks mid-trip. Each one shows the records the on-device assistant reads from the itinerary downloaded at booking, the answer it builds, and what it honestly can’t know without a connection. Switch the Wi-Fi on to see which questions move to the cloud, and which never do. Use the arrow keys once a tab is focused.

What time is my transfer tomorrow?
Read from the downloaded itinerary
  • Transfer 3.pickupFri 9 Oct, 08:30
  • Meeting point 7.placeHotel Almirante, front entrance
  • Transfer 3.duration2 h 10 min
Answered on this phoneFriday 9 Oct, pickup 08:30 at the front entrance of Hotel Almirante. The coach to Solvera takes about 2 h 10 min.
What it can’t answer offlineWhether the coach is running late. That's live, not in the trip data, so the answer says so instead of guessing.
RoutingRoaming is off. The small on-device model is scoped to itinerary reasoning, so it needs nothing but the records above.

One traveler’s invented trip. The step-by-step reveal is illustrative playback, not a measured response time.

Architecture

From a confirmed booking to an answer with roaming off

The assistant is only as useful as what it can read without a connection, so the data model landed before any assistant work, and the cloud is a path the app takes when it can, never one it depends on.

  1. 01 · Trigger
    Booking confirmedThe itinerary downloads at booking: the last moment the traveler is reliably on their own Wi-Fi, before the roaming decision.
  2. 02 · Store
    SQLite on the phoneFlights, hotels, transfers and confirmations land as structured records, not a cached page, so they can be reasoned about.
  3. 03 · Engine
    On-device assistant + speechA small model scoped to itinerary reasoning answers in airplane mode; speech recognition runs locally, push-to-talk only.
  4. 04 · State
    Reconcile on connectionChanges from the operator sync whenever a connection appears. Nothing in-trip waits on one.
  5. 05 · Deliver
    Screen, voice, or cloudAnswers show on screen and aloud. Open-ended questions go to the cloud only when there's signal, and never by default.
Grounded, private, built for no signal

Scoped answers, push-to-talk & airplane-mode testing

Answers come from their own trip

The on-device model is scoped to itinerary reasoning over the traveler's own records, with no general knowledge in the way. Anything outside the trip goes to the cloud, and only when a connection exists.

The microphone opens only while held

Voice is push-to-talk, never always-listening, and speech recognition runs on the phone, so voice works without signal. A permanently open microphone isn't a trade a travel app has earned.

No connection is the tested case

Field testing ran in airplane mode on real itineraries, never on a throttled connection. Changes from the operator reconcile whenever a connection appears.

Does your app need to keep answering after your customers switch roaming off? Scope your build in 3 minutes.

Scope your build
Have a project?

Let's talk

Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.