DeepLog
A complete ecosystem for scuba diving: an offline-first Flutter app that syncs with Shearwater dive computers over Bluetooth, a club back-office, a public site. Four applications, 249 screens specced, one operator.
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, offline-first architecture designed for divers logging on boats without 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 that dive clubs use to manage members, events, equipment and 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 static marketing site that is the product's entry point. Entirely SSG for performance and SEO, with legal pages, privacy policy, the GDPR account-deletion route required by Apple/Google, 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 the living demonstration of the positioning you read above: one person thinking the domain (diving, BLE, FFESSM clubs), running the market study, specifying 249 screens in an Obsidian vault, designing data architecture, implementing all four surfaces (Flutter, C via FFI, Supabase Edge, two Next.js apps), shipping back-office and public site to production, and preparing the app stores submission. No hand-off meetings, no "that's the backend's bug".