Inspiration

Every car owner has had the same conversation. A light comes on, you take the car in, and someone tells you it needs $1,400 of work. You have no way to know whether that's true. The information gap isn't technical — the car has been broadcasting exactly what's wrong through a standardized port under the dashboard since 1996. You just can't read it, and the people who can are the same people quoting you the price.

We wanted to close that gap without pretending to replace a mechanic. Not "here's your fault code, good luck" — an actual explanation, for your car, in language you can take to a shop and use.

The test rig was a 2015 Nissan GT-R with a famously uncooperative ECU that serves stale sensor data when the engine is off. The rule was simple: if it works on that, it works on anything. Nothing in the app is hardcoded to a make or model.

What it does

Kaiju Mechanic is an AI mechanic that knows your specific vehicle.

  • Ask it anything. The chat is grounded in your make, model, year, mileage, modifications, and full service history. "Rough idle when cold" gets an answer about your engine, not a forum summary.
  • Read the check engine light. Pair a Bluetooth LE ELM327 adapter and pull the real trouble codes, or type in a code you already have. You get what it means for your vehicle, how urgent it is, and what the repair usually involves.
  • Watch the engine live. RPM, coolant temp, throttle position, O2 sensors, battery voltage — real-time over OBD-II, with tiles built per vehicle rather than from a fixed list.
  • Scan your paperwork. Photograph a repair invoice; Claude Vision reads it and files a service record with the date, mileage, and work performed.
  • Track maintenance that's actually due. Dual-trigger scheduling on time and mileage, OEM schedules, AI insights, cost forecasting.
  • Tune and flash history. We fingerprint your ECU's firmware on the first scan (Mode $09) and flag any later change — an aftermarket tune, a dealer reflash, a TSB update. Useful when you're buying a used car.

The free tier is a real product, not a demo: one vehicle, 15 AI credits a month, unlimited service records, 500 MB of synced storage, and full OBD-II code reading. Premium is $8.99/mo or $79.99/yr for 300 credits, unlimited vehicles, 5 GB, and the forensic tools.

How we built it

Client. React Native 0.86.3 (CLI, not Expo) with TypeScript, on the New Architecture with Hermes. React Navigation, Reanimated, react-native-paper. Bluetooth LE on iPhone; BLE, Bluetooth Classic and Wi-Fi on Android, behind one transport seam so the ELM327 protocol layer doesn't know which wire it's on.

Backend. Firebase — Auth, Firestore, Storage, Remote Config, App Check — with over 100 Cloud Functions on Node 22. A Cloudflare Worker handles the keyless edge endpoints (weather, geocoding, VIN decode, Sentry relay) and strips every client-identifying header before it forwards, including the ones Cloudflare re-injects on its own.

AI. Every Anthropic call goes through a server-side gateway. The API key is a managed secret; it has never been in a client bundle. Three model tiers, resolved at runtime from Firestore rather than hardcoded, with forced tool-use for anything structured (DTC analysis, document classification, maintenance plans) and two-block prompt caching for the static system prompt.

Monetization — the part we spent the most thought on. RevenueCat (react-native-purchases) fronts two subscriptions, six credit packs and two storage add-ons, with the webhook driving entitlement into Firestore.

Credits are arcade tokens, deliberately. A given operation costs a fixed number of credits — chat 1, advanced chat 3, DTC analysis 3, document scan 5 — and that number does not change for a balance you already bought.

That promise has to survive rising model costs, so the margin lever points forward only. A scheduled job discovers new Claude models, soaks each one for at least seven days across two consecutive runs, and gates adoption on margin. A more expensive model blocks and alerts an operator — it never silently erodes margin, and it never reprices credits already sold. The only thing that can move is the price of new packs.

The 20% member discount was the fun constraint: app stores can't discount a consumable per user. So it's two RevenueCat offerings over two SKU sets — credits_list ($2.49 / $4.99 / $14.99) and credits_premium ($1.99 / $3.99 / $11.99). The client picks by the active premium entitlement and the server re-checks audience by SKU, so a free account can't reach a member price.

Three CI tests keep the pricing honest rather than the README:

  • pricingInvariants.test.ts pins that every list pack's cost-per-credit stays strictly above the monthly subscription's — subscribing is always the better per-credit deal. The large pack clears it by 0.04%.
  • creditCostParity.test.ts pins the displayed cost to the charged cost by comparing the client constant to the server constant. Displayed equals charged, or the build fails.
  • aiCtaGradientAudit.test.ts pins that every AI action renders its price at the point of action.

Premium primarily sells capacity vs feature unlocks. Free users get document OCR and AI diagnostics too — Premium buys 300 credits instead of 15, unlimited vehicles, and 5 GB.

Verification. 934 test files (713 client, 221 backend), Maestro E2E flows, a security-rules suite against the emulators, and AI evals.

Challenges we ran into

iPhone cannot speak Bluetooth Classic. Classic SPP needs MFi certification we don't have, and most cheap ELM327 clones are Classic-only. We shipped BLE-only, declared UISupportedExternalAccessoryProtocols as an empty array — honest, and it also pre-empted a launch crash where the Classic library force-unwraps that key — and wrote the constraint into the store listing so nobody buys the wrong adapter. Saying "this doesn't work here" in your own App Store description is uncomfortable and correct.

Every iOS binary nearly shipped development keys. This app uses react-native-dotenv, a Babel plugin, so environment values are inlined at bundle time rather than read at runtime. Without an explicit env selection in the Xcode bundle phase, every build — archives included — would have carried dev Firebase, RevenueCat and Sentry credentials.

Two valid TestFlight builds nobody could install. Both processed to VALID, every signal after upload came back green, and there were zero beta groups and zero testers. "The build is in TestFlight" and "the build can be installed" are different claims, and only the first one produces a visible result.

Apple's Guideline 2.1 rejection. Seven questions covering purpose, setup, external services, regional differences, regulated content, in-app purchases and user-generated content. We answered from the code rather than from memory — which gate each feature is actually behind, whether every screen we named is even reachable for a reviewer with no vehicle added, the real external-service list, all ten IAPs — and paired it with a 14-minute recording from a fresh TestFlight install on a physical iPhone with a real adapter on a real car.

The bug that survived four reviews. A subcollection copy never advanced its paging cursor, so any account with 400+ documents in one collection spun until timeout. Every existing test passed, because every fixture held a handful of documents. Passing tests are evidence about the fixtures.

Accomplishments that we're proud of

A free tier that isn't a trailer. Document scanning, DTC analysis and AI chat are all available for free. We charge for volume, not for access.

Displayed price equals charged price, enforced by CI. Every AI action shows its cost on the button that spends it, and is disabled with a top-up path when the balance is short. No silent failures, no surprise drain.

Any car built since 1996. No hardcoded vehicle logic anywhere. Unknown PIDs get analyzed and parsed dynamically, and the results are cached back to the community.

We asked what breaks when a stranger installs this. Before launch we ran the whole conversion path as an outsider and found that signing up from an anonymous session could delete a garage, that a subscriber couldn't delete their own account, and that a permanently-failed purchase webhook was being acknowledged and thrown away. All fixed before anyone had to hit them.

What we learned

Uploading and distributing are different verbs. So are submitted and live, approved and available, tested and verified. Almost every delay we hit came from reading a true signal as an answer to a question it wasn't about.

Passing tests are evidence about your fixtures. The paging bug is the whole lesson in one line.

Store copy is a claim about the product, and the product keeps moving. We audited our own marketing emails and found onboarding instructions that told new users to open a screen that is unreachable until they add a vehicle — correct instructions, impossible to follow, for the exact audience they were addressed to.

App review is a design review of your honesty. Every Guideline 2.1 question was answerable in one line if the code and the copy agreed, and painful if they didn't.

What's next for Kaiju Mechanic

  • Wi-Fi and Bluetooth Classic adapters on iPhone. iOS shipped BLE-only because Classic SPP needs MFi certification. Most cheap ELM327 clones are Classic, so this is the single biggest compatibility gap between the two platforms.
  • Garage merge — combining duplicate vehicles without losing a service record.
  • Kaiju Copilot — monitored drives that learn your car's normal and flag a sensor drifting before the light comes on.

Built With

Share this project:

Updates

Submission history