Inspiration
It started in Egypt, by the sea, after a dive.
Daniele and I have been shipping apps for years, some of them used by millions of people. We had also, separately and without telling each other, been circling the same idea for a long time: build something around Diving.
That afternoon on the Red Sea we finally started talking about diving instead of software, and about everything that is broken around the dive. Not the dive itself, the dive is perfect. Everything before it and everything after it.
The surface interval ritual is the tell. Everyone comes up, and every single diver pulls out a different broken solution: one has a paper logbook curling from salt water, one is squinting at a dive computer retyping depth and bottom time by hand, one gave up years ago and logs nothing at all. The data already exists. Their computer recorded it. They were retyping it anyway.
And then somebody said "that was my first eagle ray." That is a milestone. It is the reason people dive. And there is nowhere to put it. Every dive app has a notes field where sightings go to die.
What made it click was realising, in that same conversation, that we had independently arrived at the same list of improvements. Same frustrations, same fixes, same product. So we stopped brainstorming and united forces: we started building right there, in parallel, with a fleet of coding agents doing the heavy lifting across iOS, backend and web. The idea was alive within a few hours.
The scuba community is big, beautiful, and genuinely underserved. There is no ecosystem that covers the things divers actually care about end to end. That is the gap we are filling, and the traction we are already seeing says we read it right.
So the wedge was obvious. Kill the typing (import), then give divers the thing they actually want to keep and show off (the life list).
What it does
- Import instead of typing. Dives come in from Apple Health (Apple Watch Ultra, Garmin Descent) or from UDDF / FIT / CSV exports produced by Suunto, Mares, Shearwater and friends. Depth profile, bottom time, temperature, surface interval: all parsed on device.
- Real dive sites. 14,000+ dive sites seeded into the app, so a dive is not a nameless GPS blob. Log "Blue Hole, Dahab", not "26.9°N, 34.1°E".
- Seadex, the species life list. Tag what you saw. SeaLog builds your lifetime species list, matched against real biogeography: species are tied to explicit sea basins, so the app will not suggest a Caribbean fish for a Red Sea dive or pad a thin page with legendary animals that were never there.
- Dive safety math. An on-device dive engine computes no-fly time, surfaced as a Live Activity on the Lock Screen. Useful on the way to the airport, which is exactly when divers panic about it.
- Offline first, sync always. SwiftData locally, Supabase in the cloud. Boats do not have LTE. The app works at the surface interval with no bars and reconciles later.
- 9 languages, Sign in with Apple and Google, and a full 68-article help center.
How we built it
- iOS: Swift 5.10 / SwiftUI, iOS 17+, SwiftData for local-first storage, XcodeGen so the project file is generated and never hand-edited. A separate widget target drives the No-Fly Live Activity.
- Backend: a dedicated Supabase project. Postgres plus Row Level Security is the entire authorization model: everything a diver logs is private by default, and only becomes visible when they explicitly publish it. CloudKit was deliberately dropped once the web surface entered scope, because browsers cannot read CloudKit.
- Sync: client-generated UUIDs with last-write-wins reconciliation, so the phone never has to be online to accept a dive.
- Import pipeline: HealthKit reads plus a UDDF/FIT/CSV parser, all on device, then upload. The dive-computer teardown work (BLE model list, vendor VID/PID map) lives in the repo as the roadmap for direct cable-free download.
- Monetization: StoreKit 2 with RevenueCat as the source of truth for entitlements, and a RevenueCat-hosted paywall so pricing and copy can be tested without shipping a new binary. Server-side entitlement checks mean a reinstall, a device swap, or a refund is handled correctly instead of trusting whatever the local receipt says.
- Web: Next.js on Vercel sharing the same Supabase backend, serving public profiles and programmatic dive-site and species pages, generated from real logged data. That is the zero-CAC acquisition loop: divers log on iOS, publish, the site and species pages get richer, the pages rank, new divers arrive.
Challenges we ran into
- Dive data has no standard. UDDF is a spec that every vendor implements slightly differently, and half the export flows in the wild are CSV files with vendor-specific column names. Getting a Suunto export and a Garmin Health record to land as the same shape of object took far more defensive parsing than expected.
- Biogeography is a correctness problem, not a content problem. The first pass at species suggestions happily offered animals that do not live within thousands of kilometres of the dive. Rebuilding species matching around explicit sea basins, with freshwater and landlocked exclusions, was the difference between a fun feature and a feature divers would trust.
- Offline-first is easy to claim and hard to earn. Every write path had to assume no network, every read path had to assume stale data, and the sync engine had to be idempotent because divers open the app in exactly the worst connectivity conditions on earth.
What we learned
- The feature that sells the app is not the feature that retains it. Import is the reason someone downloads SeaLog. The life list is the reason they open it again after the trip is over.
- Collection mechanics beat streak mechanics for hobby apps. Divers dive a few times a year, so a daily streak is hostile. A list that only ever grows is not.
- Two founders plus a fleet of agents is a genuinely different build shape. iOS, Supabase and the web surface moved in parallel from day one instead of queueing behind whoever was free, which is the only reason a product this wide existed within hours of the conversation that started it.
- Pricing is a product decision, not a settings screen. Moving entitlement checks server-side and paywall copy out of the binary turned monetization from a thing we shipped once into a thing we can actually learn from.
What's next for SeaLog
- Programmatic dive-site and species pages built from aggregated real logs: actual depth, visibility and temperature by month, and where each species is genuinely being seen.
- Dive-shop tooling, so centres can push the day's dive straight into their customers' logbooks.
Log the dive. Grow the list. Never lose a dive again.
Log in or sign up for Devpost to join the conversation.