Hello fellow project goers. I finally got back into collecting pokemon cards after a long hiatus. The market has completely changed, and live betting sites like eBay live, tiktok shop, and most importantly Whatnot have taken over. I was excited to have new ways of getting cards, but I soon learned how hard it is to accurately price them. I'd see cards that were really half the price being sold on whatnot for double and sometimes even quadruple. I figured if there was a fast way to query the real price of a card right on my screen, I could actually get good deals. With AI, I thought it would be pretty straightforward to make a live scanner. It needs to be fast, it needs to be complete, and it needs to be accurate. I soon found out that pricing and card accuracy is really, really hard. Prices differ whether you're looking at eBay or TCGPlayer, whether the card is in another language, graded, or what condition it's in. So I realized the best approach was to combine multiple price sources and just show them directly to the user. Then came the actual model. I didn't want to spend a fortune running this. There are tens of thousands of cards across 25+ years, and new sets release constantly, so the app needed a way to update itself. But having a server scraping cards and running inference 24/7 costs money. And even worse, a server means network latency. When whatnot bids are usually only 5 seconds, every millisecond matters. If a network call takes 2 seconds, the auction is already over. So I opted to run everything locally on device. What's free? A github action combined with local processing. I set up a github action to query every english pokemon card in existence and build a vector database of visual card embeddings on a schedule. The phone just pulls that down and queries it locally. Sub-second lookups, zero server costs. The scanning pipeline itself is a combination of models. One detects the card on screen, one identifies it, and only then do we price it. Scan -> Find -> Identify -> Price. Making this work on live streams was brutal. When a streamer shakes the card around or covers the card name with their thumb, confidence drops to 40%-60%. At first I tried using standard OCR to just read the text, but that fell apart fast. Foil glare completely blinds OCR, illustration rares have crazy stylized fonts, and the moment you try non English cards like Japanese it gets even worse. So instead of relying on OCR to read the text, the vector DB compares the actual visual layout and card art. That was way more accurate. I only use OCR as a backup to check set numbers when pokemon reprints the exact same card art in multiple sets. Even with that, some cards (shadowless vs base, 1st edition, stamped promos) look almost identical. So since Android lets you draw over the screen, I set up the overlay to show multiple high confidence options if the model isn't 100% sure. That way you can just tap the right variant and compare prices without the app guessing wrong. If all else fails, I also added a fast local search so you can just type it in. Combine that with UI themed around actual pokemon types, being able to pin favorites, and having a history of what you scanned, and it turned into a pretty solid app. After dealing with Google Play's 14-day 20-tester requirement and getting rejected twice (once for not having enough tester engagement, and once because their automated bot claimed the app didn't open), it's finally live on Google Play: https://play.google.com/store/apps/details?id=com.ra.cardhawk It's completely free, no ads or anything. If you collect cards or watch stream breaks, try it out and let me know how you like it. Thanks for reading, best.   submitted by   /u/Shwigly [link]   [comments]