GigWorker Earnings Web App
A lightweight, AI-assisted Flask web app for delivery analytics — built because spreadsheets were slowing me down.
When DoorDash became my side-gig, I tracked everything in Google Sheets. But scrolling through formulas and manual updates after a long shift got old fast. One night, out of boredom and curiosity, I asked myself: could I replace this entire workflow with a local web app?
Three nights later, I shipped the DoorDash Earnings Tracker. It’s a fully functioning Flask and SQLite analytics system that logs, visualizes, and exports earnings with zero cloud dependency.
I didn’t want another SaaS subscription or my data living on someone else’s server. I wanted fast weekly insights, clean charts, and a chance to experiment with a production-style Flask project—complete with local authentication, CSRF protection, and systemd deployment.
Mostly, I wanted to see how fast I could ship a real app using an AI-assisted workflow.

The homepage gives you instant KPIs: total earnings, hourly averages, and expense breakdowns. I hooked up Chart.js to visualize weekly earnings, rolling trends, and delivery-to-hour ratios. It beats staring at a grid of cells.

All weekly logs are editable via modal forms. You track hours, deliveries, tips, and out-of-pocket expenses in one place. It supports soft-deletes, sorting, and pagination. Expenses have their own dedicated tables and categories, complete with an optional receipt field.

Data sovereignty was a priority. The app runs completely offline, locked behind a local PIN hash. It includes automated SQLite backups to a /backups directory, a UI for restoring them, and a custom CSV export/import script that detects duplicates.

Architecture & Stack
- Backend: Flask + SQLAlchemy
- Database: SQLite
- Frontend: HTML, Jinja2, vanilla JS, minimal CSS, Chart.js
- Packaging: Bash scripts with a systemd service template


The “Vibe Coding” Workflow
This wasn’t just about escaping spreadsheets; it was an experiment in speed. I used Codex and my own curiosity to rapid-prototype. I’d describe a module, the AI would generate the boilerplate, and I’d refine the architecture, wire up the UI, and squash the bugs.
Going from a blank text file to a polished, locally hosted tool in a few days completely changed how I look at side projects. It proved I can build exactly what I need, fast, without getting bogged down in boilerplate.