The heaviest week of the spring, and three separate hard things landed at once. Auth moved to Firebase everywhere - after flirting with a couple of other options, the honest calculus was "stop building auth, use the thing that works, get back to the actual product." The equipment locker shipped end-to-end, and the service-ticket system - repair intake for a dive shop's workshop - got born.
The BLE dive-computer sync fought back. There is a commit titled SWIFT TASK CONTINUATION MISUSE that represents an evening I am not getting back, and a full "parity pass with the working web client" because the phone and the browser disagreed about how to talk to a dive computer over Bluetooth.
Shipped
- Firebase Auth across login and iOS (email, phone, Apple, Google); killed OneSignal and standardized on one push pipeline instead of two half-working ones
- Equipment locker v1 → v3: customers add regulator systems, track service intervals, upload receipts
- Service tickets: intake, tech directory, dynamic service forms, workbench checklists, customer pickup
- Native tech service-entry on iOS (camera + checklist + outcome), and BLE sync that finally behaved
- Postgres-backed idempotency keys, because paying twice is the one bug customers never forgive