I build Pooka, a Pokémon card collection app for iOS, Android and web. Until version 2.0, scanning a card meant uploading a photo: the server turned it into a CLIP embedding and ran a vector search over every card image. It worked, but every scan waited on the network and cost server time. For 2.0 the whole pipeline runs on the phone, in Flutter. This is what that took, including the parts that went wrong. The pipeline A corner detector finds every card in the camera frame...