// the find
simonoppowa/OpenNutriTracker
🍴 OpenNutriTracker is a free and open source calorie tracker with a focus on simplicity and privacy.
OpenNutriTracker is a Flutter calorie tracker for Android and iOS that keeps all data local and encrypted, pulls food data from Open Food Facts plus a Supabase-hosted backend covering USDA FoodData Central and the German BLS database, and ships with no ads or subscriptions. It targets privacy-conscious users who want a capable tracker without handing their eating habits to a cloud service. The feature set is unusually complete for an indie FOSS app — micronutrient tracking with IOM DRI reference values, recipe builder with barcode scanning, intermittent fasting timer, weight history with goal-tapering.
The clean architecture is actually followed, not just named: domain entities, repository interfaces, and data source implementations are split into proper layers across lib/core, which makes the codebase navigable and testable rather than the usual Flutter spaghetti. The food database strategy is smart — Open Food Facts handles the long tail of packaged goods while the USDA FDC and BLS entries cover standardized reference data, and users can select which sources to query in settings rather than being locked to one. Local-first with AES encryption is genuinely private: no account required, no telemetry by default, and the App Store privacy manifest actually documents what is and isn't collected. Active maintenance at 2200+ stars with a push yesterday and Fastlane automation for both iOS and Android stores suggests this isn't abandonware.
The food search backend is a Supabase-hosted service in a separate repo — if that Supabase project goes down or the maintainer stops paying for it, the USDA/BLS search path breaks silently for all users, not just self-hosters. Open Food Facts data quality is inconsistent in ways a tracker app can't paper over: the same food item can have three entries with different macro numbers because it's crowdsourced, and there's no visible deduplication or confidence scoring. There's only one integration test file (app_boot_test.dart) visible, which for a data-heavy app with complex diary logic is thin; the AES-encrypted local store means a corrupted database file with no cloud backup is a total data loss. GPLv3 is fine for personal use but means anyone who forks and ships a proprietary variant has to open-source everything, which limits downstream commercial adoption.