DriveKeep
DriveKeep: photo-first fuel, mileage and maintenance log for iOS and the web
A vehicle log where a refill starts with two photos and every number is labelled as measured or estimated, built as an iOS app, a web app and an API.
A personal log for running a car and a motorcycle. A refill starts with a receipt photo and an odometer photo; extraction fills in the form and the owner confirms. Economy is only reported when it was measured between two full tanks, estimates are labelled as estimates, and a vehicle with nothing to measure from shows "Not available" rather than a default. One repository: a SwiftUI iOS app with on-device extraction and opt-in Supabase sync, a Next.js web app with server-side OCR, and a standalone Express backend. Personal project; the web app is deployed on Vercel, the iOS app is not published.

Product, iOS App, Web App, Backend API, Database & Security, Tests
Key Highlights & Practical Impact
Executive Scan- iOS extraction on the device with Apple Vision, and Apple's Foundation Models returning structured results on iOS 27+
- Google sign-in through Supabase without the Google SDK; credentials in the Keychain; sync to row-level-secured tables, off by default
- Economy only from full tanks, estimates labelled, and "Not available" instead of any default figure
- Next.js web app with server-side OCR (sharp + Tesseract.js) and guards for backwards odometers and duplicate refills
- Express 5 API over PGlite with JWT auth, versioned migrations, sync tombstones and backup tooling
- 64 backend checks (database, API, security) and 21 engine checks passing on the latest commit
Ready to explore the build?
A detailed look at the end-to-end architecture, process workflows, key engineering decisions, live production capabilities, challenges, and results.
Writing from this work
Two Ways I Use Supabase Row Level Security: Deny-All Behind a Server, or Per-Owner Policies
Across five projects, RLS does one of two jobs: close the Data API while a trusted server does the work, or let Postgres enforce who owns each row. When to pick which.
Google Sign-In on iOS Through Supabase, With PKCE and No Google SDK
Google sign-in on iOS through Supabase with ASWebAuthenticationSession and PKCE, no Google SDK or client secret, plus an identity bug RLS would reject.
Sharing One Supabase Project Between Two Apps Safely
A second app inside an existing Supabase project: prefixed tables, RLS on with no policies, revoked grants, server-only access and an admin check for a shared user list.
Defaults Are Claims: Removing Placeholder Numbers That Looked Like Measurements
A 75% tank, a 10 km/L economy, a hardcoded user id: defaults in DriveKeep that rendered as real data, what replaced them, and the same rule in SpenDrop.
Deletes That Don't Come Back: Tombstones and Last-Write-Wins in Offline Sync
In offline sync, a deleted record comes back when another copy is pushed. DriveKeep's soft deletes, tombstone list and timestamp merge, and its clock problem.
Reading an Odometer Photo: Preprocessing Variants, Tesseract.js and a Plausibility Check
DriveKeep's web app reads four sharp-preprocessed variants of an odometer photo with Tesseract.js and ranks every candidate against the previous reading.
Measured or Estimated: Calculating Fuel Economy Only From Full Tanks
Dividing a top-up into the distance driven gives a meaningless economy figure. How DriveKeep measures km/L only from full tanks and labels estimates.
Screens That Look Like Payments but Aren't: Parsing Malaysian Receipts Without Fake Expenses
Balance, credit-limit and reward screens all show RM amounts. How SpenDrop rejects them, and the Malaysian receipt formats two of my parsers read.
Generating an Xcode Project File From a Script, With Stable IDs
Both of my iOS apps write project.pbxproj from a script. How the object IDs are made, why hashing names beats a counter, and what it costs.
A Postgres-Backed Express 5 API With No Database Server: PGlite, JWT and Security Tests
DriveKeep's backend runs PostgreSQL in-process with PGlite, signs HS256 tokens and has 17 security checks. What it does well and what must change first.
Structured Receipt Extraction With Apple's Foundation Models and @Generable: A Code Walkthrough
How DriveKeep's iOS code asks Apple's on-device Foundation Models for typed receipt fields and fuses them with Vision OCR. A walkthrough of unverified code.