Home/Projects/Grailo
PrivateMachine Learning / Mobile•2026
Grailo app icon

Grailo

Pokémon card scanner priced from real sold listings

Grailo

Role

Architect & ML Engineer

Year

2026

Status

Private

Overview

Grailo points a phone camera at a card and returns the exact card, its grade, and the median of its real sold listings. Identification runs on the server as a cost ordered ladder: a YOLO11 classifier exported to ONNX decides whether the photo is a graded slab, OCR reads the card text and the printed set code, a parser turns that into structured fields, and a fuzzy match against a Postgres catalog finds the card. Only when that match is not confident does a vision LLM get involved, and even then it can only choose between the top five catalog candidates or answer none. Prices are never generated by a model. They come from sold listings that a title parser has filtered for lots, reprints and damaged copies, and graded and raw copies are priced as separate objects. The Expo app adds batch scanning, a collection with offline value tracking, price alerts, a trade analyzer and market movers, with Pro billed through RevenueCat.

Highlights

  • Slab classifier reaches 96.7% accuracy on an independent 10,077 image PSA dataset it never trained on

  • At the shipped 0.80 threshold it catches 94.6% of slabs and wrongly flags only 0.9% of raw cards

  • Graded cards wrongly priced as raw fell from 3 to 9% to 0.5% end to end

  • Models run as ONNX on CPU, about 4ms per image, with no GPU or training dependencies in the service

  • Measured a 153 class set classifier at 28% top 1, traced it to a crop removing the set symbol, and replaced it with deterministic OCR of the printed set code

Capabilities

01

Slab Detection Model

A YOLO11n classifier decides whether a photo shows a graded slab, so a slab with an unreadable label is never priced from raw sales. Trained on 3,200 eBay photos labelled by the listing’s own condition field, with no hand annotation.

02

OCR Set Recognition

RapidOCR reads the set code, the collector number’s denominator and the copyright year printed on the card. The reader abstains when the evidence fits two sets rather than guessing one.

03

Cost Ordered Scan Pipeline

The cheap stages run on every scan: slab check, OCR, parsing and a fuzzy catalog match. The paid vision model runs only on low confidence scans, under a daily cap per user, with the fallback rate logged.

04

Constrained Vision Disambiguation

The vision LLM gets the crop and at most five catalog candidates. Its answer is an enum of those ids plus none, enforced by the response schema, so it cannot return a card that was not offered.

05

Sold Listing Parser

Listing titles are parsed into card, set, number and grade. Lots, reprints, sealed product and damaged copies are rejected and stored with a reason, so the reject rate stays measurable.

06

Auditable Prices

Every price is the median of observed sales for one card at one grade. The sales behind it are listed with their dates, and outliers are marked rather than hidden.

07

Collection & Market Tools

Batch scanning, an offline collection with cost basis and CSV export, price alerts, market movers, set analytics and a trade analyzer.

Mobile app

A cross-platform companion app for iOS and Android.

Tech stack

PythonYOLO11ONNX RuntimeRapidOCRPyTorchFastAPIPostgreSQLExpoReact NativeTypeScriptSQLiteFirebaseRevenueCatDocker

Privacy & terms

How Grailo handles your data, and the terms for using it.

Privacy

This is a private project. Architecture, capabilities, and outcomes shown here are generalized. Client identity, domain specifics, infrastructure addresses, and operational data are intentionally omitted.

Have a similar idea? Let's talk.