I Wish You Wash Here
A booking and operations system for a pickup and delivery laundry: a customer website, an Admin dashboard, and a Driver app. Prices are calculated on the server, weighed with evidence, and approved by the customer before anything is washed. Life's Too Short to Do Laundry.
Visit the live website ↗Admin dashboard
The owner sees bookings and revenue per day, active customers, average booking value, and the best-selling services. Revenue comes from verified payments, using the same formula as the daily report.
The dashboard in this screenshot uses sample data for a scale test: 1,345 bookings and 972 customers over 90 days.
Booking from a phone in four steps
The target customers are busy professionals who browse on their phones and are often away from home at pickup time. Booking needs no account, and the schedule is honest: full time slots cannot be selected.
- ServicePick a category first, then the service. Specialty services are routed to WhatsApp.
- ScheduleThe next 14 days, with the remaining slots for each pickup window.
- DetailsAddress, area, and who can hand over the laundry if the customer is out.
- SummaryA price estimate from the server, then a booking code and live status.
Weekly booking schedule
Admins see a whole week in seven columns: pickup, delivery, and self drop-off cards with their time and status. On a phone, the same view becomes a list per day.
Rules the system enforces
Prices come only from the server
The frontend never sends a price. The backend calculates every quote from a versioned catalog and saves a new version whenever it changes.
History cannot be overwritten
PostgreSQL triggers reject changes to weight records, price quotes, approvals, status history, and the audit log.
Nothing is washed before approval
The database refuses the processing status until the customer approves the latest quote through their link.
A slot cannot be booked twice
The pickup window row is locked while a booking is checked, so two customers cannot both take the last slot.
Permissions are checked on the backend
Admins, staff, and drivers have different permissions. Hiding a menu on screen is never the only guard.
Tested in real browsers
Playwright end-to-end tests in Chromium and WebKit against the production build, backend tests with pytest, and checks at 375px and desktop widths.
Technology and infrastructure
- Frontend
- Next.js, TypeScript, Tailwind CSS, Zod. A static export on Cloudflare Pages.
- Backend
- Python, FastAPI, SQLAlchemy, Alembic, PostgreSQL 16.
- Zero-cost hosting
- Cloudflare Pages and a Worker, then a Cloudflare Tunnel to a Mac mini at the outlet. No ports are open to the internet.
- Operations
- Docker through Colima,
launchdschedules, encrypted database and photo backups, and releases with automatic rollback.