Download GlutenOrNot by Aaron Roy on the App Store. See screenshots, ratings and reviews, user tips, and more apps like GlutenOrNot.
HealthHTML · JavaScriptGitHub @amr05008OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Ingredient and menu scanner for celiac/gluten sensitivity
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
GlutenOrNot instantly checks if packaged foods are safe for people with celiac disease. Point your camera at an barcode, ingredient label or restaurant menu and get a clear verdict in seconds.
The app is free and requires no account creation to use. Here is a quick walkthrough of GlutenOrNot as it works in Sept. 2026, scanning barcodes, ingredient labels and a restaurant menu.Read the full README ↗GlutenOrNot instantly checks if packaged foods are safe for people with celiac disease. Point your camera at an barcode, ingredient label or restaurant menu and get a clear verdict in seconds.
The app is free and requires no account creation to use. Here is a quick walkthrough of GlutenOrNot as it works in Sept. 2026, scanning barcodes, ingredient labels and a restaurant menu.
We built this because we have celiac disease ourselves. Figuring out what we could and couldn't eat was confusing at first, and we didn't want to pay for an app just to scan ingredients. We hope this makes it a little easier for you too. If you want to run locally or make your own version, just add your own API credentials (or modify as you see fit).
npm install
cp .env.example .env # Add your API keys
npx vercel login # One-time auth
npx vercel dev # http://localhost:3000
Note: vercel dev runs the serverless functions locally. For static-only serving (no API), use npm run dev:static.
The app uses native modules (camera, SVG, Sentry), so it needs a development build — Expo Go can't run it.
cd mobile
npm install
npx expo run:ios # builds + runs a dev build in the iOS Simulator
# npx expo run:ios --device # run on a physical device (needed for the live camera)
Requires Xcode. Xcode 27 ships no Simulator.app, so npx expo run:ios fails there. Build and run headless with xcodebuild + xcrun simctl instead (mobile/RELEASE.md step 2), on the newest iOS runtime. For producing a release build + App Store submission, see mobile/RELEASE.md.
Scanning requires:
GOOGLE_CLOUD_VISION_API_KEYANTHROPIC_API_KEYOptional: OPENROUTER_API_KEY. With it set, a failed Anthropic call gets one attempt at the same Claude model through OpenRouter (decision 008). Without it, nothing changes. Which engine answers what: api/ENGINES.md.
glutenornot.com/
├── web/ # Web PWA
│ ├── index.html # Single-page app (all UI states)
│ ├── css/styles.css # Mobile-first styles
│ ├── js/
│ │ ├── app.js # Main orchestration
│ │ ├── camera.js # Photo capture, drag-drop, paste
│ │ ├── api.js # API client
│ │ └── ui.js # UI state transitions
│ └── tests/ # Vitest tests
├── mobile/ # React Native (Expo) iOS app
│ ├── app/ # Expo Router screens
│ ├── components/ # Reusable components
│ ├── services/ # API client
│ ├── plugins/ # Local Expo config plugins (UIScene life cycle for iOS 27 builds)
│ └── constants/ # Shared constants
├── api/ # Shared Vercel serverless functions
│ ├── _utils.js # Shared rate limiting, verdict normalization, constants
│ ├── _analytics.js # PostHog scan-event logging (no-op until POSTHOG_API_KEY set)
│ ├── analyze.js # Serverless: OCR + Claude analysis
│ ├── barcode.js # Barcode lookup (waterfall: Open Food Facts → USDA → Nutritionix → UPCitemdb)
│ ├── track.js # Client failure beacon (timeout/network/cancelled/interrupted scan_failed)
│ ├── recovery.js # Barcode-recovery funnel beacon (barcode_recovery: flow_id + reason + stage, content-free)
│ └── health.js # Health check
└── package.json # Monorepo root
The engineering version, with the lookup waterfall, the prompt rules and the safe-verdict floor, is docs/how-it-works.svg.
Photo scanning:
/api/analyzeBarcode scanning (mobile):
/api/barcodeJEV_MODE, decision 007), TypeSafe's Jev reads an Open Food Facts ingredient list in parallel: when Jev and a code rule agree on a clear "unsafe" (and, in the final stage, a clear "safe"), that answer comes back without waiting for Claude (Jev itself takes about 0.2 s; Claude takes about 3) and Claude's verdict is recorded as its auditresult_reason: "missing_context"), the iOS app shows a neutral "we can't tell" state instead of a verdict and offers a photo-only capture of the ingredient label, which then goes through the photo path aboveThe proven release path is a local Xcode archive — see mobile/RELEASE.md
for the full step-by-step (version bump → prebuild → archive → upload → submit).
EAS is an alternative, not required:
cd mobile
npx eas-cli login
npx eas-cli build --platform ios --profile preview
npx eas-cli submit --platform ios
Run tests:
npm test # Run all tests once
npm run test:watch # Run in watch mode
npm run test:coverage # Run with coverage report
Tests cover:
web/tests/api/evals/, opt-in with RUN_LIVE_EVALS=1 and an ANTHROPIC_API_KEY, ~86 calls per runSee ROADMAP.md for the prioritized improvement plan.
Guidelines: Keep it simple, test on mobile, be conservative with verdicts (every "caution" names a specific reason, and nothing is "safe" on a guess — decision 006).
MIT