01Problem
De La Salle University – Dasmariñas has a large campus, and getting between buildings mostly means walking in the heat. The campus jeepneys have unpredictable waits and a midday break, and parking is short.
02My role
I built all of the software: the Flutter rider app, the React admin console and the Supabase backend (database, Row Level Security and Edge Functions).
- Marc Jacob C. LentejasThe ESP32 firmware
- Dylan Paulo F. NicolThe dock lock: an actuator that locks the wheel at the docking station
03Approach
- Your school ID is your ride pass.A rider scans the barcode on their DLSU-D ID once to activate, and can relink it if the card is lost or replaced.
- Accountability, enforced by the server.A verified ID at the start and at the return, rides charged every 15 minutes, a campus boundary with a penalty, and an append-only ledger for every peso.
- Hardware gets its own credentials.Device keys live in a separate credential store. When a bike reports its position, the server works out which ride it belongs to from the authenticated bike, instead of trusting a ride ID in the request. Unknown bikes and wrong keys get the exact same refusal, so hardware IDs can't be enumerated.
- Fail closed.A missing campus boundary used to count as “inside”. Now it fails closed, and the boundary validator rejects shapes that would have put every rider outside.
- No ID oracle.The “already registered to another account” reply could have been scripted to find out which IDs are ride passes. Linking an ID is now rate limited per account.
- A console the staff can act on.A live map with each open ride's route, ride history with filters, exports and print views, an alert rail, and a force lock or unlock for the dock.
04Result
The rider app, the admin console and the backend work end to end with my teammates' hardware: barcode rider identification, GPS tracking with ride routes, and ride records.
05Links
The repo and the live system are private. I can walk you through both: Jimenezaerroljj@gmail.com.