DeepLog
Diving happens off-grid. So I built a complete ecosystem that embraces it: an offline-first Flutter app that talks Bluetooth to Shearwater dive computers, a club back-office, a public site. Four applications, 249 screens specced. One point of contact: me.
Existing dive logbooks are either dated (2000s-era UX) or locked to a single manufacturer. A diver wants to: log without signal (dives happen off-grid), import data from their Shearwater computer, identify species, share with their club.
Four-surface ecosystem: offline-first Flutter app (Drift + SQLCipher, bidirectional Supabase sync), Supabase Edge Functions for the API, a Next.js back-office for dive clubs, a SSG public site. BLE bridge written in C via Dart FFI, native parsing of the Shearwater protocol.
deeplog.eu and admin.deeplog.eu live. Mobile app on TestFlight. Shearwater sync (Teric, Perdix, Peregrine, Petrel), determination key over 110 species, premium via StoreKit 2 + Play Billing at €3.99, Stripe Connect for clubs.
Mobile app — iOS & Android
Flutter · Dart · Drift · Supabase · BLE C bridge (FFI)The flagship. Flutter on iOS and Android from a single codebase, an offline-first architecture I designed for divers logging on boats, with no signal. SQLCipher-encrypted local database (schema v30, 26 tables), bidirectional Supabase sync when connection returns. Tap the tabs to navigate the app:
- Shearwater BLE sync — Teric, Perdix, Peregrine, Petrel. BLE C bridge via Dart FFI, native profile parsing.
- Offline-first — Drift + SQLCipher (26 tables, schema v30), bidirectional Supabase sync when connection returns.
- Determination key — interactive decision tree over 110 species (no AI, just domain modeling).
- Enriched profile — depth curve + temperature overlay + air consumption + Bühlmann GF deco model.
- Spot map — FlutterMap with 57 French spots pre-seeded, creation and sharing.
- Social feed + badges — dive timeline, 18 badges, reactions, comments, photos.
- Cross-store premium — Apple StoreKit 2 + Google Play Billing, subscription at €3.99/month.
- Triple auth — Apple SSO, Google SSO, email/password via Supabase Auth.
Back-office — admin.deeplog.eu
Next.js 16 · React 19 · Supabase · Stripe ConnectThe dashboard I built for dive clubs: members, events, equipment, billing. Shared auth with the mobile app via the same Supabase project, Stripe Connect for payment onboarding. Click the sidebar items to navigate:
- Member management — roles (owner/admin/member), QR invitations, dive history per member.
- Events + FFESSM safety — calendar, participants, official safety sheet to PDF.
- Stripe Connect — payment onboarding, tracking, refunds, CSV export.
- Equipment inventory — categories, items, revision alerts, QR-code loans.
- Club stats — KPIs, Recharts, top spots, leaderboards, PDF export.
- Shared mobile ↔ web auth — a single Supabase account for app + back-office.
Public site — deeplog.eu
Next.js 16 · SSG · Tailwind · SEOThe product's front door. Entirely SSG — a marketing site has no excuse to be slow: legal pages, privacy policy, the GDPR account-deletion route Apple and Google require, and the auth callback for mobile deep links.
The intelligent
dive logbook.
Every dive deserves to be told. Shearwater sync, determination key, spot map and social feed — without signal, without a laptop.
The intelligent
dive logbook.
Shearwater sync, determination key, social feed — without signal.
- 100% SSG — every page statically generated, Lighthouse targets 100/100.
- Editorial typography — DM Sans + DM Mono + Fraunces, teal palette #1D9E75 aligned with the app.
- Legal routes — T&Cs, privacy, legal notices, GDPR deletion (store-required).
- Deep-link callback — auth route for password-reset links from the mobile app.
From market research to TestFlight, six intense weeks.
- ~160k Lines of code (Dart + TS + C)
- 315 Commits · 4 code repos
- 249 Screens specced (Obsidian vault)
- 1 Developer (me)
- Feb. 2026 Market research and benchmark across 14 competing apps (Subsurface, MacDive, Diveboard…). Offline-first + social + club positioning validated.
- Early March Obsidian vault built : 249 screens specced (mobile + back-office + web), Supabase tables, 30+ notifications, sync strategy, design system.
- 16 Mar 2026 First code commit. Diving-domain modeling — computers, profiles, species, spots, club roles, Bühlmann deco model.
- Late March Flutter app : BLE C bridge via Dart FFI, Shearwater Teric Bluetooth sync, encrypted Drift + SQLCipher storage, triple Supabase auth (Apple / Google / email).
- Mid April admin.deeplog.eu deployed (Next.js back-office + Stripe Connect). deeplog.eu live (SSG public site). Interactive determination key across 110 species.
- 19-20 April Compliance audit iOS/Android (Phase 11): 16 store blockers + 4 legal non-compliances identified (GDPR, FEC, LCEN). +35 additional screens specced (Phase 12).
- Now Mobile app on TestFlight (iOS) + Play internal testing (Android). Back-office and public site live. 44% of 249 screens implemented, prioritised by store blockers + persona flows.
// Bridge C entre Flutter (via Dart FFI) et la stack BLE native.
// Chaque notification BLE est un paquet complet ; la stack native
// lit ces paquets via iostream_read pour reconstituer la plongée.
typedef struct {
uint8_t data[MAX_PACKET_SIZE];
size_t len;
} ble_packet_t;
struct ble_bridge_s {
ble_packet_t rx_packets[MAX_PACKETS]; // queue circulaire
size_t rx_head, rx_tail, rx_count;
pthread_mutex_t rx_mutex;
pthread_cond_t rx_cond; // réveille le reader natif
Dart_Port tx_port; // Dart Native API pour le TX
};
// Appelé par flutter_blue_plus quand une notif BLE arrive.
int ble_bridge_push_rx(ble_bridge_t *b, const uint8_t *data, size_t len) {
pthread_mutex_lock(&b->rx_mutex);
if (b->rx_count >= MAX_PACKETS) { pthread_mutex_unlock(&b->rx_mutex); return -EAGAIN; }
memcpy(b->rx_packets[b->rx_head].data, data, len);
b->rx_packets[b->rx_head].len = len;
b->rx_head = (b->rx_head + 1) % MAX_PACKETS;
b->rx_count++;
pthread_cond_signal(&b->rx_cond); // le reader natif peut lire
pthread_mutex_unlock(&b->rx_mutex);
return 0;
}
This project is my positioning made flesh — and code. I think through the domain (diving, BLE, FFESSM clubs), run the market study, spec 249 screens in an Obsidian vault, design the data architecture, build all four surfaces (Flutter, C via FFI, Supabase Edge, two Next.js apps), ship the back-office and public site to production, and get the store submissions ready. No hand-offs, no "that's the backend's bug". What I imagine, I code — and I put it online. In short: hands in the grease, from the first specced screen all the way to TestFlight.