Last reviewed: February 20, 2026 — answers below are verified directly against the current app and backend code, not just policy language.
| Access | Why |
|---|---|
| Camera | To scan what's in your fridge (Fridge Scanner) and to photograph a cookbook page or finished dish for Recipe Import. |
| Photo library | To pick an existing photo for the same two features, instead of taking a new one. |
| Push notifications | Meal reminders, new recipe suggestions, and Family Plan invite/voting alerts. Optional — declining still lets you use the app. |
| Apple Sign-In | An optional sign-in method alongside email and phone/OTP login. |
What we don't ask for: location access is never requested anywhere in the app. Microphone access also isn't currently requested by the mobile app — see Question 6 for why, since it's more nuanced than a simple yes/no.
Source: frontend/app.json permission declarations, and the camera/photo-library request calls in frontend/app/fridge.tsx and frontend/app/import.tsx.
Yes. Here's what's actually persisted, by category:
Honest retention answer: outside of authentication refresh tokens — which are the one thing in the codebase set to auto-expire and self-delete — none of the categories above have an automatic deletion timer today. In practice, retention is indefinite until an account is removed (see Question 3).
Source: every MongoDB collection referenced across backend/routes/ (39 collections total), cross-checked for expireAfterSeconds / TTL indexes — only refresh_tokens has one, in backend/routes/deps.py.
Not automatically today. We checked every route file in the backend and found no self-serve "delete my account" endpoint or button currently implemented — deleting an account and its data is handled manually by our team right now, on request.
If you want your account and data removed, email support@moodfood.in and we'll process it directly. Building a self-serve, in-app deletion flow (with the same protections most apps offer — a short grace period before permanent removal) is on our roadmap; this page will be updated the day it ships.
Source: no match for account-deletion logic anywhere in backend/, frontend/, or web_frontend_old/ as of this review.
Yes, with real, verifiable protections in place — passwords are never stored in plain text, tokens are signed and verified on every request, and payment data never touches our own servers. The specific measures are listed in Question 5.
As with any product, "secure" isn't a permanent, absolute state — it's an ongoing practice. Our team ran an internal 47-point security audit and documented, honestly, both what's covered and what's intentionally left as backlog rather than rushed (see below). Nothing was hidden or glossed over in that process.
Tracked, not yet built: distributed (multi-server) rate limiting, stolen-token/session-theft detection, hard per-request timeouts, and limits on decompressed payload size. These need additional infrastructure and are deliberately flagged as backlog rather than left undocumented.
Source: backend/security_middleware.py, backend/routes/deps.py, and the team's own memory/SECURITY_47_VECTORS_STATUS.md audit log.
Audio — currently one-way, app to you. In hands-free Cooking Mode, each recipe step is converted to spoken audio (an AI-generated voice) so you can cook without touching your phone. Today, the mobile app only speaks to you — it does not request microphone access or record you. A separate voice-transcription capability (converting your spoken words to text via OpenAI's Whisper model) exists in the backend and is used elsewhere in the product, but isn't currently wired into a microphone permission on mobile. Where it is used, the audio clip is sent to OpenAI for transcription and isn't kept afterward — only the resulting text is stored.
Video. MoodFood can import a recipe from a YouTube video link. We don't download or store the video itself — its content is processed to extract the recipe, and only the resulting text recipe is saved.
We don't use audio or video for anything beyond these two purposes — no ambient listening, no background recording, no video calls.
Source: backend/routes/mobile_voice.py, backend/voice_service.py, backend/routes/voice.py, and the video-import path in backend/routes/import_recipe.py.