Single-page marketing site for Submersion (scrollytelling landing page).
- Open
index.htmldirectly in a browser, or - Run a simple static server:
python3 -m http.server 5173Then visit http://localhost:5173.
index.html: the homepage. Nine zones from 0 to 60 m: hero, dive computer download and import, the log, sites and trips, photos and gear, profile analysis, planning, your data, download. Section ids arecomputer,log,sites,media,analyze,plan,data,download; the olderwhy,screens,features,supportanchors still resolve.privacy/,terms/: Privacy Policy and Terms of Service (mirrors ofPRIVACY.md/TERMS.mdin the app repo; linked from the footer)styles.css: the visual system (dark-only, zone layouts, feature grids, gauge)ocean.js: scroll-driven water color, parallax, marine snow, the depth gauge, and section revealsscript.js: release lookup and platform-detecting download buttondownloads/: the public download count. The page and the line under the home page's download button readdownloads/summary.jsonfrom the app repo'smetricsbranch, and show nothing if it is missing, invalid or more than 7 days old.scripts/snapshot_downloads.pyin the app repo has the counting rules.screenshots/: window captures of the macOS app at 2400 px wide, used on the pageassets/: logo, favicon, App Store and Google Play badgeslightroom/: Adobe Lightroom integration walkthrough and OAuth callback page (self-contained styles)c.html,g.html,f.html: landing pages for cylinder passport tags (https://submersion.app/c#<payload>), gear tags (/g, any other equipment) and fill records (/f). The tag page reads the payload from the URL fragment in the browser, so nothing reaches the server;passport/tag.jsmirrors the app's decoder (format:docs/developer/reference/formats/cylinder-passport-tag.mdin the app repo), including the newest fill an NFC tag carries, which the page shows with a note to analyse the gas. The gear tag page works the same way withpassport/gear-tag.js, which mirrors the app's gear tag decoder (format:docs/developer/reference/formats/gear-tag.mdin the app repo) and shares the cylinder decoder's text and date rules. The fill record page only explains the link until the app ships that format..well-known/:apple-app-site-associationandassetlinks.json, which let iOS and Android open/c,/gand/flinks in the app. Android takes the paths from the app's own manifest; only the iOS file lists them.assetlinks.jsonmust list the SHA-256 of every certificate that signs an Android build. It lists Play's app-signing key (Play Console, Test and release, App integrity), which signs every copy installed from Google Play, and the CI release key behind the GitHub-release APK (also the Play upload key). Debug keys stay out: a debug keystore's password is the public default, so trusting one would let whoever holds it claim these links.tests/:node --test tests/*.test.mjsruns the tag page's tests and pins the shape of both link files (also run in CI)..github/workflows/link-files.yml: after a deploy, and daily, checks that the site serves both link files unchanged and that Apple's CDN and Google's Digital Asset Links have picked them up. GitHub Pages servesapple-app-site-associationasapplication/octet-stream; this check is what shows whether Apple accepts it.assets/card.css: the card layout shared by the single-purpose pages (the Lightroom callback and the passport pages).docs/superpowers/specs/: design specs for the site (the copy rules and verified-claims table live in the 2026-08-23 spec)