S

HomeAboutBlogs

What Shipping MotoCare Taught Me

MotoCare is workshop software for two-wheeler garages. I almost shipped it as a React Native app. Then I moved it to a Vite PWA — and learned that feature parity is not the same as fitting a counter with greasy hands.

Published on July 29, 2026

What Shipping MotoCare Taught Me

A Workshop OS, Not a Brochure

Most garage software wants to be an ERP with a motorcycle sticker. MotoCare was aimed smaller and harder: customers, service jobs, reminders, team members, and workshop-owned metadata under one tenant. Fast counter intake. Visible job status. Follow-up that actually happens. Light invoicing. No enterprise ceremony.

The design partner was a real shop — Sri Amar Bikes — with feedback arriving the way workshop truth arrives: WhatsApp from the floor, not a stakeholder deck. Staff use personal phones while standing beside a bike. Speed beats decoration. Large targets beat clever chrome.

That context decided more architecture than any framework pitch.

Leaving React Native at 90%

The Expo app was roughly ninety to ninety-five percent done. Auth, jobs, customers, reminders, settings — the surface was there. Then I moved off React Native to a client-only Vite + React SPA on Firebase.

That sounds irrational until you price store friction for workshop staff phones. A PWA installs without an App Store negotiation. Updates ship when Hosting deploys. One Firestore backend. One set of indexes and rules. The product needed to feel native on a phone — not earn a native binary tax.

Most of the web surface landed in a single intense June day: scaffold, modules, PWA, offline queue, PDF job cards, polish. Then silence. Then late July, when real workshop feedback deleted what the commit storm had assumed.

👉 Feature parity with a mobile app is not the same as workshop fit.

The Kanban Temptation

Builders love boards. Columns look like operations. A desktop sidebar looks like a serious product. For a week, MotoCare had both.

Then I deleted them.

Counter work wants status chips and a lifecycle timeline — Checked In through Ready for Pickup — not a SaaS project board. Desktop “enhancement” forked the interaction model. Bottom tabs at every width won. The garage does not care that you shipped a second shell.

Stacked cards got the same treatment. They photograph like a modern product. They fight thumbs that are already busy. Lists with borders and chevrons, forms in bottom sheets — boring on purpose.

👉 Stacked cards look like SaaS. A garage wants a list and a sheet.

The Customer Is Standing There

Workshop feedback rewrote the job create flow faster than any PRD revision. Vehicle number first. Autofill if the bike is known. Customizable complaint tree. Drop petrol level on create — a photo later is enough. Drop technician assignment at intake. Block customers instead of deleting them. Print a job card. Share invoice over WhatsApp when the bike is Ready or Delivered.

Every one of those changes sounds obvious after you hear it from the person holding the phone next to the customer. Before that, the product optimized for completeness. After that, it optimized for the next thirty seconds at the counter.

India workshop reality also settled messaging: tel: and wa.me deep links beat a Business API fantasy. The staff already live in WhatsApp. The software should meet them there.

Status Is Data

I hardcoded the “correct” job statuses into chips. Technician. Approval. Service ongoing. Then a workshop without those labels in its masters hit Not Found.

Statuses, complaint categories, reminder categories — they belong to the organisation. Hardcoding the workflow is how you ship a product that only works for the workshop in your head.

Tenancy bugs rhyme with the same lesson. Metadata that isn't workshop-scoped leaks. Members rosters that ignore auth membership lie. Category and status are different concepts; conflating them in filters creates ghost UI that looks configurable and isn't.

👉 Hardcoding the “correct” job statuses is how you ship Not Found.

reCAPTCHA Humility

Phone OTP is the front door. I tried to make login feel faster — perceived performance budgets, cleaner verifier lifecycle, a smarter path through reCAPTCHA.

Production answered with: client element removed. Already rendered. No login.

The fix was not another clever pass. It was a full revert to what had been working. Mid-ship optimization of the auth critical path is how you trade a working garage for a latency graph nobody asked for.

Same humility elsewhere: route-based screens instead of nested sheets that break Back. Draft job create that survives interruption. Offline mutation queue with honest sync toasts. Centralized copy in short workshop English — “Created job.” / “Reconnect to sync.”

👉 Faster login that touches reCAPTCHA is how you ship no login.

What I Keep

Shipping MotoCare web didn't give me a framework for every vertical SaaS. It gave me a short list for products used under pressure:

  • Leave a nearly finished stack if the distribution model is wrong for the people who must install it.
  • Delete boards, sidebars, and cards that impress builders and slow operators.
  • Let the shop floor rewrite intake. Vehicle-first beats form-complete.
  • Treat workflow status as tenant data, not app constants.
  • Do not “improve” auth mid-ship. Revert beats clever.

Tools made a full workshop app appear in a day. Only the shop floor deleted what didn't belong.

That is the real migration story — not React Native to Vite. From software that looked finished to software a mechanic will open while a customer is waiting.