📋 Table of Contents
What you actually need to build
Recommended stack
The MVP architecture
Step-by-step build plan
Cursor prompt pack
Database structure
Cat detection flow
Rarity and stats system
Screens you need
Common mistakes
Safety notes
Quick reference
1. What you actually need to build
You need five pieces:
A camera screen
A cat detection check
A collection database
A cat profile page
A simple rarity/stat generator
That is enough.
Wrong assumption: you need real AR.
You do not.
For the first version, fake the AR. Use the camera, take the photo, show an overlay, then save the cat. The user experience feels like AR without needing to build a full AR engine.
Wrong assumption: you need GPS maps.
You do not.
Add location later. First prove that people enjoy collecting cats.
Wrong assumption: the hard part is the app.
The hard part is the loop.
2. Recommended stack
Use this stack:
Frontend:
Expo + React Native
Camera:
expo-camera
AI image check:
OpenAI vision or Google Cloud Vision
Database:
Firebase Firestore
Storage:
Firebase Storage or Cloudinary
Auth:
Anonymous Firebase Auth for MVP
AI coding tool:
Cursor, Claude Code, Windsurf, or Replit Agent
Best path for most builders:
Expo + Firebase + OpenAI vision.
Why:
Fast mobile setup.
Works on iOS and Android.
Easy camera access.
Simple database.
Easy AI integration.
3. The MVP architecture
Here is the basic flow:
User opens camera
↓
User snaps photo
↓
Image is sent to backend
↓
AI checks if image contains a real cat
↓
If no cat, reject it
↓
If cat, generate profile
↓
Save cat to Firestore
↓
Show collection card
Keep AI calls off the client when possible.
Why:
You do not want your API key exposed in the app.
Use a backend route, Firebase Cloud Function, or a tiny server.
For the vibe-coded MVP, the simplest acceptable setup is:
Expo app
Firebase Auth
Firestore
Cloud Function called analyzeCatPhoto
4. Step-by-step build plan
Step 1: Create the app
Run:
npx create-expo-app@latest cat-go
cd cat-go
npx expo startAsk your AI coding tool:
Set up this Expo app as a mobile-first collectible camera game called Cat Go.
Use TypeScript.
Create these screens:
1. Home screen
2. Camera screen
3. Collection screen
4. Cat detail screen
Use a clean black UI with mint accent color #00F5C4.
Keep the design minimal, playful, and premium.
Do not add fake features.Step 2: Add camera capture
Install camera support:
npx expo install expo-cameraPrompt:
Add a Camera screen using expo-camera.
Requirements:
- Ask for camera permission.
- Show full-screen camera preview.
- Add a circular capture button at the bottom.
- After taking a photo, show a preview screen.
- Add two buttons: Retake and Catch Cat.
- Store the captured photo URI in local state.
- Do not upload anything yet.You now have the first half of the loop.
Step 3: Create the database shape
Use Firestore.
Create a cats collection.
Each cat document should look like this:
type Cat = {
id: string;
userId: string;
imageUrl: string;
name: string;
rarity: "Common" | "Uncommon" | "Rare" | "Epic" | "Legendary";
level: number;
stats: {
stealth: number;
fluff: number;
chaos: number;
speed: number;
charm: number;
};
detectedBreed?: string;
detectedColor?: string;
location?: {
latitude: number;
longitude: number;
};
createdAt: string;
};Prompt:
Set up Firebase in this Expo app.
Create:
- firebase.ts config file
- anonymous auth helper
- Firestore helper for saving cats
- Firestore helper for reading the current user's cat collection
Use modular Firebase imports.
Do not hardcode secrets directly in components.
Create a .env example file.Step 4: Add image upload
You need the photo online before the AI can analyze it cleanly.
Use Firebase Storage or Cloudinary.
For MVP speed, Cloudinary is easier.
For tighter Firebase integration, use Firebase Storage.
Prompt:
Add image upload support for captured cat photos.
After the user taps Catch Cat:
1. Upload the image
2. Return a public image URL
3. Pass that URL to an analyzeCatPhoto function
4. Show loading state while this runs
5. Show an error if upload failsDo not let the AI skip loading states. That is how vibe-coded apps feel broken.
Step 5: Add cat detection
You have two clean options.
Option A:
Use Google Cloud Vision label detection.
The check:
Does the image contain labels like cat, kitten, feline, mammal, pet?
Option B:
Use OpenAI vision.
The check:
Send the image and ask for strict JSON.
Recommended MVP prompt:
You are analyzing a user-submitted photo for a cat collecting app.
Return only valid JSON.
Check whether the image contains a real living cat.
Rules:
- A real cat counts.
- A kitten counts.
- A drawing, plush toy, cartoon, statue, logo, or screenshot does not count.
- If unsure, set isCat to false.
Return:
{
"isCat": boolean,
"confidence": number,
"reason": string,
"visualDescription": string,
"suggestedName": string,
"detectedColor": string,
"possibleBreed": string
}Backend function result:
type CatAnalysis = {
isCat: boolean;
confidence: number;
reason: string;
visualDescription: string;
suggestedName: string;
detectedColor: string;
possibleBreed: string;
};Prompt your coding tool:
Create a backend function called analyzeCatPhoto.
Input:
- imageUrl
Output:
- isCat
- confidence
- reason
- suggestedName
- detectedColor
- possibleBreed
The function should reject:
- no animal
- dogs
- cartoons
- plush toys
- screenshots
- drawings
- cat logos
Return strict JSON only.
Add error handling for invalid AI responses.Step 6: Generate rarity and stats
Do not make this random only.
Make it feel tied to the photo.
Simple logic:
Common:
Default rarity
Uncommon:
Confidence above 0.85 and interesting color
Rare:
Confidence above 0.9 plus unusual visual trait
Epic:
Very unusual breed, pose, or setting
Legendary:
Extremely rare, use sparingly
For MVP, use weighted randomness:
function rollRarity() {
const roll = Math.random();
if (roll < 0.70) return "Common";
if (roll < 0.90) return "Uncommon";
if (roll < 0.975) return "Rare";
if (roll < 0.995) return "Epic";
return "Legendary";
}Stats:
function generateStats() {
return {
stealth: randomStat(),
fluff: randomStat(),
chaos: randomStat(),
speed: randomStat(),
charm: randomStat(),
};
}
function randomStat() {
return Math.floor(Math.random() * 100) + 1;
}Better prompt:
Create a rarity and stats generator for cats.
Rules:
- Common should happen most often.
- Legendary should be very rare.
- Stats should be 1 to 100.
- Stats should feel funny but not childish.
- Use: stealth, fluff, chaos, speed, charm.
- Save rarity and stats with each cat.Step 7: Save the cat
When the image passes detection:
If analyzeCatPhoto returns isCat true:
- Generate rarity
- Generate level
- Generate stats
- Save the cat document to Firestore
- Navigate to the Cat Detail screen
If isCat false:
- Show message: "No real cat detected. Try another photo."
- Do not save the image as a catThis is the first working version.
Step 8: Build the collection screen
The collection screen should show:
Cat image
Name
Rarity
Level
Date found
Prompt:
Build the Collection screen.
Requirements:
- Fetch cats for the current user from Firestore
- Show them in a 2-column grid
- Each card shows image, name, rarity, and level
- Tapping a card opens Cat Detail screen
- Empty state says: "No cats caught yet. Go find one."
- Add button to open Camera screenStep 9: Build the cat profile page
Cat profile page:
Large photo
Name
Rarity badge
Level
Stats
Detected color
Possible breed
Date caught
Prompt:
Build the Cat Detail screen.
Make it feel like a collectible creature profile.
Include:
- Large cat image
- Name
- Rarity badge
- Level
- Stat bars for stealth, fluff, chaos, speed, charm
- Possible breed
- Detected color
- Date caught
Use black background, white text, and mint accent #00F5C4.Step 10: Add the fake game feel
This is where the app starts feeling sticky.
Add:
Capture animation
Rarity reveal
Collection count
Share card
Streaks later
Prompt:
After a cat is successfully caught, add a reveal screen.
Sequence:
1. Show "Analyzing..."
2. Show "Cat detected"
3. Show the generated cat card
4. Reveal rarity with a short animation
5. Add button: Add to CollectionDo not add battles yet.
Do not add maps yet.
Do not add trading yet.
Those are traps.
5. Cursor prompt pack
Use these in order.
Prompt 1: Product spec
We are building Cat Go, a mobile app where users photograph real cats they meet outside and collect them as creature cards.
Core loop:
- Open camera
- Snap photo
- AI checks if it is a real cat
- If valid, generate name, rarity, level, and stats
- Save to collection
- Show profile page
Tech:
- Expo React Native
- TypeScript
- Firebase Auth
- Firestore
- Firebase Storage or Cloudinary
- Backend function for AI image analysis
Design:
- Black background
- Mint accent #00F5C4
- Minimal, premium, playful
- No childish clutter
Build the app in small steps.
First create the screen structure and navigation.
Do not implement AI yet.Prompt 2: Camera
Now implement the camera flow.
Use expo-camera.
Create:
- Camera permission state
- Full-screen camera preview
- Capture button
- Photo preview screen
- Retake button
- Catch Cat button
Keep code clean and split reusable components.Prompt 3: Firebase
Now add Firebase.
Create:
- firebase.ts
- auth helper for anonymous sign in
- cats service with saveCat and getCatsForUser
- TypeScript Cat type
Use Firestore modular API.
Use environment variables.
Do not expose secret server keys.Prompt 4: AI analysis function
Create analyzeCatPhoto.
It should accept an uploaded image URL and return strict JSON:
isCat, confidence, reason, suggestedName, detectedColor, possibleBreed.
Reject drawings, screenshots, toys, logos, cartoons, dogs, and non-cat images.
For now, mock the AI response behind a function interface so we can later swap in OpenAI vision or Google Cloud Vision.Prompt 5: Connect the loop
Connect the full capture flow.
When user taps Catch Cat:
- Upload image
- Analyze image
- If not cat, show rejection message
- If cat, generate rarity, level, and stats
- Save cat to Firestore
- Navigate to Cat Detail screen
Add loading and error states.Prompt 6: Make it feel like a game
Improve the successful catch flow.
Add:
- Analyzing state
- Cat detected state
- Rarity reveal
- Add to Collection button
- Shareable card UI
Do not add new features outside this flow.
Polish the core loop only.6. Database structure
Use this:
users/{userId}
cats/{catId}Better if you expect user-owned collections:
users/{userId}/cats/{catId}For MVP, use subcollections:
users
userId
cats
catIdExample cat document:
{
"name": "Miso",
"rarity": "Rare",
"level": 12,
"imageUrl": "https://...",
"stats": {
"stealth": 88,
"fluff": 76,
"chaos": 91,
"speed": 52,
"charm": 97
},
"detectedColor": "orange tabby",
"possibleBreed": "domestic shorthair",
"createdAt": "2026-06-22T12:00:00Z"
}7. Cat detection flow
The detection layer should be strict.
Bad version:
Does this image have a cat?Good version:
Does this image contain a real living cat photographed by the user?
Reject:
- cartoon cats
- plush cats
- screenshots
- toys
- logos
- AI-generated images if obvious
- photos of screens
Return strict JSON.Why this matters:
People will try to break the app.
They will upload Garfield.
They will upload a tiger.
They will upload a plushie.
They will upload a screenshot from Google Images.
Your app needs to reject obvious garbage.
8. Rarity and stats system
Make rarity feel earned, but not too smart.
MVP formula:
70 percent Common
20 percent Uncommon
7.5 percent Rare
2 percent Epic
0.5 percent Legendary
Hook, not fact:
This makes the app feel like a slot machine for cats.
Stats should be funny and shareable:
Stealth
Fluff
Chaos
Speed
Charm
Avoid stats like strength or attack. It makes the app feel like a battle game. This is a collection game.
9. Screens you need
Home
Purpose:
Explain the loop fast.
Buttons:
Catch Cat
My Collection
Text:
Find real cats. Snap them. Collect them.
Camera
Purpose:
Take the photo.
Needs:
Permission handling
Capture button
Preview
Retake
Catch Cat
Collection
Purpose:
Show everything caught.
Needs:
Grid
Rarity badges
Empty state
Tap into detail
Cat Detail
Purpose:
Make each cat feel valuable.
Needs:
Big image
Name
Rarity
Level
Stats
Breed guess
Color
Caught date
Reveal Screen
Purpose:
Reward the user.
Needs:
Analyzing animation
Rarity reveal
Add to collection
10. Common mistakes
Mistake 1: Starting with maps
Maps are not the MVP.
Maps create privacy issues, location bugs, and design clutter.
Start with camera collection.
Mistake 2: Using AI for everything
AI should verify and describe the cat.
It should not control the whole app.
Keep the logic deterministic where possible:
Rarity
Stats
Saving
Navigation
UI states
Mistake 3: No rejection flow
A cat app without rejection becomes an image uploader.
You need a hard fail state:
“No real cat detected. Try another photo.”
Mistake 4: Saving every uploaded image
Do not save failed captures as collectible cats.
Store only valid cats.
Mistake 5: Making rarity too generous
If every cat is Epic, nothing is Epic.
Keep Legendary rare.
Mistake 6: Letting vibe coding create messy files
Vibe coding gets ugly when you ask for too much at once.
Use small prompts.
Review changes.
Run the app after each feature.
Fix errors before adding more.
11. Safety notes
Do not encourage users to trespass to find cats.
Do not show exact public cat locations by default.
Do not store precise GPS unless there is a real reason.
Do not expose API keys in the mobile app.
Do not claim breed detection is accurate. Say “possible breed” or “visual guess.”
Do not let kids share exact locations of animals.
Do not build features that encourage chasing or disturbing animals.
Recommended safety copy:
Respect animals and private property. Only photograph cats safely from a distance.12. Quick reference
MVP stack
Expo
React Native
TypeScript
Firebase
Firestore
Firebase Storage or Cloudinary
OpenAI vision or Google Cloud Vision
Core screens
Home
Camera
Preview
Collection
Cat Detail
Reveal
Core functions
takePhoto()
uploadPhoto()
analyzeCatPhoto()
generateRarity()
generateStats()
saveCat()
getUserCats()The one prompt that matters
Build only the core loop first:
Open camera, snap real cat, verify with AI, generate collectible profile, save to collection.
Do not add maps, battles, trading, leaderboards, or social features yet.By The AI Leverage - Learn and master AI daily

