Inqoura is an Expo React Native app that helps everyday shoppers make faster, clearer grocery decisions on packaged foods.
The app combines barcode scanning, ingredient-label OCR, a deterministic score, decision-focused verdicts, confidence signals, history insights, and premium guidance into a mobile-first flow backed by Firebase.
- Scan packaged foods by barcode with live camera or manual entry
- Read ingredient labels with OCR
- Show a decision verdict, numeric score, confidence, and main concern
- Support Shelf Mode comparison for products scanned in the same shopping session
- Save scan history, favorites, and comparison selections per signed-in user
- Sync profile preferences like theme, app look, diet profile, and share card
- Offer local history-based notifications like weekly recaps and smart nudges
- Support premium subscriptions through RevenueCat
- Unlock extra OCR through rewarded ads for non-premium users
- Use admin-managed product overrides and review queues through a local admin panel
- Firebase authentication
- email and password
- passwordless email link
- Google sign-in
- Trust-first result flow
- decision verdict
- confidence state
- top concern
- premium guidance
- Product lookup and overrides
- Open Food Facts base data
- Firestore product overrides
- reviewed / improved badges
- History and personalization
- per-account scan history
- shopper-friendly history insights
- favorites and comparison slots
- local scheduled history notifications
- Premium and monetization
- RevenueCat offerings and entitlement sync
- rewarded ad OCR unlock path
- premium share cards, app looks, and deeper guidance
- Admin operations
- separate
admin_panel/web app - user management
- product override editing
- app config controls
- correction report queue
- separate
- Expo SDK 54
- React Native 0.81
- React 19
- TypeScript
- Firebase Auth + Firestore
- RevenueCat
- Google Mobile Ads
- Expo Notifications
- ML Kit text recognition
- Node 20+
- Android development build for native feature testing
- Firebase project configured for auth and Firestore
- RevenueCat project configured for subscriptions
adbavailable if you want to run directly on a connected Android device
npm installCreate a local env file:
cp .env.example .env.localPopulate these values:
EXPO_PUBLIC_FIREBASE_API_KEYEXPO_PUBLIC_FIREBASE_AUTH_DOMAINEXPO_PUBLIC_FIREBASE_PROJECT_IDEXPO_PUBLIC_FIREBASE_STORAGE_BUCKETEXPO_PUBLIC_FIREBASE_MESSAGING_SENDER_IDEXPO_PUBLIC_FIREBASE_APP_IDEXPO_PUBLIC_FIREBASE_ANDROID_CLIENT_IDEXPO_PUBLIC_FIREBASE_WEB_CLIENT_IDEXPO_PUBLIC_FIREBASE_IOS_CLIENT_IDoptionalEXPO_PUBLIC_REVENUECAT_ANDROID_API_KEYEXPO_PUBLIC_REVENUECAT_IOS_API_KEYoptionalEXPO_PUBLIC_REVENUECAT_ENTITLEMENT_IDEXPO_PUBLIC_ADMOB_REWARDED_UNIT_IDoptional during development
Start Metro with Node 20:
export PATH="/home/zpoorv/.npm/_npx/ebaba8b9e55fd0a9/node_modules/node/bin:$PATH"
node ./node_modules/expo/bin/cli start --dev-client --localhost --port 8086 --clearIn another terminal:
adb reverse tcp:8086 tcp:8086
adb shell am start -W -a android.intent.action.VIEW -d 'exp+inqoura://expo-development-client/?url=http%3A%2F%2F127.0.0.1%3A8086' com.zpoorv.inqouraIf you need to install or rebuild the Android dev build:
npm run androidFor rough UI checks only:
npm run webRun the local admin panel:
npm run admin-panelThen open:
http://127.0.0.1:4173/login.html
The admin panel supports:
- dashboard overview
- product override editing
- user management
- app config controls
- correction report review
Signed Android App Bundle:
cd android
export PATH="/home/zpoorv/.npm/_npx/ebaba8b9e55fd0a9/node_modules/node/bin:$PATH"
./gradlew bundleReleaseConvenience scripts:
npm run android:aab
npm run android:apk:releasePublic web pages live in:
privacy/index.htmlprivacy/delete-account.html
Expected hosted URLs:
https://inqoura.app/privacyhttps://inqoura.app/delete-account
.
|-- admin_panel/
|-- privacy/
|-- src/
| |-- components/
| |-- constants/
| |-- models/
| |-- navigation/
| |-- screens/
| |-- services/
| |-- store/
| |-- types/
| `-- utils/
|-- App.tsx
|-- app.json
`-- package.json
- Firebase and store credentials should stay out of git.
android/andios/are generated native folders and are intentionally ignored.releases/is for local build artifacts and should not be committed.- The project uses a deterministic scoring core; AI-style guidance can be layered on top later without replacing the score engine.