{"kind":"post","path":"/blog/iveeaten","post":{"metadata":{"title":"IveEaten Food Memory App","summary":"A Flutter mobile app for remembering restaurants and dishes, with offline Hive storage, Riverpod state, cloud sync history, photos, tags, ratings, and export tools.","publishedAt":"2025-12-30","projectDate":"2025-08-20","ascent":"#5D5FEF","tags":["flutter","mobile","offline-first","firebase","appdev"],"weight":0},"slug":"iveeaten","content":"\u003c!-- cover: /images/blog/iveeaten/cover.png --\u003e\n\nIveEaten is a private food journal. It remembers **restaurants, dishes, ratings, photos, and notes** after discovery apps stop being useful.\n\nThe app works without an account. It saves each change on the device first and uses cloud sync only when the user asks for it.\n\n## Visual Proof\n\n\u003cdiv className=\"bp-evidence-grid bp-evidence-grid--mobile\" data-preview-gallery=\"true\"\u003e\n\u003cimg src=\"/images/blog/iveeaten/home.png\" alt=\"IveEaten home screen\" /\u003e\n\u003cimg src=\"/images/blog/iveeaten/settings.png\" alt=\"IveEaten settings and sync screen\" /\u003e\n\u003cimg src=\"/images/blog/iveeaten/mobile-home.png\" alt=\"IveEaten mobile screenshot from fresh capture\" /\u003e\n\u003cimg src=\"/images/blog/iveeaten/mobile-pixel7.png\" alt=\"IveEaten Pixel 7 mobile screenshot\" /\u003e\n\u003c/div\u003e\n\n## Current Stack\n\nThe current app uses Flutter, Dart, Riverpod, go_router, Hive, Firebase Auth, Cloud Firestore, geolocator, image_picker, photo_view, and Material 3.\n\nIt moved from React Native and Expo to Flutter. Riverpod replaced hooks, go_router replaced Expo Router, Hive replaced AsyncStorage, and Flutter widgets replaced the old UI stack.\n\n## Data Model\n\nRestaurants can store an address and GPS location. Dishes can store a rating, description, notes, price, tags, and up to five photos.\n\nHive saves each change first. This keeps the full journal available offline.\n\n## State And Sync\n\nRiverpod providers update local state, then start optional Firebase sync for signed-in users. Smart sync uses the last change when local and cloud copies conflict.\n\nSync failure does not block app startup. Users can also choose one-way upload or download.\n\n## Data Ownership\n\nSettings include sign-in, sync, upload, download, JSON export, JSON import, and local data removal. Distance sorting and search also work from the local data."}}