Magic: The Gathering support, camera-app redesign, and the v10 Pokemon model with Perfect Order cards.
- Magic: The Gathering scanning. 110,000+ MTG cards from Scryfall with instant pricing (TCGPlayer market, foil, and Cardmarket EUR)
- eBay sold price lookup for MTG cards with graded price extraction
- Pokemon/Magic toggle in the menu. Switch games and scan immediately
- Camera-app layout. Full-bleed camera with bottom sheet results, swipe to expand or dismiss
- Mode tabs at the top (Single, Binder, Trade) with color theming per mode
- Menu button opens a bottom sheet for navigation (history, profile, game toggle, sign out)
- Perfect Order (ME03) set. All 124 cards downloadable and scannable on day one
- Pokemon model v10 trained with ME03 cards and 11,392 eBay verified photos. 26,090 total cards
- Camera starts faster. getUserMedia runs in parallel with auth instead of waiting for it
- Loading spinner shown while camera initializes instead of a blank black screen
- Scan results auto-dismiss after confirming a card so you're back to scanning faster
- More and Log Sale buttons expand the results sheet so content is always visible
- Price variant strip handles MTG foil and Cardmarket EUR pricing
- Service worker v8. Network-first HTML so new deploys are picked up right away. Old cache purged on install
- Batch inference queue restored after model update
- Scryfall card images added to Content Security Policy
- Auth state changes properly update the new layout controls
Trade mode, next-gen recognition engine, binder spatial layout, and massive infrastructure overhaul.
- Trade mode. Scan cards to "Your" side and "Their" side, see running totals and a balance bar showing who's ahead
- Spatial binder layout. Cards appear at their actual positions on the page instead of a flat grid
- Late fusion scoring. Multiple recognition signals combined with smart routing instead of hard thresholds
- Three-tier routing: auto-accept strong scans, show candidates for ambiguous ones, abstain on bad input
- Fusion feature logging for continuous improvement from user confirmations
- Next-gen recognition engine. Completely rebuilt visual matching trained on real-world card photos. 85% auto-identify rate
- OCR reads card name from a dedicated name strip, preventing artwork text from leaking into results
- Smart confidence scoring: embedding neighborhood reliability, capacity-normalized purity, margin-based routing
- Confirmations now incrementally update the recognition index without full reloads
- Batched inference queue for concurrent scans
- Vector search index for sub-millisecond card matching
- In-memory card database (22,754 cards, zero database queries during scans)
- Scan result caching for instant repeat scans
- Server starts in 2 seconds instead of 2 minutes
- Metrics endpoint for monitoring scan performance
Card intelligence tags. Every scan now shows artist, type, year, and collector-relevant callouts.
- Card tag system with 5 tag types: cameo, error, promo, notable, artist
- 19,060 cards tagged with illustrator names from PTCG-database
- 251 cards tagged with cameo/shared artwork data from PokeTCG/research
- 171 cards tagged with known error variants from Bulbapedia ("Check for" tips)
- Card metadata: type, stage, release year, and regulation mark on every scan
- 3,252 promo reference sheets banked (EN + JP distribution sources)
- Embedding model v6: trained with 3,260 verified eBay real-world photos
- OCR fix: embedding now wins over bad OCR when similarity >0.80
- TCGCSV loads in background. Server starts in 2 seconds instead of 132
- All API calls have fetch timeouts (10-30s by endpoint)
- Paddle checkout shows visible error when blocked or unconfigured
- Authentication added to price-lookup, ebay-listings, sale, confirm, and not-listed endpoints
- AI service bound to localhost only (no longer accessible from network)
- Scan limit bypass fixed (canScan defaults to false when profile not loaded)
- Secrets removed from committed documentation
Parallel recognition pipeline. 100% backtest accuracy across 191 test images.
- Parallel hash + embedding + OCR with confidence-based merging
- eBay Browse API integration for active listing prices
- Local card database (22,754 cards, no external API calls)
- LRU cache for repeat scans
- Client-side error reporting to backend
- Health monitoring (5-min cron)
- Daily Postgres backup
- Scan speed: 400-700ms (down from 1.5-2.8s)
- Embedding model v5: 25,966 cards with 23K eBay training photos
- OCR fallback scans all text for known card names (fixed Muk/Marill bugs)
- Service worker v4: only caches own-origin requests
New pricing, email routing, market analysis.
- Pro pricing updated to $7.99/mo (from $18.99)
- Supporter tier at $18.99/mo for those who want to fund development
- Email routing via Cloudflare
Japanese card support, redesigned result screen, new app icon, and model improvements.
- Japanese card recognition. 3,297 JP card images in the AI model. Scans JP cards, detects the language, matches to correct card
- Clean result screen. Price-first layout, no scrolling needed. Log Sale and secondary actions moved to bottom action bar
- More menu for secondary actions (eBay, JP pricing, TCGPlayer, wrong card, report)
- App icon (scan reticle logo) replaces text header. PWA home screen icons
- Condition grading (NM/LP/HP/DMG) with automatic price adjustment
- Embedding model v4: 25,966 cards (EN+JP), trained on GPU
- Hash DB v2: 22,669 cards for perceptual matching
- 894 missing card images added from TCGPlayer (Shining Legends, Dragon Majesty, promos)
- eBay search shows animated "Searching..." state with spinner
- Report button clearly labeled in red: "Report Issue (Wrong Card / Bad Price)"
- More menu items styled as cards matching app design
- Camera not opening on iOS PWA (removed min resolution constraints)
- Header layout breaking after logo change (missing wrapper div)
- Hash learning not saving (database NOT NULL constraint on old column)
Big UX overhaul. Sessions, conditions, cleaner result screen, and a bottom action bar that changes based on what you're doing.
- Condition grading (NM/LP/HP/DMG) with automatic price adjustment
- Session-based history. Name your sessions ("Ala Moana Show", "Mike's Binder")
- CSV export per session. Dump your whole show into a spreadsheet
- Manual card search. Type the name if the camera can't find it
- Contextual bottom action bar. Buttons change based on the active screen
- Persistent nav bar with active state highlighting
- Scan transition animation (freeze, zoom, reveal)
- App icon and PWA home screen support
- Result screen is now one-page, no scrolling. Price is always the dominant element
- Binder scan now runs OCR on each card to validate matches
- Binder cards now show TCGPlayer market prices
- Tapping a binder card confirms it and saves to history
- "Wrong card?" and secondary actions moved to a "More" menu
- eBay search shows animated "Searching..." state
- Report button now says "Report Issue (Wrong Card / Bad Price)" in red
- Retrained embedding model on GPU with fresh weights
- 894 new card images added from TCGPlayer (Shining Legends, Dragon Majesty, promos, and more)
- Loading screen no longer gets stuck (30s safety timeout)
- Fixed AI service pointing to wrong server (all improvements were being bypassed)
- Fixed hash learning not saving (database schema mismatch)
- Camera now works on iOS PWA standalone mode
- Fixed header layout breaking when logo was changed to icon
First production release. Card scanning, pricing, payments, and the full vendor workflow.
- AI card recognition with 21,775 cards across every Pokemon TCG set
- TCGPlayer market prices on every scan (via TCGCSV, 27K+ cards)
- eBay sold price verification (raw, PSA 9, PSA 10)
- Japanese card pricing
- Binder mode. Snap a page, get up to 9 cards priced
- Sales logging with daily stats and revenue tracking
- Scan history synced to cloud (Supabase)
- Gamification. 10 levels, 14 achievements, scan streaks
- Pro subscription via Paddle ($7.99/mo or $59.99/yr)
- Email + Google OAuth sign in
- Server-side scan limit enforcement (20/day free tier)
- XSS escaping on all user-facing data
- Content Security Policy headers
- CORS restricted to vendbro.com
- Supabase RLS prevents tier self-promotion
- Paddle webhook HMAC verification (fail-closed)
- SSH hardened, Postgres locked to localhost