Spotdex
Point your phone at a number plate and collect the car behind it in your own car dex.
Spotdex is a car-spotting game. The camera reads Dutch number plates continuously, looks every car up in the national vehicle register and adds it to your collection with a rarity, XP and coins. It runs as an installable PWA, wrapped in native Android and iOS shells with Capacitor.
The problem
It started as a plain plate scanner: point the camera, see which car it is. Reading plates reliably in a browser was the hard part, because classic OCR struggles with real street footage, so Tesseract ended up as the fallback rather than the engine. Once recognition worked, a list of scanned cars wasn't much fun, so it grew into a collecting game: a Pokédex for cars.
The approach
Recognition runs fully on the phone: a small YOLO plate detector and a plate OCR model run in the browser with onnxruntime-web (WebGPU, falling back to WASM). Each read is checked against the 14 Dutch plate layouts and has to win a confidence-weighted vote across frames before it counts. A Cloudflare Worker merges two datasets from the RDW open data API and caches the lookup in Supabase. Rarity comes from how many of that model and year are registered in the Netherlands, taken from a catalogue I built of more than 8,000 models. The server only stores an append-only log of scans; the client replays that log to rebuild XP, medals, challenges and the dex, so every device ends up with the same collection.
Highlights
- checkPlate detection and OCR run on the phone with ONNX models, no server round-trip
- checkReadings are checked against the Dutch plate layouts and voted on across frames
- checkRarity tiers come from real registration counts per model and year
- checkBrand medals, daily and weekly challenges, a level system, coins and a leaderboard
- checkOne codebase: PWA plus Capacitor shells for Android and iOS that update on every deploy
- checkAnti-cheat: a speed check on scan locations and diminishing rewards for rare streaks