Inspiration
Every angler has a phone full of fish photos and no idea what half of them are. Field guides are dry, ID apps feel like homework, and the magic moment — landing something rare — evaporates into a camera roll. We wanted catching a fish to feel like pulling a rare card from a booster pack.
What it does
Reelio turns every real catch into a collectible trading card:
- Snap → ID. Photograph your catch and a two-stage AI vision pipeline identifies the species, using your GPS location to judge what's plausible there.
- The reveal. Your card drops face-down into dark water. Tap it: it shakes (harder for rarer fish), 3D-flips, and bursts with a rarity-colored glow — Epic and Legendary cards get particles, rotating gold light rays, a pulsing screen-edge aura, holographic foil that shifts as you tilt the phone, and an original chiptune jingle tiered by rarity.
- Server-computed rarity. Common → Legendary, scored deterministically from species rarity, how unusual the catch is at that location, and trophy size vs. species average. The server is the authority — you can't fake a Legendary.
- Catchdex. Every species you haven't caught is a silhouette waiting to be filled in. Completion bar, rarity filters, NEW ribbons on fresh catches.
- Trading-card details. Habitat, depth, diet, edibility, size ranges, fun facts, and flavor text on every card. Share cards straight from the app.
How we built it
- App: Expo / React Native + TypeScript, Reanimated for the pack-opening reveal (3D flip, particles, foil parallax via DeviceMotion), expo-audio for the jingles.
- Backend: Supabase — Postgres with row-level security, private photo storage, and Deno Edge Functions.
identify-fishdoes auth → atomic daily-limit reservation → photo download → Claude vision ID → species-cache enrichment → deterministic rarity → card mint. - AI: Anthropic Claude with forced tool-use, so every identification returns strict, schema-validated JSON. A species cache means each species is enriched by the LLM exactly once.
- Monetization: RevenueCat powers Reelio Pro — free anglers get 3 IDs per day (enforced server-side, race-proof), Pro unlocks unlimited identifications and full catch history. A RevenueCat webhook keeps entitlements in sync server-side, including subscription transfers.
- Audio: five original chiptune jingles synthesized from scratch — no borrowed game audio.
Challenges we ran into
- Anti-cheat for a collectible game: rarity and size estimates live in a JSON card blob that users must be able to edit (species-correction flow) — but only some fields. Postgres column grants can't scope JSON keys, so a trigger rejects client changes to server-authoritative fields.
- Race-proof free tier: parallel identify requests could blow past the daily limit. Fixed with an atomic count+insert under a per-user advisory lock, reserved before any LLM spend.
- Honest measurements: the model is instructed to estimate size/weight only when a visible scale reference (hand, lure, ruler) is in frame — otherwise null. No fabricated trophies.
Accomplishments we're proud of
The reveal moment. Shake anticipation scaled by rarity, tiered haptics, original audio, and a Legendary sequence that feels earned. Also: the entire security model survived an adversarial test suite (impersonation, forged rarity, self-granted Pro — all blocked).
What we learned
Ship the dopamine first. The identification tech is the utility, but the card flip is why people come back. And server authority isn't optional in a collecting game — the first thing anyone tries is minting a fake Legendary.
What's next for Reelio
Trading between anglers, leaderboards per lake, seasonal card frames, and a tournament mode where local anglers race to complete a regional dex.
Built With
- claude
- deno
- expo.io
- postgresql
- python
- react-native
- revenuecat
- supabase
- typescript