📋 Table of Contents

  1. What you actually need to build

  2. Recommended stack

  3. The MVP architecture

  4. Step-by-step build plan

  5. Cursor prompt pack

  6. Database structure

  7. Cat detection flow

  8. Rarity and stats system

  9. Screens you need

  10. Common mistakes

  11. Safety notes

  12. Quick reference

1. What you actually need to build

You need five pieces:

  1. A camera screen

  2. A cat detection check

  3. A collection database

  4. A cat profile page

  5. 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.

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 start

Ask 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-camera

Prompt:

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 fails

Do 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 cat

This 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 screen

Step 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 Collection

Do 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
      catId

Example 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

Keep Reading