Skip to content

Trips

iOS Android
Status ⏳ ⏳
Code — —

Source: click dummies docs/companion_app/sailever-ios.html, docs/companion_app/sailever-android.html (Trips tab, trip detail, edit trip, share trip). Verified against code: 2026-10-11 (no code yet; checked against the click dummies)

Purpose

All trips, filtered and sorted; one trip in detail, day by day and track by track; and the trip's settings and sharing. Same data and rules as the website's trip pages (/my/trips).

Server API

Screen Needs Status
Trips list GET /api/v1/trips?year=&area=&boat=&sort= ⏳ missing (website: GET /my/trips)
Trip detail GET /api/v1/trips/:id with days, tracks, simplified track geometry ⏳ missing (website: GET /my/trips/:id)
Night picker PATCH /api/v1/trips/:trip_id/days/:id ⏳ missing (website: PATCH /my/trips/:trip_id/days/:id)
Edit trip PATCH /api/v1/trips/:id, DELETE /api/v1/trips/:id ⏳ missing (website: /my/trips/:id)
Share trip Public links and the crew link (trip_links), the public page sailever.com/t/{token}, crew sailever.com/crew/{token} (../server/sharing.md) ✅ on the website; ⏳ no JSON API for the apps yet

Trips list

Element Content & format Behaviour iOS vs Android
Large title "Trips". Subtitle "Every trip you sailed, {sort order in lower case}.", e.g. "…, newest first." Collapses on scroll. —
Avatar Initials. Opens Account. —
Reset chip ✕ / filter-off icon. Only while a filter is set. Clears year, area and boat. Keeps the sort. —
Year chip "Year", or the chosen year (filled). Choice: "All", then the years with trips, newest first. iOS: pull-down menu "Year". Android: choice sheet "Year".
Area chip "Area", or the chosen sailing area. Choice: "All", then the user's distinct sailing areas A–Z. Title "Sailing area". Same pattern.
Boat chip "Boat", the boat name, or "No boat". Choice: "All", the user's boats A–Z (with the model on Android), "No boat". Same pattern.
Sort Current order. Options "Newest first", "Oldest first", "Longest first", "Name A–Z". Re-sorts at once. iOS: sort button in the navigation bar, pull-down menu "Sort by". Android: last chip with a sort icon, choice sheet "Sort trips".
List Trip cards, one per row. Tap: trip detail. —
Empty (filters) Icon, "No trips match these filters.", button "Reset". Clears the filters. —

Trip card

Element Content & format Behaviour iOS vs Android
Mini map 132 px high. Water, land, the kept part of every track coloured by vessel state. Start: hollow circle. End: filled circle. Not interactive. —
Crew marker Round crew icon top right, only on a trip the user crewed on (../server/sharing.md). — iOS: glass.
Live badge Top left, pulsing dot + "Live". Only while a track of the trip records. — —
Title Trip title, bold. — —
Dates "{date range} · {n} day(s)". — —
Mini stats "{x}" NM, "{x}h" Sail (sail bar), "{x}h" Engine (engine bar). — —
Boat Boat icon, "{model}, {name}", or "No boat set" (muted, italic). — —
Sailing area Location icon, area, or "No sailing area". — —
Charter Anchor icon, "Own boat", the charter company, or "Charter or own boat not set". — —

Trip detail

Pushed screen.

Element Content & format Behaviour iOS vs Android
Top bar Back, Share, Edit (owner only; a crew member has only Back). Trip title appears on scroll. Share: share trip sheet. Edit: edit trip. iOS: glass back button, share button, "Edit" capsule. Android: icon buttons (share, pencil).
Map 210 px, rounded. All kept tracks coloured by vessel state, fitted with padding. Not interactive. —
Title Trip title, display font, uppercase. — —
Badges "Skipper" (signal) if set and the trip is the user's own; "Crew" on a crewed trip; "Recording" with pulsing dot while live. — —
Meta Sailing area; "{model}, {name}"; "{date range} · {n} day(s) · {n} track(s)"; "Recorded with {device} and {device}". Rows without data are left out. — —
Total Readout "{x} NM", small "{h h mm min} underway". — —
Sailed Readout "{x} NM", small sailing time. Sail bar. — —
Engine Readout "{x} NM", small engine time. Engine bar. — —
Split bar Split bar: sailed, motored, estimated (bridged). With bridges: note "Includes {x} NM estimated where the recording had a gap." — —
View switch "Days" / "Tracks". Days first. Switches the list below. iOS: segmented control. Android: tabs on the list card.

Days

One row per day of the trip.

Element Content & format Behaviour iOS vs Android
Day number Number in a dark circle, day label below ("Fri 9.10."). — —
Route "{departure} → {destination}" of the day's tracks, or "From {departure}" while live. — —
Time "{HH:MM}–{HH:MM}", or "{HH:MM}–now" while live. — —
Day stats "{x} NM", "sailed {x}" (sail colour), "engine {h:mm} h" (engine colour). — —
Night Every day but the last: chip with the stay icon and the night's name or stay label, or "Not set". Opens the night picker. iOS: chevrons icon. Android: pencil icon.
Last day "Still underway" (boat icon) while live, otherwise "Last day" (flag icon). — —
Sum row "Total" · "{x} NM · sailed {x} · engine {h:mm} h". — —

Night picker

Element Content & format Behaviour iOS vs Android
Title "Night after day {n}", sub "{day label} after {route}". — iOS: pull-down menu anchored to the chip, title in the menu. Android: choice sheet.
Options "At anchor", "On a buoy", "In port", "Lines to shore", "At sea", each with its icon. Current one checked. Saves at once. Toast/snackbar "Night saved." —
Use detected "Use what was detected", hint "Detected: {stay}". Removes the override; the night shows the stay the server detected from the track (ingestion.md § Days). —

Tracks

Element Content & format Behaviour iOS vs Android
Track row Route; "{day label} · {HH:MM}–{HH:MM} · {x} NM"; badges: device; while not fully synced "Syncing from watch" (spinning) or "Part still on the watch" (incomplete, with the missing parts); "Trimmed" if trimmed. A complete track has no sync badge (trip.md § Tracks table). Opens the track editor. iOS: chevron. Android: route icon in front, pencil icon at the end.

Edit trip

Element Content & format Behaviour iOS vs Android
Bar Cancel (✕), title "Edit trip", Save. Save: writes all fields, closes, toast/snackbar "Trip updated successfully!". Cancel: discards. iOS: page sheet, ✓ button. Android: full-screen dialog, filled "Save" button.
Title Text field, placeholder "Croatia 2026". Required. Empty: the form stays open with "Title can't be blank" (validation). —
Boat Picker: "No boat", then each boat. — Android shows "{name} · {model}".
Add a new boat Button. Opens the boat form. The new boat is selected after saving. —
Sailing area Text field, placeholder "Central Dalmatia". — Android suggests the areas already used.
Bridge gaps between tracks Switch. Hint: "Connects every track to the end of the one before with a straight line, for stretches that weren't recorded (watch forgotten, battery dead). Those miles count as distance, not as time." Server: trips.bridge_gaps. —
I was the skipper Switch. Hint: "Shows a Skipper badge on the trip. You'll need this later for mileage confirmations." — —
Time zone Picker: "Automatic (from the first position)", then IANA zones. Hint: "A day starts at midnight in this time zone. It is set from the first position of the trip." Changes days and times of the trip. —
Delete trip Destructive button. Android: in a danger zone with "Deletes the trip and all its tracks. This can't be undone." Confirmation "Delete this trip and all its tracks? This can't be undone." On confirm: deleted, back to the list, "Trip deleted successfully." What happens to the tracks: trip.md § Known deviations. —

Share trip sheet

Element Content & format Behaviour iOS vs Android
Title "Share this trip", sub: trip title. Close (✕) / Done. iOS: glass half sheet. Android: bottom sheet.
Public link As on the website (../server/sharing.md § Share popover): "Create public link"; then sailever.com/t/{token}, "Works until {date}", Copy link, Share… (system share sheet with the trip title and link), New link, Stop sharing. Links work 30 days; nothing is created until the user taps. —
Crew The crew list and the crew link as in the website's crew section. — —
Note "Anyone with this link can see the trip, its map and its numbers until {date}." While recording, the public page shows the boat's last sent position. — —

States and edge cases

  • A trip whose last track is recording shows "Recording", "Live", "Still underway" and "now".
  • A shared live trip shows the boat's last position the watch sent (about hourly), as on the website (../server/sharing.md). The dummies say "Never your position while you're recording"; the owner decided otherwise on 2026-10-22.
  • Pagination of long trip lists: ⏳ not designed. The website pages the list.

Known deviations

  • The dummies list one "day" per track. A day is a local calendar day with at least one kept point; a day can hold several tracks and a track can cross midnight.
  • Sort: the dummies lack "Name A–Z", which the website has. iOS changes the subtitle with the sort; Android always says "newest first". This spec follows iOS.
  • Copy aligned with the website: "Syncing from watch" (dummies: "Receiving"), "No boat set" and "Charter or own boat not set" (dummies: "No boat", "No charter company"), "Use what was detected" (dummies: "Use detected"), "Night after day {n}" (dummies: "Night {n}"), "Automatic (from the first position)" (iOS dummy: "Automatic takes it from the track").
  • The dummy's bridge hint drops "(watch forgotten, battery dead)". This spec uses the website text.
  • The dummies show a "Synced" badge on complete tracks and have no incomplete state. This spec follows the website (no badge when complete, "Part still on the watch" when incomplete).
  • The dummies keep the old title when the field is left empty; the website requires a title. This spec requires it.
  • Edit trip messages in the dummies: "Trip saved", confirmation "Delete this trip?" / "“{title}” and its {n} tracks will be gone for good.", filter button "Reset filters" (Android). This spec uses the website copy.
  • The dummies offer Undo after deleting a trip. Deleting is final (conventions).
  • The dummies still show visibility levels (Private / Crew / Public, a slug link, a visibility badge and an Edit trip row "Sharing"). They are gone: every trip is private, shared by public link or crew link (ADR 010). The dummies follow later.