Back to work
Personal product · Diving ecosystem · 2026 — TestFlight + web live

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.

Flutter Dart Supabase Next.js 16 TypeScript Stripe Connect BLE / Native C bridge SQLCipher Tailwind
Challenge

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.

Approach

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.

Outcome

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.

01

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:

16:52
DeepLog
A Augustin Drye
Île Maïre — Pointe de l'Eissadon
34.2mMax
77minTime
15°CTemp
0Notes
Île Maïre — Pointe de l'Eissadon
1 March 2026 · 14:38
-34m Max depth
76min Duration
15°C Temp
67bar End pressure
Open circuit Bühlmann GF 90/90
Air consumption
Start 311 bar Used 244 bar End 67 bar
Species identified · 1 + Add
Purple flabellina
Flabellina affinis
Determination key
Step 1/3
What kind of organism did you observe?
📍 Look at the overall shape
🐟
Fish
Elongated body with fins
🐙
Tentacled invertebrate
Octopus, cuttlefish, squid, nudibranch…
🐚
Shelled mollusc
Mother of pearl, limpet, visible shell
Echinoderm
Starfish, urchin, sea cucumber
🪸
Cnidarian
Jellyfish, anemone, gorgonian, coral
Dive computer
Connecting…
Teric detected
Status
Bluetooth on
Computer detected
Authenticating…
Import dives
  • 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.
02

Back-office — admin.deeplog.eu

Next.js 16 · React 19 · Supabase · Stripe Connect

The 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:

🔒 admin.deeplog.eu/club/tableau-de-bord
Dashboard
Season 2026 · real-time
Club active
Members 84 +6 this month
Events 12 April 2026
Gear 217 8 due review
Revenue 4 280 € +18 %
Dives per month2026
Upcoming events
Calanque de Sormiou 18 avr · 09:00 · N1+ 12/14
Île Maïre 21 avr · 08:30 · N2+ 8/10
Cassidaigne drop-off 25 avr · 07:45 · N3+ 6/8
Members
84 active · 3 join requests
Synced with mobile app
Member Email Role Dives
AD Augustin Drye
augustin.d@… Owner 147
MD Marine Dubois
m.dubois@… Admin 92
PL Pierre Lefèvre
p.lefevre@… Member 34
SR Sophie Renaud
s.renaud@… Member 61
Events
12 planned · 3 archived this month
FFESSM · PDF sheet
Calanque de Sormiou · 18 avr. 09:00 · N1+ · Fiche de sécurité prête 12/14
Île Maïre — Pointe de l'Eissadon · 21 avr. 08:30 · N2+ · 2 tampons air réservés 8/10
Cassidaigne drop-off · 25 Apr 07:45 · N3+ · Paiement 45€ via Stripe Connect 6/8
Nitrox cert. · 2 May Full day · €85 · 1 spot left 11/12
Equipment
217 items · 8 due for review
QR codes · Loans tracked
Regulators 42 3 due
Blocs 68 5 visual
BCDs 38 All OK
Wetsuits 69 All OK
Current loans
Mares Abyss regulator #D-042 Pierre L. · since Apr 12 7 j
12L steel tank #B-017 Sophie R. · since Apr 14 5 j
Scubapro Hydros BCD #S-008 Marine D. · since Apr 15 4 j
Billing
Stripe Connect · Verified
Payouts enabled
Collected 4 280 € April 2026
Pending 215 € 2 transactions
Refunds 0 This month
Stripe fees 75 € 1.75%
Recent transactionsCSV export
Cassidaigne event · Pierre L. 16 avr · CB · Stripe Connect 45 €
Nitrox cert. · Sophie R. 15 avr · CB · Stripe Connect 85 €
Annual fee · Marine D. 14 avr · SEPA · Stripe Connect 120 €
Statistics
2026 season · real-time
PDF · CSV export
Top club spots2026
Île Maïre — Pointe de l'Eissadon Avg depth -28 m 24×
Calanque de Sormiou Avg depth -18 m 19×
Cassidaigne drop-off Avg depth -42 m 11×
Top divers
Augustin Drye Owner · 147 dives total 28
Marine Dubois Admin · 92 dives 21
Sophie Renaud Member · 61 dives 15
  • 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.
03

Public site — deeplog.eu

Next.js 16 · SSG · Tailwind · SEO

The 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.

🔒 deeplog.eu
Offline-first · €3.99/mo

The intelligent
dive logbook.

Every dive deserves to be told. Shearwater sync, determination key, spot map and social feed — without signal, without a laptop.

16:52 ●●● 5G
Offline-first · €3.99/mo

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.
Visit deeplog.eu
Case study · 4-app ecosystem

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)
  1. Feb. 2026 Market research and benchmark across 14 competing apps (Subsurface, MacDive, Diveboard…). Offline-first + social + club positioning validated.
  2. Early March Obsidian vault built : 249 screens specced (mobile + back-office + web), Supabase tables, 30+ notifications, sync strategy, design system.
  3. 16 Mar 2026 First code commit. Diving-domain modeling — computers, profiles, species, spots, club roles, Bühlmann deco model.
  4. Late March Flutter app : BLE C bridge via Dart FFI, Shearwater Teric Bluetooth sync, encrypted Drift + SQLCipher storage, triple Supabase auth (Apple / Google / email).
  5. Mid April admin.deeplog.eu deployed (Next.js back-office + Stripe Connect). deeplog.eu live (SSG public site). Interactive determination key across 110 species.
  6. 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).
  7. 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".