Privacy Policy — Focus4Life
1. Data stored on your device
Everything you create or configure in Focus4Life is stored only in the app's local storage on your device (a local SQLite database, preferences and app files). This includes:
- tasks, projects and recurring-task settings,
- pomodoro/focus session history and statistics,
- app settings and timer presets,
- Zen Garden and puzzle progress,
- photos you choose for garden mosaics,
- focus-interruption logs (see section 4).
The app never transmits any of this to us or to anyone else. We never see it — none of it is ever sent off your device. (The one feature that does contact a server of ours, redeeming a discount code on Android, is described in section 3 and sends none of the data listed above.)
2. Network activity: garden artwork
Focus4Life makes outbound network requests for exactly one purpose: fetching Zen
Garden artwork. When you open the Garden screen, the app automatically — at most once
every 7 days — downloads a small artwork catalog from GitHub
(raw.githubusercontent.com/ZinZinTech/focus4life-garden-assets) and then
the images it lists, which are served from the same place by default (catalog entries
may point to another content-delivery host operated for this catalog; every image is
verified against a checksum before use).
These requests carry no personal data, no account information and no device identifiers. As with any web request, the server (GitHub) sees your device's IP address — see GitHub's privacy statement. The fetch only happens when you open the Garden screen, and if you are offline or the download fails the app simply keeps working with its bundled artwork. The only other time the app makes a network request is when you actively redeem a discount code on Android — see section 3.
3. Redeeming a discount code
Focus4Life sometimes offers Pro at a promotional price through a discount code. How a code is redeemed — and whether the app contacts us at all — depends entirely on your platform.
On iOS and macOS, codes are Apple Offer Codes. When you choose to redeem one, the app simply opens Apple's own redemption sheet (iOS) or the App Store redeem page (macOS); Apple handles the entire exchange against your Apple account. We operate no server in this path and receive no data from it — the redemption is between you and Apple, under Apple's privacy policy. Firebase and our backend are never even started on Apple platforms.
On Android only, and only when you actively type a code and tap
redeem, the app contacts a server we operate. On that first redeem it lazily
starts Firebase and reaches our Firebase Cloud Functions backend
(Google Cloud, region asia-southeast1) to:
- validate the code — it sends the code you typed so the backend can check that it is real, active and not used up, and return the discount percentage. This step writes nothing, and the code value is deliberately never logged; and
- record the purchase — after you complete the discounted purchase
through Google Play, the app sends the code together with the Google Play
purchaseTokenandorderIdso the backend can verify the purchase with Google and mark the code used.
Each request is protected by Firebase App Check (Play Integrity), which sends Google a one-time attestation that the request comes from a genuine, untampered install of the app. This attestation is an app- and device-integrity signal, not an identifier of you; the App Check app identifier is the same for every install, so it cannot single you out. As with any web request, Google Cloud also processes your device's IP address transiently to route the request, and a Firebase installation identifier may be sent — see Google's Firebase privacy and security terms.
We keep one small redemption-ledger record — the Play
orderId and purchaseToken, the (non-identifying) App Check app
identifier, and the time the code was used — for a single purpose: so that the same code
cannot be redeemed twice. The ledger is keyed on the Play order, not on any
account or identity: no account or profile is ever created, the record is not
linked to you, and it is never used for advertising or analytics. There is no Firebase
Analytics, Crashlytics or Auth in the app, and the app never reads our database directly.
If you never redeem a code, or you are on iOS, macOS, Windows, Linux or the web, the app makes none of these requests and never starts Firebase at all. Your Pro unlock itself is stored only on your device.
4. Focus Lock — Usage Access (Android) & Screen Time (iOS)
Focus Lock can help you stay off distracting apps during a focus session. Its "block
distractions" feature is off by default and requires a double opt-in
from you: you must turn the switch on in the app's settings, and you must
grant Android's Usage Access permission
(PACKAGE_USAGE_STATS) on the system settings screen — the app can never
acquire it silently.
When enabled, Focus4Life uses Usage Access only to detect which app is in the foreground while a focus session is actively running, so it can remind you to return to your task and record the interruption in your local statistics. Interruption events are stored only on your device (briefly in a private app file, then in the app's local database), are never transmitted anywhere, and are used for no other purpose. You can revoke Usage Access at any time in Android's system settings; the app keeps working without it.
On iOS, the same "block distractions" feature is built on Apple's Screen Time framework (Family Controls). It is off by default and needs the same double opt-in: you turn it on in the app's settings, and you grant Screen Time access once through Apple's own system prompt — the app can never acquire it silently. You then choose which apps to shield in Apple's built-in app picker, which hands the app only opaque tokens: the app can shield and count the apps you picked, but cannot see which apps they actually are. During a focus session the app asks iOS to shield those apps and lifts the shield when the session ends. Your selection is stored, and the shield enforced, entirely on your device by iOS — none of it is transmitted anywhere.
5. Photos
You can pick photos from your library to turn into garden mosaics. Selected images are copied into the app's private storage on your device and tracked only in the app's local database — the app never uploads your photos anywhere. On iOS, photo-library access is the only system permission the app requests a usage description for, and it is used solely for this picking step.
6. Device backups
Like other apps' data, Focus4Life's local data (including photos you added and your local statistics) may be included in your device's operating-system backup — for example iCloud backup on iOS or Google backup on Android — if you have backups enabled. Those backups are performed and controlled by your device and your Apple/Google account, not by this app, and they are covered by Apple's and Google's privacy policies. The app itself never transmits your local data.
7. Permissions the app declares
Android (you may see these on the Play Store listing):
| Notifications | Timer alerts and session reminders. |
|---|---|
| Exact alarms | Ring exactly when a focus or break interval ends. |
| Run at startup | Restore scheduled reminders after the device reboots. |
| Foreground service & wake lock | Keep the timer running reliably while the screen is off. |
| Vibration | Haptic feedback for timer events. |
| Do Not Disturb access | Optionally silence notifications during focus sessions. |
| Usage access | Optional Focus Lock distraction detection — see section 4. |
| Display over other apps | Show the gentle "return to focus" overlay when Focus Lock is on. |
| Internet / network state | Used for the garden-artwork download (section 2) and, on Android, the discount-code redemption (section 3). |
Some additional entries appear in the app's technical manifest because of third-party
components it is built with, not because the app uses them:
QUERY_ALL_PACKAGES and REQUEST_DELETE_PACKAGES are declared
by the app-list plugin that powers Focus Lock's "choose apps to block" picker, and
Google push-notification (FCM/c2dm) receivers and services are bundled by
the iOS Live Activities plugin. These push-notification components are
present but never configured or used: the app sets up no Firebase
Cloud Messaging, no analytics and no crash reporting, so they can neither send nor
receive anything. (The one Google/Firebase service the app does use — only on Android,
only when you redeem a discount code — is described in section 3; it has nothing to do
with these push receivers.)
8. Deleting your data
Inside the app you can delete individual items: tasks can be deleted, projects can be archived or permanently deleted once empty, and photos you added can be removed (which also deletes the image files from the app's storage). The app currently offers no one-tap "erase everything" button, no data export, and no way to delete completed focus-session history from within the app.
To remove all of your data, uninstall Focus4Life (or clear its storage in your device settings). This permanently deletes the local database and all stored files — and because none of your local data is ever uploaded, no copy of it exists on any server. (The only thing we ever store on a server is the discount-redemption record in section 3, which contains no personal data and is not linked to you.) If you use OS backups (section 6), manage those through your Apple/Google account.
9. Children
Focus4Life is a general-audience productivity tool and is not directed at children under 13. The app collects no personal data from anyone, including children.
10. Your rights (GDPR)
ZinZinTech (KVK 42059149, Netherlands) is the data controller for this policy. Almost nothing you do leaves your device for our systems; the one exception is the Android discount-code redemption in section 3, where the data we process is limited to a discount code, a Google Play purchase token and order ID, a device-integrity attestation, and — as with any web request — your device's IP address transiently. None of this identifies you and none of it is used for ads or analytics. You can always contact us at phan.business.nl@gmail.com with any privacy question, and you have the right to lodge a complaint with the Dutch data protection authority, the Autoriteit Persoonsgegevens.
11. Changes to this policy
If a future version of the app changes what data is handled (for example, an optional cloud-backup feature), we will update this policy before that version ships and adjust the dates at the top of this page.
12. Contact
ZinZinTech · KVK 42059149 · Netherlands
phan.business.nl@gmail.com