All projects
02 / 06 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
Live on the App Store
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.

Side by side: a raw Facebook Marketplace listing for a 2017 Lexus GX 460 — $24,500, 155k miles, posted by a private seller and flagged with 4 red flags — next to the VINly report that reads it. The report returns an INSPECT verdict, a $20,825 opening offer marked −$3,675 versus asking, a WALK $20.3k to ASK $24.6k range, a 'Worth seeing, inspect hard' note about timing-cover and valley-plate leaks on the 1UR-FE engine, tiles for 4 known issues, $6.8–14k year-one cost, and 0 open recalls, and an index of what the full report contains.
The whole product in one frame: a wall-of-optimism listing on the left, the buyer's report it becomes on the right. Same car, generated in about a hundred seconds — verdict, opening offer, the distance to walk, and a receipt under every claim.
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.

06 The full spectrum

Three listings. Three verdicts. The same $3.99.

VINly isn't a funnel that always says buy. A clean Civic gets a green light, a high-mileage GX gets an inspect-hard, and a salvage-title Mustang gets walked — and the price is identical, because the verdict a buyer needs isn't for sale.

VINly's full-spectrum view: three side-by-side verdict cards at the same $3.99. WORTH SEEING in green — a 2014 Honda Civic LX in Oakland, $8,400, about $500 under asking, a clean 78k-mile car priced near the comp median. INSPECT in orange — a 2017 Lexus GX 460 Premium in Anaheim, $20,825, high-mileage with timing-cover and valley-plate work due-or-done. WALK AWAY in red — a 2018 Ford Mustang GT in Sacramento asking $14,000, salvage title, cash-only, no test drives, skip the drive.
Three real listings, three different answers. The verdict most reports land on is inspect, not buy — and some are a flat walk. A tool that always says buy is one you can't trust the one time it matters.
07 The surface

And the site that frames it.

The marketing site, the copy, the pricing, the live sample report — same hand, same week. "Read the listing like a mechanic" is the whole pitch in five words, shipping the same buyer-report card the app returns.

The VINly marketing site: a bold headline 'Read the listing like a mechanic.' over a subhead about turning a Marketplace screenshot into a buyer's report in ninety seconds for four dollars, an App Store download button and a 'See a sample report' link, and a live sample buyer-report card for a 2017 Lexus GX 460 Premium in Anaheim showing an INSPECT verdict, a $20,825 opening offer, a WALK-to-ASKING range, and a $6.8k–14.5k year-one cost.
Landing page, copy, pricing, and the sample report — also one person's work. The same listing-to-verdict logic that runs the app frames the pitch on the web.