All projects
02 / 05 Flagship Case study

VINly

A used-car listing in, a priced buyer's report out — verdict, opening offer, and walk-away floor. Designed and engineered solo for iOS.

Role
Sole designer, engineer & founder
Period
2026
Scope
iOS app, three-stage AI pipeline, Supabase backend, marketing site
Status
Submitted to the App Store · in review
Focus
  • AI buyer's report
  • Deterministic offer math
  • End-to-end solo build
Stack
  • Expo / React Native
  • TypeScript
  • Supabase Edge (Deno)
  • Anthropic Sonnet
  • DeepSeek
  • OpenAI vision
  • RevenueCat
  • Astro
02 Outcomes at a glance
  • $3.99 Price per report
  • ~100s Time to a full report
  • 3 AI models, one job each
  • One person Designed and built by
03

The premise

Every used-car listing is a wall of optimism. A price, a few photos, three sentences from a stranger who wants to sell. The buyer is left to turn that into a decision: is this fair, what’s going to break, what do I say to the seller, and when do I walk away.

Most people guess. They open three tabs, half-read a forum thread, and make an offer they can’t defend. The information needed to buy well exists — it’s just scattered across the listing, the model’s reputation, recall databases, and local cost-of-ownership math. Nobody assembles it in the ninety seconds before they message the seller.

What VINly does

Screenshot the listing and hand the photos to VINly. It reads them, identifies the exact vehicle, researches what’s known to fail on it, prices the car against its mileage, and returns a buyer’s report: a verdict, an opening offer, a walk-away floor, a year-one cost forecast, a model-specific inspection checklist, and a copyable message to send the seller.

About a hundred seconds. $3.99 a report, or a ten-report pass for the way people actually shop — three to eight listings over a couple of weeks. No subscription.

The report is the product, and every section answers a question the buyer was already going to ask. Should I see this in person. What’s likely to break. What will the first year cost. What do I open the conversation with.

The price is not the model’s opinion

The most important decision in the build is what the language model is not allowed to do. It never picks the number.

The opening offer, the walk-away floor, and the car’s real annual mileage are computed by plain deterministic functions before any model runs — computeSuggestedAnchor, computeWalkFloor, computeAnnualMiles, and a hard isObviousWalkAway guard for the listings that aren’t worth a full report. Those numbers are passed into the pipeline as fixed constraints. The model’s job is to explain the offer, not invent it.

The reasoning is simple: a model that hallucinates a price is worse than no app at all. Arithmetic that’s wrong is at least wrong the same way every time, which means it can be pinned down by tests. The money math carries 133 of them.

Two models, and one of them disagrees

Once the numbers are fixed, the report gets written and then checked.

A synthesis model — Anthropic’s Sonnet — drafts the report grounded in real sources: NHTSA recall and complaint data for the exact year and model, plus a handful of live web lookups for known failure modes and ownership costs. A second model, DeepSeek, reads the draft back as a critic and looks for claims the evidence doesn’t actually support. If it finds a contradiction, synthesis runs again with the objection in hand.

The report keeps a small receipt of what happened — whether it was retried, which model wrote it, how many sources it cited. On the example throughout this page, a 205,000-mile Lexus RX 350, that reads: generated in 100 seconds, Anthropic Sonnet, seven sources cited. Showing the work is the feature. A buyer trusts a number they can see the basis for.

What it refuses to claim

VINly is deliberately narrow, and saying so out loud is part of the design.

It is not a vehicle-history service. There’s no VIN report, no accident records, no odometer-fraud check — it reasons from the listing and public knowledge, not a title database. It is not a mechanic; it tells you exactly what to inspect and hands you a checklist for the shop, but it doesn’t pretend a phone can replace a lift. And it never logs into Facebook — the listing link is optional context, nothing more.

The verdict it gives most often is inspect, not buy. The whole product is built to make someone a sharper buyer, not to make a risky purchase feel safer than it is.

One person, end to end

The design, the iOS app, the three Supabase Edge Functions, the AI pipeline, the pricing, and the marketing site are one person’s work.

The security model is the part worth pointing at. The keys that cost money — OpenAI, Anthropic, DeepSeek — never ship inside the app bundle. They live as Edge Function secrets, and the phone holds only an anonymous Supabase key. An earlier version called the vision model directly from the device with a bundled key; moving optical character recognition server-side closed that hole and is the reason a screenshot can be read without trusting the client with anything it shouldn’t have.

The model explains the number. It never picks it.

Where the trust comes from
04 The report

From a screenshot to a verdict.

Up to a dozen listing screenshots in. About a hundred seconds later, a buyer's report the shopper reads top to bottom — verdict first, the reasoning under it, the evidence attached.

VINly upload screen: a modal reads 'Picking out year, make, model — looking for vehicle details across every photo,' over a grid of listing screenshots. An optional listing-link field notes 'We never log in to Facebook.'
You hand it screenshots, not a VIN. The first pass reads every photo to pull year, make, and model — ten to twenty seconds, and it never logs into Facebook. The listing link is optional context.
VINly buyer report for a 2010 Lexus RX 350: an INSPECT verdict, a $5,850 opening offer marked −$1,650 versus asking, and a WALK $5,400 to ASKING $7,500 range slider.
The answer comes first. INSPECT, an opening offer of $5,850, and the distance to a $7,500 asking price — with the walk-away floor pinned at $5,400 before a line of reasoning.
VINly report, scrolled: the $5,850 offer over YEAR 1 COST $4.2k–8.5k and ASKING $7,500 tiles, with Send message, Negotiate, and Inspect action buttons.
Every report resolves to a next move — message the seller, negotiate, or mark it to inspect. The cost and asking figures sit right under the offer so the gap is never abstract.
VINly report receipt: Identity normalized, Model knowledge with failure modes loaded, 7 sources cited, 'Generated in 100s · Anthropic Sonnet · NHTSA + web grounding,' above an index of listing details, red flags, service timeline, and known issues, each with a count.
A receipt sits at the top: identity normalized, failure modes loaded, seven sources cited, generated in 100 seconds on Anthropic Sonnet over NHTSA and the web. Below it, an index of everything flagged, each line with a count.
05 The takeaways

The work it hands you — and what it costs.

Three things a buyer can act on the same afternoon — a cost forecast, an inspection checklist for the shop, and a negotiation message — plus a price that matches how people actually shop for a car.

VINly Year 1 cost forecast: $4,200–$8,500 per year, split into fuel $2.6k, insurance $1.6k, maintenance $475, with line-item assumptions for a 205k-mile Lexus RX 350 in Long Beach.
Year-one cost, itemized. Fuel modeled from real annual mileage and local gas prices, insurance from the car's class and city, and a repair budget sized to a 205k-mile example — a range, never a falsely precise number.
VINly inspection checklist for a 2010 Lexus RX 350: scan for OBD-II codes P0010–P0020 and P0135/P0155, check valve cover gaskets, pressure-test the cooling system, listen for VVT-i rattle — printable for the shop.
The inspection list is specific to this engine, down to the OBD-II codes to scan for and the gaskets and actuators known to fail. It prints, so it goes to the shop with the buyer.
VINly negotiation script: a copyable message opening at $5,850 for a 205,000-mile 2010 RX 350, holding a $5,400 floor, citing overdue water pump, valve cover gaskets, and transmission service.
A copyable opening message, anchored to the same math: open at $5,850, hold at $5,400, walk below it. The computed offer, turned into words a buyer can actually send.
VINly pricing: a single report for $3.99 with free updates when the seller replies, or a $12.99 Shopping Pass of 10 reports over 30 days, no subscription. NHTSA recalls and complaints are free.
$3.99 for a report, or $12.99 for ten — sized for someone weighing several cars over a couple of weeks. No subscription, credits expire, and NHTSA recalls come free on every report.

The price reflects what a report costs to produce, not what a subscription funnel can extract. A used-car shopper is in the market for a few weeks, not forever — so the product is built to be picked up, used hard, and put back down.