Privacy Policy
Foody is a barcode and photo scanner for food: it reads a product's barcode (or a photo of a meal) and shows ingredients, allergens, diet fit and nutrition. This page describes what the app does with data. It is written to match how the app actually behaves, not as boilerplate.
Who we are. Foody is developed and operated by Stepan Turovskiy, an independent developer ("we", "us"), reachable at foodysupport@gmail.com. For the purposes of the EU/UK General Data Protection Regulation (GDPR), we are the data controller for the data described here. No business postal address is published; the email above is the contact point for any privacy request.
- The whole app works without an account. Signing in is optional and exists only to back up your data across devices.
- No ads, no advertising ID, no third-party ad trackers. We use Firebase Analytics and Crashlytics only to measure feature usage and diagnose crashes — never for advertising or profiling (see §9).
- Your diary, dishes, allergen and diet settings, body metrics, calorie goal and scan history stay on your device unless you choose to sign in.
- The camera scans barcodes on the device; those frames are never recorded or uploaded.
- A meal photo you take for the food-scan is sent for recognition and then discarded — it is never stored.
- Photos you submit to help add a missing product are stored (see below).
1. Scanning and barcodes
The camera detects a barcode in the live picture. That detection runs on your phone; the frames are not saved and never leave the device.
When a barcode is recognised (or you type one in), the app sends that number to our product-lookup service over an encrypted connection and receives the product's name, ingredient list and nutrition values. A barcode identifies a product, not a person — no account, name or device identifier travels with it.
Product data comes from Foody's own database, supplemented by the open Open Food Facts database for products we don't cover yet. Where Open Food Facts data is shown, its own terms apply.
2. What stays on your device
Everything you enter is stored locally by default: your food diary, saved dishes and recipes, allergen and diet selections, body metrics (sex, age, weight, height, activity level), calorie goal, food-quality preferences, language, region and scan history. If you never sign in, none of it leaves the phone.
Uninstalling the app removes this local data. Scan history can also be cleared inside the app at any time.
3. Optional account and cloud backup
You can sign in — anonymously, with Google, or with an email address — to back up your data and keep it in sync across devices. Accounts are provided by Google Firebase (Authentication and Cloud Firestore).
What gets backed up: your profile (body metrics, calorie goal, allergens, diets, preferences), your diary and your dishes. Nothing else. Camera frames, meal photos and your scan history are not uploaded.
- Your cloud data is readable and writable only by your account; this is enforced by per-user security rules.
- Firebase processes this data on our behalf under the Google Privacy Policy and the Firebase data-processing terms.
- If you sign in with Google or email, Firebase Authentication also holds the identifier for your account (a user id, and your email and/or display name).
- We do not use your backed-up data for advertising or profiling. The usage analytics in §9 record only anonymous event counts — never your diary, dishes or profile content.
4. Photo food-scan (meal recognition)
If you photograph a meal to estimate its calories and macros, the photo is sent over an encrypted connection to our server, which forwards it to Google's Gemini API for recognition. Gemini returns an estimate of the dish, its ingredients and nutrition, which you can edit before saving to your diary.
- The photo is used only for that single recognition request. It is not stored on our server, is not saved in your diary, and is not synced to the cloud — only the resulting text (dish name, ingredients, numbers) that you choose to save becomes a local diary entry.
- If you are signed in, a security token identifying your account may accompany the request to prevent abuse; no name or email is attached.
5. Translating ingredient text
Some products carry an ingredient list in a language the app can't check against your interface language. In that case the product page offers an optional translation. If you request one, the label text and the product's barcode are sent to our server, which obtains a machine translation through Google's Gemini API and caches the result so the same product doesn't need translating again — for you or anyone else. No name, email or account identifier is attached to the request. The feature can be switched off in Profile → Experimental.
Interface language packs are similarly downloaded from our server when you pick a language; that request carries no personal data.
6. Helping add a product: the photos you submit
If a scan comes back "not found", or a product's composition is missing, the app offers to help add it: you can take or pick up to two photos and submit them. Nothing is sent until you press the send button.
When you submit, the photos travel over an encrypted connection to our server, which then:
- stores them in our media store (Vercel Blob) at an unlisted, random URL so a moderator can review them and so we keep an audit record of the contribution;
- records the contribution in our database (MongoDB) together with the barcode, the photo URLs, an optional product-name hint, your app version and platform, and — if you are signed in — your account id and display name;
- forwards the photos and a short sender label to the developer's private Telegram chat so the product can be added to the database.
The sender label is your display name or an anonymous identifier. These contribution photos and records are kept for moderation and audit (see Retention). You can have them removed by deleting your account; note that a message already delivered to Telegram is outside our systems and may persist there under Telegram's own policy.
7. Community, nicknames and the leaderboard
If you sign in with Google and your contributions are approved, you earn points (XP) and can appear on a public leaderboard. To support this we store, in our database (MongoDB): your account id, your display name and/or a nickname you choose, your Google profile name and photo URL, your points and level, and a running (append-only) log of point changes for audit.
- The leaderboard is shown only for accounts that signed in with Google and have at least one approved contribution.
- You can opt out of the leaderboard at any time, and change or clear your nickname, in the app.
- Anonymous and email-only sign-ins are never listed.
8. Sensitive data (allergens and diets)
Your allergen selections are data concerning health, and some diet choices (e.g. halal, kosher) may reveal religious or philosophical beliefs. Under GDPR these are "special categories" of data (Article 9) that receive extra protection.
We process them only to provide the core function you asked for — checking a product against your own allergens and diet — and only on your device (always) and in your cloud backup (only if you choose to sign in). We rely on your explicit consent for any such data that leaves the device (GDPR Art. 9(2)(a)). You give it by entering the data and choosing to sign in, and you can withdraw it at any time by turning off sign-in / deleting your account. We never share this data with anyone and never use it for advertising or profiling.
9. Who can receive data
We do not sell or rent any data, and the app contains no advertising code. The complete list of parties (processors and recipients) that can receive anything:
| Recipient | What they receive | When |
|---|---|---|
| Our product-lookup service (Vercel) | the barcodes you scan | every lookup |
| Open Food Facts | a barcode (product lookup) | when a product isn't in our DB |
| Google Firebase (Auth + Firestore) | your profile, diary, dishes; account id/email/name | only if you sign in |
| Google Firebase Analytics | anonymous usage events (e.g. a lookup or diary log happened) + app-instance id, device model, OS, coarse region | while you use the app |
| Google Firebase Crashlytics | crash diagnostics (stack trace, app version, device state) | only if the app crashes |
| Google Gemini API | a meal photo or ingredient text | only when you use those features |
| Our database (MongoDB Atlas) | contribution + leaderboard/nickname data | when you contribute / earn XP |
| Our media store (Vercel Blob) | the product photos you submit | when you submit them |
| Telegram | the product photos you submit + a sender label | when you submit them |
There are no other recipients. Google, Vercel, MongoDB and Telegram act under their own security and data-processing terms.
Analytics & crash reporting. To improve the app we use Firebase Analytics, which records anonymous, aggregate events — for example that onboarding was completed, a barcode was looked up, or a diary entry was logged. It never records the content of your diary, dishes, allergen profile, or which specific products you scan, and it is not linked to your name or email. Firebase Crashlytics collects a technical report only if the app crashes (stack trace, app version, device state) so we can fix the fault. Neither feeds advertising or profiling, and both are switched off entirely in our development builds. You can reset the identifiers behind this at any time through your device's privacy settings.
10. International transfers
Our processors (Google, Vercel, MongoDB Atlas) and Telegram may process data on servers outside your country, including in the United States. Where data leaves the European Economic Area / the UK, it is protected by an approved transfer mechanism — the EU–US Data Privacy Framework (to which Google LLC is certified) and/or the European Commission's Standard Contractual Clauses — as provided in each provider's data-processing terms.
11. Legal bases (GDPR)
Where GDPR applies, we rely on:
- Performance of a service you request (Art. 6(1)(b)) — barcode/photo lookups, cloud backup, contributions, the leaderboard;
- Explicit consent (Art. 9(2)(a)) — for special-category data (allergens, religious-diet choices) that you back up to the cloud;
- Legitimate interests (Art. 6(1)(f)) — abuse prevention (rate-limiting, moderation) and keeping an audit trail of contributions and points.
You can withdraw consent at any time; it does not affect processing already carried out.
12. Retention and deletion
- Local data lives on your device until you clear it or uninstall the app.
- Cloud backup (profile, diary, dishes) is kept until you delete it.
- Contribution records, submitted photos, and leaderboard/nickname data are kept while your account exists, for moderation and audit.
- The points ledger is append-only and may retain an anonymised record of past point changes even after deletion, for audit integrity.
- The translation cache holds only product text (no personal data).
You can delete your account together with its cloud data — profile, diary and dishes, the authentication record itself, and (best effort) your contribution photos and leaderboard data:
- in the app: Profile → Account → Delete account;
- on the web, without the app: account deletion page — sign in and confirm.
Deletion is immediate and cannot be undone. A message already delivered to Telegram is outside our systems and may persist there.
13. Your rights
Where GDPR (or a comparable law) applies, you have the right to access, rectify, erase, restrict and port your data, to object to processing, and to withdraw consent. Much of this is built into the app (edit or clear any field; delete your account). For anything else, contact us at foodysupport@gmail.com and we will respond within one month.
You also have the right to lodge a complaint with a data-protection supervisory authority in your country if you believe we have mishandled your data.
14. Children
Foody is a general-purpose utility and is not directed at children. We do not knowingly collect data from children below the age of digital consent in their country (13–16 depending on jurisdiction). If you believe a child has provided us data through an account, contact us and we will delete it.
15. Security
Data in transit is protected with encrypted connections (HTTPS / TLS). Cloud data is stored by Google Firebase and our other processors under their own security controls, and is restricted to your own account by per-user security rules. No method of transmission or storage is completely secure, but we do not retain more than we need.
16. Changes to this policy
If this policy changes, the updated text will be posted at this address with a new "last updated" date at the top.
17. Contact
Questions about this policy, a rights request, or a deletion request by mail: foodysupport@gmail.com.