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.