fud-ai
Fud AI
Eat Smart, Live Better
Snap, speak, or type your food — AI handles the rest.
Open-source, privacy-first calorie tracker for iOS and Android. Bring your own AI provider — 13 supported including Gemini, OpenAI, Claude, Grok, Groq, Hugging Face, Fireworks AI, DeepInfra, Mistral, and any custom OpenAI-compatible endpoint. Open-weight models (Gemma, Llama Vision, Qwen VL, Pixtral) work out of the box. Snap a meal, ask your AI coach how to hit your goal, speak your lunch. All data stays on your device. No accounts, no cloud sync, no tracking, no subscriptions.
App Store · Google Play · Website · Report an Issue · Request a Feature
Logging
- Snap food — camera identifies meals and estimates nutrition
- Camera + Note — add a description with the photo for better accuracy
- Nutrition label scan — reads packaging for precise per-serving data
- Photo library — analyze existing photos
- Text input — type food descriptions
- Voice input — speak your meals hands-free (5 STT providers, see below)
- Saved Meals — Recents, Frequent, and Favorites with swipe-to-delete and drag-to-reorder
Intelligence
- AI Coach tab — multi-turn chat with memory. Coach sees your profile, weight history, and food log and answers questions like "what's my expected weight in 30 days?" or "how do I lose 2 kg?". Memory persists across launches; Reset button starts a fresh conversation. Long-press any reply to copy.
- Goal-aware prompt chips — suggested questions change based on whether your goal is Lose / Gain / Maintain
- Thermodynamic weight forecast — expected weight at 30/60/90 days, predicted vs observed weekly change, days-to-goal, under-logging detection. Surfaced through Coach as live context on every turn.
- Resilient requests — transient provider overloads (503 / 529 / 429) auto-retry with 1s / 2s / 4s exponential backoff across both food analysis and Coach chat, so short spikes resolve invisibly
Tracking
- 13 nutrients per entry (calories, protein, carbs, fat + 9 micronutrients)
- Scrollable week calendar — swipe to any past week, configurable start day
- Progress charts — weight trends, calorie history, macro averages (1W to All Time)
- Weight History — tap-to-delete past entries, syncs deletion to Apple Health
- Goal tracking — set target weight, BMR/TDEE auto-calculation; goal-reached alert fires from both manual logs and Apple Health reads
Health & platform
- Apple Health — bidirectional sync for body measurements + 12 nutrition types written per meal
- Widgets — Home Screen (small / medium with calorie ring + macro bars) and Lock Screen (circular / rectangular / inline). Update live whenever you add or delete a meal — no tap-to-open-app needed
- Share the App — native iOS share sheet from About → forwards App Store URL plus a personalized message and
fud-ai.applink; message body localized into all 15 languages - 15 languages — Arabic, Azerbaijani, Dutch, English, French, German, Hindi, Italian, Japanese, Korean, Portuguese (Brazil), Romanian, Russian, Simplified Chinese, Spanish (auto-selected by iPhone's Language setting)
- Meal reminders — customizable breakfast, lunch, dinner notifications
- Dark mode — system, light, or dark
- Metric & imperial units
AI Providers
Pick any of the 13 LLM providers for both food analysis and the Coach chat. Free Gemini keys are available at aistudio.google.com/apikey.
| Provider | Format | Highlight | Needs API Key |
|---|---|---|---|
| Google Gemini | Gemini API | Gemini 2.5 Pro / Flash | Yes |
| OpenAI | OpenAI | GPT-5 / 4o | Yes |
| Anthropic Claude | Messages API | Sonnet 4.6 (default) / Opus 4.7 / Haiku 4.5 | Yes |
| xAI Grok | OpenAI-compatible | Grok 4 | Yes |
| OpenRouter | OpenAI-compatible | Any model, free-form IDs | Yes |
| Together AI | OpenAI-compatible | Llama 4, Qwen VL | Yes |
| Groq | OpenAI-compatible | Llama 4 Scout, very fast | Yes |
| Hugging Face | OpenAI-compatible | Gemma 3, Qwen VL, Llama Vision (open-weight router, free-form IDs) | Yes |
| Fireworks AI | OpenAI-compatible | Qwen VL, Llama Vision, Phi-3 Vision | Yes |
| DeepInfra | OpenAI-compatible | Gemma 3, Llama Vision, Qwen VL | Yes |
| Mistral | OpenAI-compatible | Pixtral Large / 12B (open-weight) | Yes |
| Ollama | OpenAI-compatible (local) | Llama 3.2 Vision, LLaVA, Moondream — runs on your Mac | No |
| Custom (OpenAI-compatible) | OpenAI-compatible | You set base URL + free-form model name | Optional |
Speech-to-Text Providers
Pick how voice input is transcribed. Native iOS is the default — free, on-device, real-time.
| Provider | Notes |
|---|---|
| Native iOS (On-Device) | Free, offline on modern iPhones, real-time partial results |
| OpenAI Whisper | Whisper-1 via /v1/audio/transcriptions |
| Groq (Whisper) | Whisper-large-v3, very fast, has a free tier |
| Deepgram | Nova-3, fast and accurate |
| AssemblyAI | Universal model, strong accuracy, free tier |
All API keys are stored in iOS Keychain — encrypted, on-device only.
How It Works
Photo / Text / Voice
│
▼
AI Provider API ──▶ JSON nutrition response
│
▼
User reviews & edits
│
▼
FoodStore.addEntry() ──▶ UserDefaults (local) + Apple Health (optional)
For the Coach chat, every turn builds a slim system prompt from your live profile, BMR formula in use, computed forecast, and a one-line snapshot of available data. Coach then pulls any date range of weight, body fat, calorie totals, or food entries on demand via tool calling — ask "what was my weight in March?" or "show me my body fat trend over the last 6 months" and it fetches exactly the slice it needs.
Screenshots
A seven-step walkthrough of the app's core flow — from opening the dashboard to reviewing long-term trends.
01 · Home · Dashboard Daily calorie ring, macro bars (P / C / F), and today's logged meals grouped by meal type. Week strip at the top for date navigation. |
02 · Log · Options Tap + to open the entry menu: Camera, Camera + Note, Nutrition Label scan, From Photos, Text Input, Voice, or Saved Meals. |
03 · Snap · Capture Point and shoot. The image is sent to your chosen AI provider; nutrition estimates come back within a few seconds. |
04 · Review · Edit Review the AI's guess, adjust the serving size (everything recalculates live), and pick a meal type before logging. |
05 · Meals · Log The day's entries grouped by breakfast / lunch / dinner / snack. Swipe to delete, tap to edit any entry. |
06 · Coach · AI Chat Multi-turn conversation with full context of your profile, weight history, food log, and forecast. Ask "what should I eat?" or "expected weight in 30 days?". |
07 · Progress · Charts Weight trend with goal line, calorie history (intake vs. goal), and macro averages. Time ranges span 1 week to all time. |
||
Calorie & Macro Calculation
The app calculates personalized daily targets using established nutrition science formulas:
| Step | Formula | Details |
|---|---|---|
| BMR | Katch-McArdle | 370 + 21.6 × lean mass (kg) — used when body fat % is known |
| BMR | Mifflin-St Jeor | 10w + 6.25h − 5a ± 5 — fallback when body fat is unknown |
| TDEE | BMR × activity | Multiplier ranges from 1.2 (sedentary) to 2.0 (extra active) |
| Daily Calories | TDEE + adjustment | Adjustment = weeklyChangeKg × 7700 / 7 (deficit or surplus) |
| Protein | Activity + goal | 0.8 – 2.2 g/kg by activity, plus +0.2 g/kg during cutting phase (Helms et al 2014) |
| Fat | Fixed ratio | 0.6 g/kg body weight |
| Carbs | Auto-balanced | Remainder from calories − protein − fat (any macro can be pinned; max 2 pinned) |
All values can be manually overridden in Settings, with a Recalculate Goals button to snap back to formula defaults.
Architecture
| Component | Details |
|---|---|
| Language | Swift 5, SwiftUI, iOS 17.6+ |
| Storage | UserDefaults (local JSON), Keychain (API keys) |
| AI | GeminiService for food + label analysis, ChatService for multi-turn Coach chat, both route across all 13 providers |
| Speech | Native SFSpeechRecognizer or remote providers via SpeechService (m4a upload) |
| Health | HealthKit read/write (body measurements + 12 nutrition types) with background observers, UUID-tagged samples for safe delete |
| Pattern | @Observable + .environment(), main actor isolation |
| Localization | Localizable.xcstrings (String Catalog), 15 languages, auto-selected by iPhone's system language |
| Dependencies | Zero |
Repo Layout
fud-ai/
├── ios/ # SwiftUI iOS app (shipping on App Store, v3.2)
├── android/ # Kotlin + Jetpack Compose app (min SDK 26 / Android 8.0, v1.0.6)
├── web/ # Marketing site — https://fud-ai.app (static HTML/CSS, Vercel)
├── APPSTORE.md # App Store Connect listing copy (iOS)
├── PLAYSTORE.md # Google Play Console listing copy (Android)
└── README, LICENSE, CONTRIBUTING, SECURITY, CLAUDE.md, .github/
Source Layout (iOS)
ios/
├── calorietracker.xcodeproj/ # Xcode project
├── calorietrackerTests/ # Unit test target (boilerplate)
├── calorietrackerUITests/ # UI test target (boilerplate)
├── FudAIWidgets/ # Widget extension target (Home + Lock Screen)
├── screenshots/ # README screenshots
└── calorietracker/
├── calorietrackerApp.swift # Entry point, environment setup
├── ContentView.swift # 5-tab layout (Home, Progress, Coach, Settings, About)
├── Localizable.xcstrings # String Catalog, 15 languages
├── Models/
│ ├── AIProvider.swift # 13 LLM providers, model lists, settings
│ ├── SpeechProvider.swift # 5 STT providers + Keychain settings
│ ├── ChatMessage.swift # Coach chat message model
│ ├── UserProfile.swift # BMR/TDEE/macro calculations
│ ├── FoodEntry.swift # Food item with 13 nutrients
│ └── WeightEntry.swift # Weight log entry
├── Views/
│ ├── OnboardingView.swift # 15-step onboarding flow
│ ├── ChatView.swift # Coach tab: bubbles, prompt chips, reset
│ ├── FoodResultView.swift # AI result review & edit
│ ├── RecentsView.swift # Saved Meals (Recents / Frequent / Favorites)
│ ├── VoiceInputView.swift # Native + remote STT routing
│ ├── HomeComponents.swift # Week strip, macro cards
│ └── ProgressComponents.swift # Charts, weight history
├── Services/
│ ├── GeminiService.swift # Food/label analysis, routes 13 providers
│ ├── ChatService.swift # Multi-turn Coach chat, routes 13 providers
│ ├── SpeechService.swift # Remote STT router (OpenAI / Groq / Deepgram / AssemblyAI)
│ ├── WeightAnalysisService.swift # Thermodynamic weight-forecast math
│ ├── KeychainHelper.swift # iOS Keychain wrapper
│ └── APIKeyManager.swift # Keychain migration helper
└── Stores/
├── FoodStore.swift # Food CRUD + favorites
├── WeightStore.swift # Weight CRUD (auto-syncs profile weight)
├── ProfileStore.swift # @Observable wrapper over UserProfile
├── ChatStore.swift # Coach chat history (persisted locally)
├── NotificationManager.swift # Notification scheduler
└── HealthKitManager.swift # Apple Health bridge (body + nutrition)
Build & Run
# Clone
git clone https://github.com/apoorvdarshan/fud-ai.git
cd fud-ai
iOS
xcodebuild -project ios/calorietracker.xcodeproj \
-scheme calorietracker \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' build
Open ios/calorietracker.xcodeproj in Xcode, select your device, and run.
Android
Open android/ in Android Studio (Narwhal or newer), let Gradle sync, hit ▶ Run. Or from the CLI:
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
cd android
./gradlew :app:assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am start -n com.apoorvdarshan.calorietracker/.MainActivity
First launch walks you through a 15-step onboarding (gender, birthday, height/weight with metric/imperial toggle, body fat %, activity, goal, goal speed, notifications, Health Connect, AI provider + API key, plan preview, review). A free Gemini key is available at aistudio.google.com/apikey. You can switch providers anytime in Settings → AI Provider.
Contributing
See CONTRIBUTING.md for guidelines. Bug reports and feature requests welcome.
Adding a new translation? Open ios/calorietracker/Localizable.xcstrings in Xcode and fill in your language column — everything else is already wired.
Security
See SECURITY.md. Use private vulnerability reporting for sensitive issues.
Privacy
All data stays on your device. No accounts, no cloud sync, no analytics. API keys are stored in iOS Keychain. Delete All Data is local-only — it wipes the app's storage (food log, weight log, profile, Coach chat, API keys, widget snapshot) but never touches Apple Health. Samples you've synced are yours; if you want them cleaned up, do it from Health → Sources → Fud AI. See Privacy Policy.
License
MIT License. See LICENSE.
Contact
- Developer: Apoorv Darshan
- Email: apoorv@fud-ai.app or ad13dtu@gmail.com
- Follow on X: @apoorvdarshan
- Report an Issue: github.com/apoorvdarshan/fud-ai/issues/new?labels=bug&title=Bug:%20
- Request a Feature: github.com/apoorvdarshan/fud-ai/issues/new?labels=enhancement&title=Feature:%20
Support the Project
Fud AI is fully free, open source, and privacy-first. If it helps you, consider supporting development — every bit keeps this project alive.
You can also help by voting on Product Hunt, starring the repo, filing bugs, or requesting features.
Contributors
Thanks to everyone who has contributed to making Fud AI better:
