REMI

REMI Screenshot
REMI is the operating system for a mobile oil change franchise, built professionally for REMI-OS inc and used daily by MAXI technicians and franchise owners in the field. It started as separate technician and customer apps and was consolidated into one Expo and React Native binary with technician and customer modes, backed by a separate Node, Express and PostgreSQL API. Over a three-month stretch I shipped more than 500 commits to the app, working directly from field reports and keeping a running development log of every change and decision. The source is private, so there are no public links for this one.

The technician side is where the app earns its keep. A dispatch Calendar with route, day, week and month views lets franchise owners drag jobs between technicians on a vendored, customized calendar library. Start Job walks a technician through an eleven-step flow: confirm the vehicle by VIN scan, license plate lookup through CARFAX QuickVIN or fleet ID search, pick the customer (including multi-vehicle household and fleet visits), select services and packages with negotiated per-job pricing, choose recommended fluids and filters from MOTOR OEM specs, ShowMeTheParts fitment and live van stock, run a vehicle inspection with tire tread on four- and six-wheel layouts, time the service, review the invoice, collect payment with Square Tap to Pay, and finalize. Orders is a searchable ledger with Created, Finalized, Billed, Waiting and Paid states, while Order Progress shows a day's open and finalized work side by side. A paginated Customers directory handles thousands of records with an A-Z jump bar and a background-warmed, persisted cache. Around that core sit operation-scoped inventory with purchase orders and count sheets, fleet management, end-of-day CARFAX service record files, an AI copilot with voice via the OpenAI Realtime API, a team feed, training modules and daily briefings.

From a technical perspective, the app is Expo 54 and React Native 0.81 in TypeScript with Expo Router file-based routing, TanStack Query for server state (with a persisted subset that survives restarts), Zustand for client state, React Hook Form with Zod schemas behind every form, Axios with JWT refresh interceptors, background GPS via expo-location and task manager, push notifications, WebSocket subscriptions for realtime updates, and Sentry monitoring. Shared workspace packages cover the API client, auth, permissions, tenant branding and UI. The hardest problem was vehicle scanning: after bake-offs across Dynamsoft, Scandit and Scanbot, VIN capture settled on expo-camera with cloud OCR and plates moved to server-side ALPR because on-device models misread embossed US plate fonts. Releases ship through EAS with over-the-air updates for JavaScript-only changes and a three-app dev, preview and production setup for field testing.