Privacy Policy
This policy explains what the ExpiryNotifier mobile application collects, where it is stored, who processes it, and how to remove it. It is written to describe what the app actually does rather than to cover every possibility.
- Last reviewed against the app
- Effective date
- Not yet in effect
- Applies to
- ExpiryNotifier for Android and iOS, and this website
What this policy covers
ExpiryNotifier helps you track items before they expire. To do that it stores the items you create in an account, and it keeps some settings on your device. It does not build a profile of you, and it contains no analytics, advertising, or crash reporting software.
Two separate systems are involved, and the difference matters throughout this policy. Your account and your items live in Google Firebase. Support messages go to a separate support service that has nothing to do with your account.
1. Information you provide
Account information
If you register, you provide a display name, an email address, and a password. The password is handled by Firebase Authentication and is never stored by the app itself, in your device storage, or in the database.
If you start as a guest, you provide nothing. The app creates an anonymous account with a placeholder display name and an empty email value. If you later secure that guest account, you provide an email and password at that point, and the account you already had is kept rather than replaced.
Items you save
Each item you add stores exactly these things:
- the category you chose, as both an identifier and its name
- the item name you typed
- the expiry date
- the reminder date and time
- one photo, and the location of that photo in your storage folder
Your category setup is stored too: which preset categories you selected, and any custom categories you created, with their names.
Support requests
If you contact support from inside the app, you provide an email address, a category, a subject, and a message. A name is optional. You can attach one image in JPEG, PNG, or WebP format, up to 2 MiB after decoding.
2. Information collected automatically
Firebase user identifier
When you sign in, including as a guest, Firebase Authentication issues an account identifier. Everything you save is filed under it, and every read and write is checked against it. Securing a guest account keeps the same identifier, which is why your data survives the change.
Installation identifier, used only for support
The first time you send a support request, the app generates a random identifier for that installation and keeps it in your device's secure storage. It is reused for later support requests so a conversation can be followed up. It is not your account identifier, it is not sent to Firebase, and it is not linked to your account anywhere in the app.
Technical details sent with support requests
A support request also carries the app version, the platform (Android or iOS), the operating system version, the device model where the system reports one, and your locale. These are sent only when you submit a support request. The app does not collect or transmit them at any other time.
Connectivity state
The app watches whether your device reports a network connection and whether the internet appears reachable, so it can show an offline notice and tell you when you are back online. This is read on your device and used on your device. It is not recorded or transmitted.
App Check attestation, Android only
On Android, the app uses Firebase App Check with Google Play Integrity to confirm that requests come from a genuine, unmodified installation rather than from a script. Play Integrity is operated by Google and returns a short-lived token that accompanies requests to Firebase. It is an anti-abuse measure. It does not identify you, and the app does not store its result.
What is not collected
The app contains no analytics, advertising, attribution, or crash reporting software. It does not collect your location, your contacts, your calendar, your browsing activity, or anything from other apps. It makes network requests to only two destinations: Google Firebase, and the support service named below.
3. Information that stays on your device
The following never leaves your device. It is not uploaded, backed up by the app, or synchronised between devices.
Preferences
- your appearance choice of Light, Dark, or System
- your time format choice of System, 12 hour, or 24 hour
- whether you have finished the first-run introduction
Session details
A local record holds your account identifier, your display name and email, whether the account is a guest, and whether category setup is complete. It lets the app open at the right screen without waiting for the network.
Report files and history
Reports you export are written to a folder belonging to the app. Alongside them the app keeps a list of your fifteen most recent exports, holding an identifier, the owning account, the report type and title, the format, when it was generated, where the file is, how many items it covered, and the filters used. The list never contains the contents of a report.
Scheduled reminders
Reminders are scheduled with your device's own notification system. Each carries the category as its title and a line naming the item and its expiry date. Like any notification, that text may be visible on your lock screen.
Temporary caches
While the app is running it caches your category setup, resolved image links, and the most recent report result in memory, to avoid repeating the same requests. These are cleared when you sign out.
4. Service providers and processing
The app relies on these services. No other third party receives your data.
| Service | Operated by | What it handles |
|---|---|---|
| Firebase Authentication | Your sign-in credentials, guest accounts, and password resets | |
| Cloud Firestore | Your profile, category setup, and item records | |
| Firebase Storage | The photos attached to your items | |
| Firebase App Check with Play Integrity | Confirming requests come from a genuine installation, on Android | |
| ExpiryNotifier support service | The operator of this app |
Support messages and their attachments, sent to
api.syedshahbazhussain.com |
Google processes Firebase data under its own terms and infrastructure. The support service is separate from Firebase and receives no account data.
5. Permissions and device capabilities
Each permission is requested at the moment it is needed, and the app explains why. You can refuse any of them, and the app keeps working with that feature unavailable.
Photos you attach to items are compressed and re-encoded on your device before being uploaded, which reduces their size considerably.
6. Sharing
Sharing you initiate
When you share an exported report, the app hands the file to your device's own sharing controls. You choose the destination, whether that is email, a messaging app, or cloud storage. Anything that happens to the file after that is governed by the service you sent it to. The app does not upload exported reports anywhere on its own.
Sharing with service providers
Your account data is processed by the Google services listed above because that is where it is stored. Support messages are processed by the support service. That is the full extent of it.
No advertising or analytics sharing
A review of the current application source found no analytics, advertising, or data broker integration of any kind. Your information is not sold, rented, or shared for advertising.
7. Retention and deletion
Account data is kept until you delete it. There is no automatic expiry, and the app does not archive anything after you remove it.
Deleting your account
Open Settings, choose the Account section, and choose to delete your account. If you registered with an email and password you enter your password first. Guest accounts do not need one. Every deletion asks for a second confirmation before anything is removed.
The app then works through these steps in order:
- Every file in your storage folder is listed and deleted, including any left behind by items that no longer exist, and the folder is checked to confirm it is empty.
- Every item record is deleted in batches until none remain, followed by your category setup and your profile, each verified as gone.
- Only once all of that has succeeded is your sign-in account itself deleted.
- Your local session record, the report files and history belonging to that account, the in-memory caches, and every reminder scheduled on the device are cleared.
The order is deliberate. If a step fails, your account stays active so you can try again, and repeating the process is safe because anything already deleted stays deleted.
What remains on the device
Your appearance and time format preferences, the first-run introduction flag, and the support installation identifier are kept, because they belong to the installation rather than to your account. Uninstalling the app removes them.
Support messages are separate
Deleting your account does not delete support messages you sent earlier. Those live with the support service, not with your Firebase account, and the application contains no way to request their deletion. How long that service keeps them has not yet been documented, and this policy will not guess. See the draft notice at the top of this page.
8. Security
These are the technical controls actually in place.
- Owner-scoped database rules. The server rejects any read or write where the signed-in account does not match the account that owns the data. Every path outside that pattern is denied outright.
- Owner-scoped file rules. Only you can read, upload, or delete files in your folder. Uploads must be images, must not be empty, and are capped at 5 MB.
- Field validation on the server. The rules check types, lengths, and date formats, and require that an item's image path sits inside your own folder, so a malformed or misdirected record is refused rather than stored.
- Abuse protection. On Android, App Check with Play Integrity is used in production builds to confirm requests come from a genuine installation.
- Credential handling. Passwords are handled by Firebase Authentication and never stored by the app. Deleting an account requires re-authentication first for registered users.
- Support requests. Sent over an encrypted connection with a timeout and size limits, and never retried automatically. The installation identifier is held in your device's secure storage.
No service can promise perfect security, and this one does not. These measures reduce risk; they do not eliminate it. Use a strong, unique password, and keep your device locked.
9. Children, legal bases, and transfers
This section is not written yet, and inventing it would be worse than leaving it out.
Minimum age, the legal basis for each kind of processing, international transfer arrangements, the governing jurisdiction, and the rights you can exercise with a data protection regulator all depend on where the service operates and who operates it. Neither is recorded yet, so this policy makes no claim about any of them.
Once the operating entity and jurisdiction are confirmed, this section must be drafted and reviewed by someone qualified in that jurisdiction before the policy is published.
10. Contact and effective date
Who is responsible
The entity responsible for this service has not been recorded here yet. It must be named before this policy is published.
How to get in touch
No published address for privacy questions exists yet. In the meantime, use the Contact Support form inside the app, which is described on the support page. A dedicated address must be published here before this policy goes live.
Dates
The behaviour described above was last checked against the application source on . This policy has no effective date and is not in force.
11. Changes to this policy
When the app changes what it collects or how it handles data, this policy is updated in the same change, and the review date above moves with it. Material changes will be reflected in the effective date once one is set.