Skip to content

Public website

Rails
Status ✅
Code app/controllers/pages_controller.rb, beta_applications_controller.rb, support_requests_controller.rb, app/views/pages/, app/views/components/, app/helpers/design_helper.rb, app/javascript/controllers/{carousel,film,waves,watch_checker,anchor_scroll}_controller.js, config/{devices,products,testimonials,mood_images,privacy}.yml, config/locales/web.*.yml

Verified against code: 2026-10-22

Purpose

The public site explains the three products (DataField, WatchApp, Logbook), tells visitors whether SailEver runs on their watch, gets them into the beta and helps them install. Everyone can see every page; nothing needs an account.

General rules

  • Copy source. All text comes from config/locales/web.en.yml (web.* keys), except the legal pages, which are English prose in the templates. Quotes in this spec are the English copy.
  • Data source. Products come from config/products.yml, watches from config/devices.yml, testimonials from config/testimonials.yml (only approved: true), mood photos from config/mood_images.yml.
  • Counts are never typed into copy. "%{watchapp} models" etc. are filled from DeviceCatalog: today 104 Garmin models, 103 run the WatchApp, 72 the DataField.
  • Product status badges. DataField "Free", WatchApp "Free beta", Logbook "Free in beta". Platform badge "Garmin" or "Web".
  • Hero sections (all pages except home, beta and support-request pages) have an animated swell background (waves_controller). It is static with prefers-reduced-motion.
  • Same-page anchors scroll smoothly (anchor_scroll_controller); page changes open at the top.

Mood images

mood_image(id) shows app/assets/images/mood/<id>.{avif,webp,jpg,jpeg,png} when the file exists. While a photo is missing, development and test show a placeholder box with the slot id and brief; production renders nothing (unless SHOW_MOOD_PLACEHOLDERS is set).

Films

Product heroes show a looping animation (film_tag + film_controller) on a transparent canvas, with a poster image until the film engine loads.

Behaviour Rule
Start Muted loop once ≥ 40 % of the film is visible; pauses when out of view
Pause Click or tap toggles pause
Sound Only after the visitor's first click or key press on the page (browser rule). Then sound plays while the pointer is over the film. One film is audible at a time. Touch devices get a sound button.
Reduced motion Poster only, plays on click
Language Overlay text in German on /de, English everywhere else
Film Plays
WatchApp WatchApp film from 0:04.5
DataField DataField film
Logbook WatchApp film 1:37–1:50

Watch check

The watch check answers "Does SailEver run on my watch?" and remembers the answer.

Element Content & behaviour
Label "Which watch do you sail with?"
Input Search field, placeholder "e.g. fēnix 7 Pro, epix, Forerunner 965". Matching ignores case, accents and punctuation, accepts common misspellings ("quatrix" → quatix, "tactics" → tactix, "phoenix" → fēnix) and searches name, id, Garmin's model name and aliases. At most 8 suggestions; arrow keys, Enter, Escape. Each suggestion shows the name and the family ("not yet" for non-Garmin watches); when only Garmin's model name matched, it shows that instead of the family (search "quatix 7" → "fēnix 7", small "fēnix 7 / quatix 7").
No match "No match. Not listed? Tell us your model through the support form."
Note "%{total} Garmin models: %{watchapp} run the WatchApp, %{datafield} the DataField." (hidden in the header popover)
Picking a watch Sets cookie sailever_watch=<id> (path /, 1 year, SameSite=Lax) and reloads the page with Turbo, so every server-rendered part follows.

Garmin's model name comes from the Connect IQ SDK (displayName in Devices/<id>/compiler.json, copied into config/devices.yml by bin/rails devices:sync). It lists every model that shares a product id, so a quatix, tactix or Enduro 2 is found under the fēnix or epix it is built on.

Result for a Garmin watch: the watch name, then ✓ or ✕ for WatchApp, DataField and Logbook (Logbook is always ✓ for Garmin), then buttons "Join the WatchApp beta" (if the WatchApp runs), "Get the DataField" (if the DataField runs) and "Forget my watch".

Result for a non-Garmin watch (Apple Watch, Wear OS watch, Huawei Watch, Other smartwatch): the name with a "not yet" badge, "SailEver runs on Garmin watches today.", buttons "Read the FAQ" (→ /help#faq-general) and "Forget my watch". "Forget my watch" deletes the cookie and reloads.

The watch check appears in three variants:

Variant Where Extra
Band Home (#watch-check) Eyebrow "Supported watches", title "Does it run on your watch?", lede "Type your model. We remember it, so every page shows what works on your watch."
Full /watches —
Compact Popover from the header watch chip and the hero "Does it run on my watch?" buttons No note

Watch chip (header, public pages only)

No watch picked: watch icon + "Your watch?". Garmin watch picked: short name + ✓. Other watch: short name + "not yet". Click opens the compact watch check.

Support line under product heroes

Shown only when a watch is picked: "✓ Runs on your ", "✕ Not on your ", or "SailEver runs on Garmin watches today" for non-Garmin watches. The "Does it run on my watch?" hero button is hidden once a watch is picked.

Home (/)

# Section Content
1 Hero carousel 4 slides on full-bleed photos (MOOD-C1…C4; a gradient while missing). See below.
2 Three tools (#find-your-app, tinted) Eyebrow "Three tools", title "Pick one, or use all three.", lede. Three product cards (DataField, WatchApp, Logbook). Comparison table "Which one is for me?". Note: "Pricing after the beta will be announced in advance. Your data stays yours: export any trip as GPX."
3 Watch check band (#watch-check) See Watch check
4 Mood band MOOD-H1, full bleed
5 Testimonials Eyebrow "Sailors", title "Tested on real trips.", up to 3 approved testimonials
6 Mood row MOOD-H2, H3, H4
7 FAQ Eyebrow "Questions", title "Short answers.", 5 items (cost, watches, DataField or WatchApp, phone at sea, install), first open, link "All questions and support →" /help#faq
8 CTA band "Built by a skipper. Free while in beta." + text; buttons "Join the beta" → /beta, "Meet the skipper" → /about
Slide Eyebrow Title / accent Button
1 Why SailEver "Sailing tools for your watch" "Pure sailing analytics." / "No distractions." "Find your app →" #find-your-app, plus "Does it run on my watch?" → #watch-check
2 DataField "DataField · free" "A sailing screen" / "for your Garmin activity." "Explore DataField →" /datafield
3 WatchApp "WatchApp · free in beta" "Every trip," / "recorded on the wrist." "Discover WatchApp →" /watchapp
4 Logbook "Logbook · free in beta" "Your logbook" / "fills itself." "Discover Logbook →" /logbook
  • Each slide shows a counter "01 / 04" and a lede. Slide 1's title is the page <h1>.
  • Only the active slide is visible and focusable. It rotates every 7 s and pauses on hover, on focus inside, in a hidden tab and with reduced motion.
  • Controls: 4 dots labelled with the slide names, previous, next, pause/play. Swipe and arrow keys work.

Product card

Card image, status and platform badges, product name, "who it's for" line, three check-marked points, then a primary button (DataField: "Get it on Connect IQ" → store, new tab; WatchApp and Logbook: "Join the beta" → /beta) and a text link "Explore the …" → product page.

Comparison table (home)

Row DataField WatchApp Logbook
Where your recording goes Into Garmin only (FIT in Garmin Connect) Into Garmin (FIT) and straight to your SailEver logbook Fills from the WatchApp, or upload FIT files
I race or day-sail and want numbers while sailing ✓ best fit ✓ –
I want to keep using my watch's own sailing activity ✓ own activity –
I cruise for days and want a logbook of every trip – ✓ ✓ best fit
I want sailed vs motored miles and engine hours – ✓ ✓
I want to know where we spent each night – ✓ ✓
Account Not needed Only to upload to the logbook SailEver account
Price Free Free during the beta Free during the beta

WatchApp (/watchapp)

# Section Content
1 Hero Badge "Free beta", eyebrow "SailEver WatchApp", title "Your logbook," / "recorded on the wrist.", lede. Buttons "Join the beta", "Does it run on my watch?". Support line. WatchApp film.
2 A multi-day trip tracker Eyebrow "2 · A multi-day trip tracker", title "Sailing or motoring? A few button presses.", note "A trip is your whole journey, a track is one recording within it (usually one day)." Four feature splits: Sailed and motored, kept apart (split bar example 42.1 sailed / 11.9 motored, BACK → Sail or Engine, "Motorsailing counts as engine", 3 points, MOOD-W2) · At anchor, on a buoy, in port (rest chips At anchor / On a buoy / In port / Lines to shore; drift vibration above 0.8 kn; still wa-anchor) · Stop for the night. Continue tomorrow. (Pause Track → Continue trip → new track of the same trip; still wa-night) · Drift, storm and battery alerts (drift > 0.8 kn at rest, storm > 1.5 hPa in 3 h, battery < 20 %; still wa-storm)
3 Mood band MOOD-W1
4 A sailing instrument (tinted) Eyebrow "1 · A sailing instrument", title "Three screens. Everything you check at sea." Feature splits Dashboard, Track, Environment with stills wa-maxavg, wa-track, wa-env.
5 A digital logbook Eyebrow "3 · A digital logbook", title "Pair once. Every trip lands in your logbook." Steps Install / Pair / Sail. Buttons "Full install guide" → /help#install, "See what the Logbook does" → /logbook.
6 Controls (tinted) Title "Made for wet hands." Rows START, BACK, UP · DOWN, LIGHT with their actions.
7 Testimonials "From sailors who use it.", WatchApp testimonials
8 FAQ "WatchApp FAQ", 6 items, link to /help#faq
9 CTA "Record your next trip." / "Free beta for %{count} Garmin models." + "Join the beta"

Section numbering in the copy is 2, 1, 3 because the tracker section comes first on the page.

DataField (/datafield)

# Section Content
1 Hero Badge "Free", eyebrow "SailEver DataField · v1.2", title "Thirteen sailing numbers." / "One field.", lede. Buttons "Get it on Connect IQ" (store URL from products.yml, new tab), "Does it run on my watch?". Support line. DataField film.
2 What's on the screen 12 metric tiles (icon, name, detail): SOG, speed curve, average speed, tack and jibe angle, COG, distance, pressure, pressure trend, lat/lon, time of day, activity timer, GPS and battery
3 Three features (tinted) Speed curve, Tack and jibe angle, Storm warning, each with a framed still (df-field, df-tack, df-storm)
4 Why a data field + Install (#install) 3 reasons; the DataField install guide next to the df-full still
5 DataField or WatchApp? (tinted) Title "Want a logbook too?", 7-row comparison DataField vs WatchApp, link "Explore the WatchApp →"
6 Testimonials DataField testimonials
7 FAQ "DataField FAQ", 5 items, link to /help#faq
8 CTA "Put a sailing screen on your watch." / "Free on the Connect IQ Store for %{count} Garmin models." + store button

The DataField's own behaviour is specified in ../datafield/README.md.

Logbook (/logbook)

# Section Content
1 Hero Badge "Free in beta", eyebrow "SailEver Logbook", title "Every trip," / "charted and counted.", lede. Buttons "Join the beta" and "Sign in" (signed in: "My Logbook" → /my). Logbook film.
2 Feature splits Blue where you sailed. Red where you motored. (split bar example 42.1 / 9.8 / 2.1 estimated, engine 2.4 h; screenshot how-logbook) · Where you spent the night, remembered. (3 example stops, MOOD-L1) · No passwords. With the WatchApp, no uploads. (lb-garmin) · Forgot to stop? Battery died? (trim, bridge, name tracks, move a track; "Nothing is deleted. Every change can be undone.") · Owned or chartered. (MOOD-L2) · A link for anyone. Your crew on board. ("Every trip stays private until you share it. Send a public link to family and friends, or invite your crew." and four points: public link for 30 days without an account, follow along at the last sync while recording, crew link into the crew's own logbook with the miles counting for them, only you edit, export or share and your name only shows if you want it to; screenshot lb-public of a shared trip on desktop and phone; sharing.md)
3 Privacy trio (tinted) Private by default ("Trips are yours until you share them. Public links end after 30 days.") · Export any time · No ads, not for sale
4 CTA "Your next trip writes itself." + "Join the beta"

Watches (/watches)

# Section Content
1 Hero Eyebrow "Supported watches", title "Does SailEver run on your watch?", lede "Type your model. We'll remember it on this device.", full watch check
2 All models (tinted) Title "Supported Garmin watches", legend "App = WatchApp · Field = DataField", family jump links, then one list per family (name and "· count"), each watch with "App", "Field" or "App · Field". Families sorted A–Z.
3 CTA "Your watch isn't listed?" + "Tell us your watch" → /help?topic=watch#support

Help (/help)

# Section Content
1 Hero Title "Install, questions," / "support.", jump buttons Install guides / FAQ / Contact support
2 Install (#install) Two install guide cards side by side (below)
3 FAQ (#faq, tinted) Topic links, then groups General (first item open), WatchApp, DataField, Logbook, Privacy (#faq-<group>)
4 Support (#support) "Still stuck? Write to us.", text, support@sailever.com, MOOD-S2, and the support form

Install guide cards

Each card: status badge, title, numbered steps, a tip, and a button.

Card Steps Button
DataField Install from the Connect IQ Store → Sync with Garmin Connect → open the Sailing activity settings → add a one-field screen with Connect IQ → SailEver → start the activity. Tip: any outdoor GPS activity works. "Get it on Connect IQ"
WatchApp Join the beta → install from the link in the invite → sync, add to favourites → Pair device, enter the code at sailever.com/pair → Start new trip. Tip: the button map. "Join the beta"

Support form

POST /support_requests.

Field Rules
Name Required
Email Required
Topic Select: Question about the WatchApp · Question about the DataField · Question about the Logbook · My watch isn't listed · Something doesn't work · Other. ?topic=<key> preselects one (e.g. watch). The topic's label is stored.
Your watch Free text, prefilled from the watch cookie. Appended to the message as "Watch: " (max 80 characters).
Message Required, 6 rows
Quick check A maths question with two numbers 1–9 and an emoji operator (+ − × ÷, division always whole), e.g. "7 ➕ 2 = ?". Hint "Keeps the bots out. No tracking."
Outcome Result
Wrong or missing captcha answer Back to /help#support, alert "That answer to the quick check wasn't right. Please try again." The form is empty again.
Saved Admin notification email (emails.md), then the "Message sent" page /support_requests/sent: "Thanks, . We'll answer at , usually within a few days." with buttons Help and SailEver.
Not saved Back to /help#support, alert "Your message couldn't be sent. Please check the fields and try again."

About (/about)

Hero ("Built by a skipper" / "who got tired of going below to read the barometer.", story, MOOD-A1) · signature feature "Jakob Sommerhuber, skipper and developer, Austria" (MOOD-A2) · Principles (3, tinted) · mood row MOOD-A3…A5 · CTA "Sail with us." / "Join the beta, or write to us with ideas, questions and the watch you sail with." with buttons "Join the beta" and "Contact" → /help#support. There is no donation or "Buy us a coffee" link anywhere on the site.

Join the beta (/beta)

Left: eyebrow "Join the beta", title "Record your next trip with SailEver.", lede, three points (who, when, what), the form. Right: MOOD-B1.

Field Rules
Name Required
Email Required, valid format, stored lower-case
Your watch Free text, prefilled from the watch cookie. Hint "Watch not supported yet? You can still sign up; tell us the model and we'll write when it runs."
What do you sail? Free text, 3 rows
Privacy checkbox Required. Lock icon, bold label "I agree to the privacy policy", hint "I have read the privacy policy and agree that SailEver processes my data to run the beta." ("privacy policy" links to /privacy). Not ticked: the error "Please agree to the privacy policy." and nothing is stored. The time of the consent is stored on the application (privacy_consented_at), again on every new submission.
Terms checkbox Required. Check icon, bold label "I accept the terms of service", hint as on the sign-in page (auth.md); stored as terms_accepted_at. Not ticked: "Please accept the terms of service."
  • Button "Request my invite". Note "We only use your email for the beta. Unsubscribe any time."
  • The same email submitted again updates the existing application.
  • From the sign-in page (beta only, an address without an account, auth.md): with an application for that address, the form shows all of its fields and the notice "Please wait until your application is accepted." (web.beta.waiting, all 7 languages); without one, the form starts with the address filled in.
  • Errors show as a list above the fields (Rails messages, e.g. "Name can't be blank").
  • Success: redirect to /beta?joined=1 with a notice; the page then shows "You're on the list." and a button "Install guides".
  • If an account with the same email exists, the application belongs to it (user_id), so deleting the account deletes the application (data-model.md).
  • The application lands in the admin list as pending (admin.md). No email is sent to the applicant at this point; a new address sends every admin the beta sign-up notification.

/imprint, /privacy, /terms share a hero (eyebrow "Legal", title, lede) and a prose body. The body is English on every locale, except the five disclaimer paragraphs of the terms (home.disclaimer.p1–p5), which exist in all seven languages.

Page Content
Imprint Service provider Jakob Sommerhuber, Schubertstraße 4, 2214 Auersthal, Austria; support@sailever.com; nature of service; EU ODR link; liability note
Privacy Version line "Version 2, effective October 22, 2026" (from config/privacy.yml, auth.md); 1 controller; 2 data collected: account and sign-in data (email, name, language, magic links, passkeys as public key only, the stored consent), watches (Garmin and Wear OS: nothing is sent until the user agrees on the watch, then device ID, model and app version for pairing and counting installs, after pairing the tracks; device token stored as a hash; unpairing sends nothing more), track data, one position every 5 s, the uploaded FIT and GPX files deleted once imported (with the names and notes written in the track editor), sharing and crew (what a public link shows for 30 days, first name only with the setting, what crew and owner see of each other, links and memberships stored and deleted with the trip or account), support requests and beta applications, FIT activities on the watch being Garmin's or Google's processing; 3 legal basis (consent withdrawn by deleting the account or unpairing); 4 cookies and web analytics (Google Analytics paragraph); 5 recipients and processors (Oracle Cloud Infrastructure in Amsterdam: hosting, database, files, email; Cloudflare: DNS, map tiles, inbound email; Sentry: error reports; Open-Meteo: tides with the position rounded to about 11 km, and the model wind along each track (stored with it) with 0.25° cells (about 28 km) and the dates, no ID; openstreetmap.org, openseamap.org and unpkg.com loaded by the browser); 6 retention (account data until deletion; never-paired watches 30 days; links deleted 30 days after they end, crew until they leave or are removed; server logs at most five files of 10 MB per service, overwritten, not archived; database backups up to 30 days; support requests and beta applications until handled, at most 12 months); 7 rights, with Delete account in the account settings, GPX export per trip and the right to complain to the Austrian Datenschutzbehörde; cookie list (session cookie, ending 60 days after the last visit; sailever_watch)
Terms Lede "Version 1, effective October 22, 2026 …" (from config/terms.yml, auth.md). Navigation notice (supplementary aid only); 1 who we are and scope (operator as in the imprint; the privacy policy is separate); 2 accepting (checkbox when the account is created: sign-up, beta, crew link; at least 16 years; one person per account); 3 beta, free use and future charges (free during the beta; SailEver intends to charge for all or parts later; prices and changes announced at least 30 days ahead; never charged without an order; export and deletion always possible); 4 your trips, sharing and crew (trips stay yours; licence to store and show them to run SailEver; public links for 30 days to anyone with the link, including the last position while recording, first name only with the setting; crew see the trip read-only and its miles count for them; only share what you may); 5 acceptable use; 6 good seamanship (disclaimer p2, p5, approximate depths, names, wind and tides not for navigation); 7 weather data (p3); 8 "as is" and liability (p1, p4, limited by law: not for intent, gross negligence, injury to life, body or health, product liability or mandatory consumer rights); 9 availability and changes; 10 ending (delete any time; suspension for serious breaches); 11 changes to the terms (accepted again on the next visit); 12 Austrian law without conflict rules and CISG, consumer rules of the home country stay

Redirects

From To
/supported-devices /watches (locale kept)
/contact /help#support (locale kept)

States and edge cases

  • Signed-in visitors see the public pages in the public header with "My Logbook" instead of "Sign in" / "Join the beta".
  • With no approved testimonial for a product, the testimonials block renders an empty section head.

Known deviations

  • The privacy page says Google Analytics is used, and in the same page says "We use no tracking or advertising cookies." No analytics code is loaded. One of the two statements is wrong. Kept on purpose until analytics is added.
  • The FAQ and the watch check say SailEver runs only on Garmin and treat Wear OS as "not yet", while a Wear OS WatchApp exists (../watchapp/README.md).
  • The WatchApp install guide and the logbook steps say the invite email has the install link. The beta invitation email has no store link (emails.md).