India's owned-fleet tour operators — intercity cabs, outstation packages, staff transport — run on WhatsApp threads, paper logbooks, and the owner's memory. Muvelo turns that into a real-time, AI-assisted control tower: a manager console, a voice-first driver app, and an agentic Claude co-pilot, all sharing one Next.js codebase and one Postgres schema. It's a working, deployed product — browsable end to end — not a mock-up.
The pain in a small Indian fleet isn't a lack of software — it's that existing software assumes literate, single-language, always-connected office staff and desk-bound drivers. None of that describes the actual day. Dispatch happens in WhatsApp threads with no structured record, no status, no proof a trip occurred. Drivers are multilingual and mobile-first, so any tool built around typing a form is dead on arrival at the roadside.
And the money is scattered — fuel, tolls, FASTag, service, salaries — across five places that never reconcile, so the owner has no single number to trust and no live view of where the vehicles are or which trips are at risk. It's a real-time logistics operation being run from memory.
The thesis: the operating system for a small fleet should behave like a competent dispatcher who never sleeps — it should listen (voice, screenshots, messages), understand (LLM extraction), and act(structured records, notifications, live tracking) across the exact literacy and connectivity constraints that make the incumbent tools unusable in the field. So the product is voice-first for drivers, AI-first for managers, with proof built into the flow and one unified number to trust.
The discipline that shaped everything: AI is a first-class operator here, not a chat feature bolted on — separate agents parse dispatch messages, extract structured forms from driver voice in any Indian language, and read rideshare-earnings screenshots with vision. And every AI-authored surface carries one glyph — ✦ — so an operator always knows what was inferred versus entered. The machine is always visibly the machine.
Muvelo is three product surfaces — a manager control tower, a voice-first driver app, and a staff platform console — but one codebase and one Postgres schema. The two shown here are built for opposite people. The manager works at a desk on a dense, information-rich console with a ⌘K command palette and an always-available AI co-pilot. The driver works one-handed at the roadside, speaking instead of typing, seeing only what the manager assigned. Same schema, same deploy — two completely different devices, interaction models, and trust boundaries.
And it's genuinely one codebase across three runtimes: the same React app renders in a browser, installs as a PWA, and runs inside a native Android shell via Capacitor. Because the shell loads the live site, a web deploy reaches installed driver phones instantly — only genuinely native capabilities (background GPS, push) need an app rebuild.

The control tower. Desktop-dense — live KPIs, an attention queue, a ⌘K palette, and an always-on ✦ co-pilot — for an owner who'd otherwise be building the report by hand.

The roadside. Phone-framed, voice-first, one-handed — the manager assigns, the driver executes. Speak a refuel or breakdown in any language; the AI returns an editable structured form.
This is a working, deployed product, but it's an honest one: a fully seeded public demo and a secured multi-tenant production environment — not yet a commercially launched business with paying customers or traction. So the interesting part isn't a growth number; it's the judgment in the hard calls. Three worth naming:
Security — no superuser key in production. auth.uid() doesn't propagate reliably across chained database calls, which risks silent authorization failures. Rather than reach for the service-role key — an enormous attack surface — every elevated operation runs through membership-checking SECURITY DEFINER SQL functions. Correctness and least-privilege over the easy shortcut.
Mobile — GPS that survives backgrounding. A backgrounded Android phone logged nothing, which defeats a tracking app. The fix combined a foreground-service plugin, a legacy-bridge flag, and — the real culprit — sending the location ping over nativeHTTP, because Android throttles webview network calls in the background. Applied to exactly one call site, not globally, because the global flag breaks the app's photo uploads. Surgical over blanket — the difference between a fix and a new bug.
Cost — $0 mapping at any scale. Live tracking on Google-style per-load pricing turns a map into a variable cost that grows with usage. Muvelo runs an open renderer, open tiles, and open routing — so mapping is a fixed engineering cost, not a per-user bill — and AI runs on the Claude Haiku tier because the tasks are bounded extraction, not frontier reasoning. Margin is protected as the fleet count grows.
The interesting decisions here weren't features — they were the refusals: no superuser key, no per-load map bill, no blanket fix that breaks the next thing. Browse the whole product without an account at demo.muvelo.app.
AI here isn't a feature bolted onto the side. It's the operator — and it never pretends to be anything but the machine.