Skip to content

Boats & devices tab

iOS Android
Status ⏳ ⏳
Code — —

Source: click dummies docs/companion_app/sailever-ios.html, docs/companion_app/sailever-android.html (Boats & devices tab, boat form, pair device). Verified against code: 2026-10-11 (no code yet; checked against the click dummies)

Purpose

Manage the boats the user sails on and the devices that upload tracks. Pair a new watch with its 6-digit code. Same data as the website's /my/boats and /my/devices; pairing works like sailever.com/pair.

Server API

Need Status
Boats: GET/POST/PATCH/DELETE /api/v1/boats ⏳ missing (website: /my/boats; POST already answers JSON)
Devices: GET /api/v1/devices, PATCH (name), DELETE (unpair) ⏳ missing (website: /my/devices)
Pair with the code: POST /api/v1/devices/pair ⏳ missing (website: POST /pair)
"Recording" state of a device ⏳ missing; the server doesn't know it. Comes from the watch over Bluetooth, see map.md.

Layout / behaviour

Element Content & format Behaviour iOS vs Android
Large title "Boats & devices". — Android: subtitle "The boats you sail, own or charter." / "Devices paired to your account. They upload their tracks straight to your logbook."
Avatar Initials. Opens Account. —
Switch "Boats" / "Devices". Boats first. Switches the list. The choice is kept while the app runs. iOS: segmented control. Android: tabs with icons.
Add Boats: "Add boat". Devices: "Pair device". Opens the boat form or pair device. iOS: + button in the navigation bar. Android: extended FAB at the bottom right.

Boats

Element Content & format Behaviour iOS vs Android
Count "{n} boat(s)". — iOS only (group header).
Boat row Name (bold); "{model} · {home port}" ("–" without model, "No home port"); "{n} trip(s) · {x} NM". Own or charter: "Own boat" or the charter company. Opens the boat form. iOS: icon green for own, blue for charter; own/charter in the third line. Android: own/charter as a badge at the end.
Empty Boat icon, "No boats added yet", "Add your boat to assign it to sailing trips." — —
Footer "Boats you sail, own or charter. Assign them to trips in Edit trip." — iOS only.

Boat form

Element Content & format Behaviour iOS vs Android
Title New: "Add a boat". Existing: "Edit boat". — iOS: page sheet with ✕ and ✓. Android: bottom sheet with Cancel and "Save boat".
Boat name Required. Placeholder "Luna". Empty: the form stays open, the field is focused (validation). —
Model / type Required, placeholder "Hanse 458". Empty: "Boat model can't be blank" (validation). —
Home port Placeholder "Kiel, Germany". — —
Own boat Switch "Own boat", hint "Your own boat, no charter." On hides and clears the charter field. —
Charter company Placeholder "Navigare Yachting". Hidden for an own boat. — —
Save — New: toast/snackbar "Boat created successfully!". Existing: "Boat updated successfully!". Opened from Edit trip: the new boat is selected there. —
Delete boat Existing boats only. Text "Removes the boat. Trips sailed on it keep their tracks but no longer show the boat." Confirmation "Are you sure you want to delete this boat?" On confirm: deleted, toast/snackbar "Boat deleted successfully." iOS: red cell at the bottom. Android: red text button on the left of the sheet's actions.

Devices

Element Content & format Behaviour iOS vs Android
Section head "Paired devices". — iOS only.
Device card Watch icon, name (bold), platform ("Garmin", "Wear OS", "Apple Watch"). Badge: "Recording" (pulsing) while a track records, otherwise "Paired". — iOS: grouped card. Android: card.
App version e.g. "1.8.2", mono. — —
Paired on Long date. — —
Last sync "{d Mon yyyy}, {HH:MM}", "Never", or "Live now" while recording. — —
ID First 16 characters of the device ID + "…", mono. — —
Rename Button. Dialog "Rename device", field "Name" prefilled, hint "Leave it empty to use the name the watch reports. Tracks keep the name they were recorded with." Cancel / Save. Toast/snackbar "Device saved." iOS: alert with a text field. Android: dialog.
Unpair Red button. Confirmation "Unpair this device? It can't upload tracks until you pair it again." Recording, added: "It's recording right now. The open track stays on the watch until you pair it again." On confirm: toast/snackbar "Device unpaired. It can't upload tracks any more." —
Empty Icon, "No devices paired yet", "Pair once and every trip from the SailEver WatchApp lands in your logbook." — —
Footer "Devices paired to your account. They upload their tracks straight to your logbook." — iOS only (Android shows it as the subtitle).

Pair device

Element Content & format Behaviour iOS vs Android
Title "Pair a device". Cancel closes. iOS: page sheet with a large watch icon. Android: dialog with an icon.
Instruction "On your watch, open SailEver and choose Pair device. Enter the 6-digit code it shows." — —
Code Six one-digit fields, numeric keyboard. Typing moves to the next field. Backspace in an empty field moves back. Pasting fills all six. Non-digits are dropped. First field focused on open. —
Hint "The code is valid for 10 minutes." — —
Pair Primary button. Enabled with six digits. Shows a spinner and "Pairing". Success: closes, switches to Devices, toast/snackbar "Device paired.". —

States and edge cases

  • Wrong or expired code: ⏳ not designed. The website keeps the form with "Invalid or expired pairing code. Please check your watch screen." (devices.md § Submitting); more than 5 attempts in 5 minutes are refused.
  • Unpairing a recording watch keeps the open track on the watch; it uploads after pairing again.

Known deviations

  • The glossary says "device", not "watch", in the signed-in area. The dummies say "Watches paired to your account" and "Pair a watch once …". The website copy (app.devices.subtitle, app.pair.*) uses "watch" too; both need the same fix. This spec uses "Devices paired to your account" and keeps "watch" only for the physical watch in instructions.
  • Platform names: the dummies show "Garmin Connect IQ" and "Wear OS". The server stores platform (garmin, wear_os). This spec shows "Garmin", "Wear OS", "Apple Watch".
  • Device names differ inside the dummies: "Garmin fēnix 7 Pro" in the list, "fēnix 7 Pro" on tracks and in the live panel. One name per device: the name from Rename, or the name the watch reports.
  • Copy aligned with the website: "No boats added yet", "No devices paired yet", "Pair a device", the unpair texts and messages, the rename hint, "No boat set".
  • Boat messages in the dummies: "{name} added", "Boat saved", "Boat deleted", confirmation "Delete {name}?" / "Trips with this boat keep their tracks and show “No boat set”.", own-boat hint "Turn off for a charter boat and name the charter company.", unpair confirmation "Unpair {name}?". The dummies don't require a model. This spec uses the website copy and rules.
  • The dummies offer Undo after deleting a boat and after unpairing. Both are final (conventions).
  • "Recording", "Last sync: Live now": the server doesn't know whether a device records. These come from the Bluetooth link to the watch, so they only show on the phone that's connected to it.