Scout — Full Product Context → feature documentation

Trips — the legacy path (flag-off since 2026-10-06)

The legacy trips path — the Day Trip and Road Trip homes, the old planners and the shared driving engine — kept intact behind trips_v2 (default on) and reachable only with that flag off or by deep link. Everything a user sees today is in trips-v2 and road-trip-planner.

Screen recordings

Short spans cut from real sessions on a real device. Silent, no narration, no editing beyond the trim.

Build a day trip 9.4s · recorded 2026-09-09
Day trip in O'Fallon 2.43s · recorded 2026-09-09
Next stop 7.5s · recorded 2026-09-09
Cathedral Basilica 4.63s · recorded 2026-09-09
Curated road trips 10s · recorded 2026-09-09
Route 66 5s · recorded 2026-09-09
Plan your own 13.1s · recorded 2026-09-09
Eyes on the road 9.5s · recorded 2026-09-09
Lemp Mansion 1.3s · recorded 2026-09-09

Full sessions

The complete, unedited recordings the clips above were cut from — every tap, including the dead ends. These are the raw captures, reframed for the web and otherwise untouched.

Full recording · 09-09 12:46 55.5s · recorded 2026-09-09 · unedited
Full recording · 09-09 12:48 122.3s · recorded 2026-09-09 · unedited

Read trips-v2 first. trips_v2 is ON by default in both registries, so the screens in this document are what a user gets only if an admin turns that flag off, or by typing a deep link. This file was collapsed on 2026-10-29 from a 782-line account written against commit 852f2722 (2026-08-29); the mechanics it described in full — turn-by-turn, rerouting, the three driving cameras, the road corridor query, trip sync — still run, and the parts that survive unchanged under trips_v2 are kept here only where no current doc states them. The web planner is in road-trip-planner. Everything else that used to be here is in git history (git log -- docs/features/trips-and-driving.md).

Summary

Before the unified Trips, Scout had two separate trip kinds, each with its own drawer row and home screen: a Day Trip (a short, radius-bounded itinerary around one city, built from a swipe deck, a grid, or a Scout-authored curated trip) and a Road Trip (a long plan between any two points, routed by OpenRouteService, with every patch within a chosen detour of the road grouped by the states it crosses). Both drove on one shared trip map with turn-by-turn instructions, rerouting when you leave the road, and passive auto-collect as stops are reached. That shared engine is what trips_v2 re-fronts with one question, "What kind of trip?" — the legacy homes and planners are the part that was replaced.

Status

User-facing surfaces (legacy; trips_v2 off, or by deep link)

Every route is registered in mobile/src/dev/deepLinkRoutes.ts and reachable as scout://<path> regardless of the flag — only the drawer rows and the two redirects above depend on it.

Route File What it is
/(drawer)/trips mobile/app/(drawer)/trips.tsx Day Trip home — TripHomeScreen kind="day" (flag off only; on, this path is the new Trips)
/(drawer)/road-trip mobile/app/(drawer)/road-trip.tsx Road Trip home — TripHomeScreen kind="road"; drawer row hidden under trips_v2
/trip-planner mobile/app/trip-planner.tsx Day Trip builder (swipe deck / grid); redirects to /trip-plan with the flag on
/road-planner mobile/app/road-planner.tsx Road Trip "where to?" + stop picker (deepLinkRoutes.ts:152)
/trip-preview mobile/app/trip-preview.tsx Map-first preview of a trip before committing
/trip-stops mobile/app/trip-stops.tsx The itinerary list
/my-trips mobile/app/my-trips.tsx Day-trip history: live / saved / done, read-only recaps
/trip-map mobile/app/trip-map.tsx The live driving map, day or road via ?kind= (deepLinkRoutes.ts:155)

Both homes render the same TripHomeScreen (mobile/src/components/trips/TripHomeScreen.tsx) parameterised by kind, split into TripHomeScreenViewModelImpl and the pure TripHomeScreenLayout, which is what lets the DEV screen-mock gallery show both faces (mobile/src/dev/mocks/trip-home.tsx, scout://dev-screen-mock/trip-home).

The shared engine that is still live under both flags

These are not legacy; they are stated here because no current doc states them.

Data model

Trip / RoadTrip and trip_patches in backend/prisma/schema.prisma, written by the sync push; curated_trips and their stops are content (published through /admin/publish, see admin-and-content-ops). Prod served 111 curated trips on 2026-09-23 (104 day trips, 7 roads); not re-counted since. A trip's visitedIds — the stops collected while that trip existed, the only thing that counts as its progress — is device-only and not synced, so a reinstall starts every trip at 0-of-N.

API surface

Unchanged by the flag: GET /api/trips/curated, the routing and corridor endpoints under backend/src/trips/ and backend/src/routing/, and the sync channel. All JWT-guarded except curated trips. The web planner's own endpoints (backend/src/road-trips/) are documented in road-trip-planner.md.

Key files

Configuration and flags

trips_v2 (default on, both registries) selects the path. trips_tab (backend-only, default off, dev) does nothing. ORS_API_KEY is required for any routing. CONTENT_EDITING_ENABLED=true (local only) is what lets the curated-trip seed scripts write; reaching prod is a human publish.

Edge cases and known limits

What this feature does NOT do

Tests that cover it

Backend: backend/src/trips/*.spec.ts (corridor-grouping, curated-trips, reroute, road-trip-pairing, trip-route), backend/src/routing/*.spec.ts (route-steps, route-cache-key, routing.service), backend/src/sync/__tests__/sync.trips.db.spec.ts (a pushed trip reaches trips/trip_patches, re-push upserts, cross-account isolation, Trip Advisor and Finish Line become earnable). Mobile: the trip-home, trip-planner and trip-map screen tests under mobile/screen-tests/ and the trip-home screen mock; mobile/src/components/navigation/__tests__/drawerSections.test.ts pins the Trips/Road Trip row swap.

Open questions