Snap Fruit
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.
Demo (Android): coming soon · Demo (iOS): coming soon · Live 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
- ** 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.
- ** 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.
- ** 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.
- ** Keep it forever** — the scan is saved locally with favorites and instant search, fully available offline.
- ** 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.
Licensed under ISC — the mobile shell contains Expo's MIT-licensed template files.

