Maica مایکا
A Persian PWA that tells drivers when their car’s periodic services are due, based on mileage.
- Role
- Co-founder, full-stack
- Type
- Own product (co-founded)
- Period
- 2025 – 2026
- Link
- maica.ir

The problem
Most drivers track oil changes, tyres, insurance and inspections on paper, or not at all. Services are due by mileage, not by date, so calendar reminders don’t fit well.
We wanted a small app where you enter your mileage now and then, and it tells you what is coming up.
My role
Co-founder and full-stack developer in a four-person team: a product designer co-founder, a UI/UX designer, another frontend developer and me.
I built most of the backend: the data model, API routes and authentication. I shared the work on the in-app screens, and my teammate built most of the animated landing page. I wrote about 89 of the 143 commits in the repository.
Stack
What I built
- Mileage-driven reminders. When a user updates the car’s mileage, recurring services are recalculated. A service shows up when it is overdue or within 5,000 km of being due, with a rough estimate in days based on the user’s average km/day.
- Multiple cars per user, custom services (recurring or one-off) and an editable service history. Marking a service “done” moves it to the next interval.
- Phone + password sign-up with OTP verification, a password-reset flow, and route protection in middleware.
- REST route handlers for auth, cars, mileage and services, plus an upcoming-count endpoint for badges.
- An RTL, installable PWA with an add-to-home-screen guide, and OpenGraph/Twitter metadata for sharing.
Result
- Live at maica.ir and installable as a PWA.
- Product notes and agent instructions are kept in
specs/, which made it easier to hand work between teammates and AI coding tools.
Screenshots

What I learned
Turning “due by mileage” into a clear UI took more iterations than the backend did. Small things, such as hiding the “done” button until a service is actually due, made the app much less confusing.
