Next.js 16 · Supabase · Claude · Capacitor

Muvelo.
The AI dispatcher that runs a fleet.

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.

$0
marginal mapping cost, at any fleet size
01 — THE PROBLEM

The fleet runs on WhatsApp
and the owner's memory.

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.

WhatsApp
where dispatch lives today: no record, no status, no proof
4 languages
how drivers actually speak; none of them is "type a form"
5 spreadsheets
where the real P&L is hiding
02 — THE APPROACH

Build the dispatcher
that never sleeps.

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.

01
Listen
driver voice, WhatsApp-style dispatch lines, and rideshare screenshots come in
02
Understand
Claude extracts structured entities, in any of four languages
03
Act
structured records, live GPS tracking, notifications, OTP-gated trips
04
Trust
every inferred field marked ✦; every trip gated by customer OTP + odometer photos
03 — TWO SURFACES, ONE SCHEMA

Same data model.
Opposite humans.

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.

Manager console
Muvelo manager control-tower console on desktop — KPIs, attention queue, and AI co-pilot

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.

Driver app
Muvelo voice-first driver app on a phone

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.

One codebase → three runtimes — browser, installable PWA, native Android. Web deploys reach installed phones instantly.
One Postgres schema, tenant-isolated by row-level security — every business row is org-scoped; no query crosses tenants.
No superuser key in production — elevated access exists only as narrow, membership-checking SQL functions, not a service-role key sitting in env.
Every trip gated by a customer OTP + odometer photos — a tamper-evident record the owner can bill and pay from.
Every AI-authored surface marked ✦ — inferred is always visibly distinct from entered.
04 — WHAT IT DOES

Four AI jobs,
one honest glyph.

🗣
Turns driver speech into records
Refuel, breakdown, accident, or toll — spoken in English, Hindi, Odia, or Spanish. The LLM returns an editable structured form, so there's no typing at the roadside.
🧭
Answers the owner instead of making them report
A Claude co-pilot answers fleet questions against live data — and replies in Hindi when asked — so the manager asks instead of building a dashboard.
📷
Reads a screenshot or a dispatch message
Vision pulls fare, platform fee, and net payout from an Ola/Uber/Rapido earnings screenshot; entity extraction turns a free-text WhatsApp dispatch line into a structured trip.
👤
Proves the trip actually happened
Customer OTP plus odometer photos gate every start and finish, and each transition is an audited operation. The record is tamper-evident — and every inferred field wears the ✦.
05 — THE HARD PART

Where the engineering
actually lives.

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.

3 surfaces
1 codebase · 1 schema
21
versioned Postgres migrations in production
$0
mapping · Haiku-tier AI, engineered down

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.

STACK
Next.js 16React 19TypeScriptSupabase (Postgres · RLS · Realtime · Auth · Storage)Claude Haiku 4.5MapLibre + OpenFreeMapOSRM + PhotonCapacitor (Android)TwilioFCMVercel
AI here isn't a feature bolted onto the side. It's the operator — and it never pretends to be anything but the machine.