Skip to content
Snap Fruit

Snap Fruit

SnapFruit logo

SnapFruit

Snap. Know. Enjoy. — Point your camera at any fruit and get an instant, AI-powered deep dive: what it is, how ripe it is, whether it's safe to eat, and what's inside it nutritionally.

Platform Expo React Native TypeScript Node PostgreSQL Redis pnpm License

Demo (Android): coming soon · Demo (iOS): coming soon · Live demo: 👇

🧑‍🍳 Mobile Camera Demo 📱 Mobile Photo Gallery Demo
SnapFruit mobile demo SnapFruit mobile photo gallery demo

Status: working prototype — the core snap-to-know flow is complete; store-release polish and the ad-light experience are in active development.


What is SnapFruit?

SnapFruit is a cross-platform mobile app for anyone who has ever picked up an unfamiliar fruit at a market, in the garden, or abroad and wondered: what is this, and can I eat it? Snap a photo — an AI vision model identifies the fruit and returns a full fruit dossier with a ripeness gauge, a safety verdict, and the fruit highlighted in the frame.

Core Features

  • ** Snap-to-Know Vision AI** — capture with the camera or pick from the gallery; images are prepared on-device and analyzed instantly, with automatic fallback between providers so a single outage never breaks a scan.
  • ** Ripeness & Safety Verdict** — a vitality gauge (0–100%), a ripeness stage (Unripe → Perfectly Ripe → Overripe → Decaying) and an explicit Safe to Eat / Discard Item call, with the fruit highlighted in-frame.
  • ** Complete Fruit Dossier** — taxonomy, country of origin, nutrition per 100 g, cultivation & plant care, health benefits and fun facts — persisted on-device, so results stay available offline, forever after.
  • ** Offline-First History** — every scan is stored locally with favorites, instant search, and list/grid views.
  • ** Ad-Light Experience** (in development) — watch one short rewarded ad to enjoy 24 h ad-free browsing.

Also on board: an XP gamification layer, light/dark themes, and responsive layouts for phones and tablets.

App Workflow

  1. ** Snap or choose** — take a photo with the camera or pick one from the gallery; the image is cropped on-device before anything leaves the phone.
  2. ** Analyze** — an AI vision model identifies the fruit; if one provider is unavailable the request automatically falls back to the next, so an outage never breaks a scan.
  3. ** Review the fruit dossier** — ripeness gauge, safe-to-eat verdict, nutrition per 100 g, plant-care tips and fun facts, with the fruit highlighted in the frame.
  4. ** Keep it forever** — the scan is saved locally with favorites and instant search, fully available offline.
  5. ** Go ad-free (optional)** — watch one short rewarded ad for 24 hours of ad-free browsing.

Tech Stack & Why

Layer Tech
Mobile Expo SDK 57 · React Native 0.86 · React 19 · expo-router · TypeScript
State Zustand (+ persist middleware)
Storage expo-sqlite (scan history) · AsyncStorage (profile & settings)
UI/UX Reanimated 4 · Gesture Handler · expo-glass-effect · Lucide / Ionicons
AI OmniRoute (self-hosted OpenAI-compatible gateway) · Gemini · Mistral · Groq
API Node 20 · Express · PostgreSQL 16 · Redis 7 · node-cron
Infra Docker Compose · GitLab CI (buildx multi-arch) · pnpm workspaces

Why this stack: Expo gives one TypeScript codebase for iOS/Android/Web with first-class native modules (camera, SQLite) and fast iteration via Expo Go; Zustand keeps state minimal with selector-based re-renders and persisted slices; pnpm workspaces let the app share color, asset and type packages across apps/*; the API aggregates open data sources (FruityVice, Wikidata, Open Food Facts) behind Redis caching with Postgres as the source of truth.

Repository Layout

snap-fruit/
├── apps/
│   ├── mobile/       # Expo app — screens, AI vision adapters, SQLite persistence, AdMob service
│   └── api/          # Express REST API — fruit data aggregation, Redis cache, cron refresh
└── packages/
    ├── assets/       # Shared images & emoji assets
    ├── colors/       # Shared color tokens
    ├── constants/    # Shared constants (fruit species categories)
    ├── data/         # Seed/mock catalog — 114 fruits with full nutritional data
    ├── types/        # Shared TypeScript types
    └── ui-rn/        # Shared RN UI primitives (responsive text)

About the Author

Arnold Haban — full-stack engineer who enjoys delivering application products end-to-end, from React Native pixels to Dockerized PostgreSQL.

🔗 LinkedIn · Portfolio · GitLab · GitHub


Licensed under ISC — the mobile shell contains Expo's MIT-licensed template files. 🍍🍎🍓🍇