On-device · Gemma 4 · LiteRT-LM

A friend-on-the-phone car mechanic that fits in your pocket.

Plug a $15 OBD-II reader into your car. The app reads the fault codes, explains what's going on like a friend would, then walks you through fixing it. Entirely on your phone, in airplane mode, for free.

No cloud calls No subscription Airplane-mode ready
Why it matters

When a warning light comes on, three things stand between you and a good answer.

Those barriers stack hardest on the drivers with the fewest options: a teenager with a first used Corolla, a single parent an hour from the nearest dealer, a driver in a country where the median car is twenty years old. CAR·COPILOT is built for them.

01 · MONEY

$200 before any work is done.

A dealer diagnostic eats a meaningful piece of an hourly paycheck before the driver even knows what's wrong. The first answer should be free.

02 · INTERNET

The network drops where you need it.

Every consumer car-AI app today is a cloud API behind a subscription paywall. Tunnels, garages, rural roads, the parking lot at midnight — exactly where the answer matters most.

03 · LANGUAGE

"Lean bank 1 trim, suspect MAF."

When an answer does come back, it comes back in dialect. To someone who just wants to know if it's safe to drive home, that isn't an answer.

What it does

Five screens. One phone. No internet needed.

Each screen answers one question — is it safe to drive? what's wrong? how do I fix it? what should I tell my mechanic? has it happened before? — and the answer is written for you, on your phone, while you wait.

Powered by Gemma

Your car's status, in one tap.

The Home screen is the same shape every morning, color-coded so a single glance tells you what kind of day it's going to be. Green when everything's fine. Indigo when there's something worth looking at. Red when you shouldn't drive.

Healthy · all systems normal
CARCOPILOT
2009 TOYOTA COROLLA · 152K MI
Everything looks fineGEMMA
No new codes since your last drive. Your car checked out clean — drive normally.
TRIP READY
Good to go
RECENT CHECK-INS
All systems normal
Last full scan · 2 days ago. No active codes.
12 issues resolved this year
See full report →
Heads-up · drive carefully
CARCOPILOT
2009 TOYOTA COROLLA · 152K MI
Today's driveGEMMA
Cylinder one is misfiring — feel a stumble at idle. Check the spark plug and coil pack when you have an hour.
TRIP READY
Safe for short trips
ACTIVE ISSUE
Cylinder 1 misfire
A single cylinder is missing the ignition window.
$45 · 45 min · DIY-friendly
Show me what's going on →
Don't drive · pull over
CARCOPILOT
2009 TOYOTA COROLLA · 152K MI
Pull over nowGEMMA
Coolant is at 231°F and climbing. Stop driving and let it cool down. If you keep going, you'll warp the head gasket.
DO NOT DRIVE
Pull over and call a tow
ACTIVE ISSUE
Engine overheating
Coolant 231°F — past the safe range. Likely a stuck thermostat or low coolant.
Tow · $500–$1,400 · Shop only
Show me what to do →
The walkthrough · AI-generated

AI does the talking. The numbers stay honest.

When the diagnosis says you can do it yourself, Gemma writes a step-by-step plan for your car — phase by phase, in plain English. The torque values, plug gaps, and pressures stay pinned exactly as the procedure says them, because those numbers don't come from the AI.

ENGINE · 1.4 TSI · INLINE-4 PHASE 2 / 5
SCHEMATIC · INSTRUMENT VIEW SOURCE · PROCEDURE 2.1.1
Pinned from procedure · Never from the AI
PLUG TORQUE
22 N·m
PLUG GAP
0.7 mm
COIL BOLT
10 N·m
AI-Written · Gemma

Unclip the coil pack.

STEP 2 / 5 WALKTHROUGH
Mechanic draft · AI-written

Hand your mechanic the answer.

Tap one button and the app writes a message your mechanic can act on — the codes, the live readings, the plain-English summary. Paste it into a text. Most shops won't charge a diagnostic fee if you walk in with this.

‹ BACK
Drafted for youGEMMA
Tap to copy and paste it into a text. They'll know exactly what to look at before you arrive.
FROM CAR
COPILOT EDITABLE
2009 Toyota Corolla — 152k miles. CEL came on Tuesday. Got code P0301 (cylinder 1 misfire). Misfire count 17/200 over the last drive, fuel trim +18%. Can you check the coil and plug on cylinder 1?
Copy — open Messages →
Edit before sending
M
Mike's Auto Shop
Open
Tuesday · 9:42 AM
2009 Toyota Corolla — 152k miles. CEL came on Tuesday. Got code P0301 (cylinder 1 misfire). Misfire count 17/200 over the last drive, fuel trim +18%. Can you check the coil and plug on cylinder 1?
9:51 AM
Got it — looks like a coil pack. Bring it by, no diagnostic fee since you've already got the code. Free tomorrow at 10?
NO DIAGNOSTIC FEE · MOST SHOPS SKIP IT WHEN YOU WALK IN WITH THE CODE
How it works

The load-bearing engineering choice is what Gemma is not allowed to do.

OBDSnapshot RulesEngine Classification · RagStore PromptBuilder GemmaService · 5 surfaces JSON extractors UI · fail-soft
Deterministic side

Severity, route, cost, time. Every safety-relevant field.

A rules engine computes the answer from named live readings against DTC-specific thresholds. Gemma never sees these. The deterministic side is testable, auditable, and never wrong because of a tokenizer.

data/RulesEngine.kt
data/DTCTable.kt
data/RagStore.kt
Narrative side

Five Gemma 4 surfaces, each streaming JSON token by token.

Only then does Gemma narrate. Per-surface prompts, per-surface samplers, per-surface stateful extractors. Every surface has a canned-text fallback path. If LiteRT-LM throws, the user still sees text.

inference/GemmaService.kt
inference/PromptBuilder.kt
ui/<Surface>State.kt
LiteRT-LM, dialed in

What it took to make Gemma feel fast on a phone.

The big surprise: prefill, not decode, eats the clock. Every prompt token shaved is roughly as valuable as the entire speculative-decoding speed-up. Once BenchmarkInfo told us that, we rebuilt the prompt assembly around it.

+23 to 60% TPS

Capability-gated MTP

ExperimentalFlags.enableSpeculativeDecoding only flips on when Capabilities(modelPath).hasSpeculativeDecodingSupport() returns true. Safe for E2B fallback.

~21% prefill saved

Per-step phase splitting

PromptBuilder.splitProcedureIntoPhases ships intro plus one indexed phase per step instead of the full curated procedure. ~30s saved across a 6-step walkthrough.

~24% TTFT win

Prewarm and cancel

Parallel coroutine at process start pays the system-prompt prefill while the user reads the Home screen. Cancels at the first emitted token. Issue page feels instant.

SIGSEGV mitigated

Surface multiplexing under SDK constraint

LiteRT-LM 0.11.0 allows one Conversation per Engine. convoMutex plus a 250 ms NATIVE_SETTLE_MS floor between close and create.

Tokenizer drift caught

SpecsChipRow

Gemma 4 E4B inserts decimals into simple integer+unit patterns ("10mm" → "10.10mm"). Canonical values pin beside the streamed body. Drift becomes visible, not hidden.

100% fallback caught

JSON-aware tolerant parsing

WalkthroughPlanState.balanceJsonTail walks the buffer with string-aware brace tracking and closes unclosed structures at the tail. Pre-fix, this was silently firing 100% of the time.

By the numbers

How fast is it? Here, on a Pixel 9.

Measured live via BenchmarkInfo on the GPU backend with Gemma 4 E4B. The pattern is consistent across surfaces — and it's why prefill, not decode, is the thing we optimize.

Surface Decode TPS Prefill tokens TTFT
Synthesis
6.15 – 7.05
1,449 10.2s
Mechanic draft
8.08
~1,200 ~7s
Walkthrough plan
9.02 – 11.02
2,247 15.9s
Walkthrough step
6.84 – 10.22
~2,100 ~11.7s
179 JVM unit tests cover the streaming extractors, phase splitter, OBDSnapshot schema, classifier, and ELM327 protocol layer.

Yours, free, forever.

Built for the Gemma 4 Good Hackathon. Open source under Apache 2.0. One APK, one model file. After you install it, the app works anywhere, for anyone — even after the hackathon's long over.