Founder · published by Mobil80
Zero Fleets
An app I built to replace the spreadsheets for my own Uber fleet, then published for other fleet owners.
- 6App Store releases
- 51 of 58My commits
- 7Cloud Functions
Why I built it
While working as a developer at Mobil80, I ran an Uber fleet on the side, with 5 cars and about 15 drivers. I tracked trips, income, driver pay, turnover, profit and which car was free in spreadsheets.
The money was the messy part. In this kind of fleet, Uber pays the online fares to the fleet and the driver keeps the cash fares. So every shift ends with working out who owes whom, once rent and the driver’s cash are counted. The owner also has to trust the earnings figures drivers send.
I built an app for my own fleet, and my drivers installed it from Google Drive. The landing screen still says what I wanted from it: “No more losses. No more spreadsheets.”
What it does
A fleet owner (a “vendor” in the app) sets weekly trip targets and deductions such as room rent, and adds cars with a flat or tiered rent. A driver asks to start a duty on a car for one or two 12-hour shifts, and the owner accepts it from the inbox.
At the end of a duty the driver enters trips, earnings, cash, tolls and fuel, or uploads an Uber earnings screenshot and lets Gemini fill the form. The app works out the settlement and updates the driver’s wallet with the fleet. The owner’s dashboard shows the week’s numbers and marks each duty as verified by AI, verified by the owner, or unverified.
Drivers and fleets can also find each other. A driver without a fleet can browse fleets that are hiring and see their address and phone number. Owners can look up a driver by phone number and send an invite. If the driver isn’t on the app yet, WhatsApp opens with an invite message and both store links.
How it works
The app is Flutter with GetX, talking directly to Firebase: Firestore, Auth, Storage for screenshots, and Cloud Functions for server-side work like the weekly counter reset, push notifications and the Gemini calls.
Settlement maths
Each duty produces two numbers. The settlement is earnings minus expenses and deductions, plus tolls, minus the cash the driver collected, minus vehicle rent. It goes into the driver’s wallet. Positive means the fleet owes the driver, negative means the reverse. The driver’s own net balance is separate: earnings minus expenses, deductions, rent and fuel.
Tiered rent thresholds scale with the number of shifts, so a double shift needs twice the trips to reach the same tier. The duty, the driver’s wallet and counters, and the car’s trip counts are written in one Firestore transaction, so they can’t drift apart.
Wallets and counters are running totals, updated with Firestore increments. When an owner corrects an unverified duty from the current week, the app recomputes the settlement and adjusts each total by the change, again in one transaction. Nothing has to rescan old duties. A Mobil80 colleague added the configurable deductions and some fixes to this code.
Duty states and double-booking
A start request becomes a duty only inside a transaction, which fails if the request was already handled or the driver or car already has a duty. Accepting it marks both as on duty and rejects the driver’s other pending requests. Owners can also schedule a duty for later. There is no server job for this. The driver’s app starts the duty when it loads their record after the start time, re-checking driver, car and duty in a transaction first.
Checking earnings screenshots with Gemini
Instead of typing, a driver can upload their Uber daily-earnings screenshot. A Cloud Function picks it up from Storage and sends it to Gemini, which checks that it is an Uber earnings screen showing one day rather than a week, and reads the figures. The app checks the screenshot’s date against the duty and fills the form. Manual entry is always there, and after three failed tries it’s the only option.
My first version used Google Cloud Vision text detection. Nine days later I replaced it with Gemini.
Where it is now
Other fleet vendors had the same problems, so I published the app on both stores under Mobil80’s developer account. The first App Store release went out on 19 November 2025. I pitched it to Mobil80’s CEO, who made it a company product. One of the biggest fleets in Bengaluru helped me reach some vendors. It reached about 40 users, by my count.
Getting fleets to use it turned out to be much harder than building it. Doing development, marketing and client projects at the same time got to be too much, so I stopped.
The last store release is 2.2.20, from 28 March 2026. What I built after that never made it into a store build: a reworked screenshot check that takes up to three images, an earnings calculator, Aadhaar and driving licence checks, and Google, Apple and email sign-in.