Green18 — Privacy Policy
Effective date:
The short version
Green18 collects no personal data. It has no accounts, no sign-in, no analytics, no advertising and no third-party software. When your phone is online, Green18 may make anonymous requests for shared player data — the same football facts for everyone — and nothing about you or your league is sent. Everything you enter stays on your device unless you choose to export it yourself.
What Green18 stores, and where
Green18 is a local-first app. The following is stored on your device only, in the app's own private storage:
| Data | What it is | Where |
|---|---|---|
| Leagues | The league parameters you enter (name, scoring, roster, draft order, team labels) | App documents (per-league store) |
| Drafts | The pick-by-pick draft log, your queue and favourites, and the derived board state | App documents (per-league store, with a last-known-good backup) |
| Draft philosophy and preferences | Your answers to the preference questions and the strategy weights they produce | App documents (part of the league record) |
| Your completed drafts | An archive of drafts you recorded, used only on your device to inform Green18's own draft-value model | App documents |
| Setup progress | Which league-setup steps you have finished | App preferences (UserDefaults, private to Green18) |
| Shared player data | Copies of the shared football data described below, if a newer copy was fetched | App documents |
None of this is transmitted anywhere by Green18. Green18 does not read your contacts, location, photos, calendar, microphone, camera, health data or any other system data, and asks for no permissions. (If you use iCloud Backup or back your iPhone up to a computer, iOS may include Green18's data in that backup under Apple's terms — that is your device backup, not something Green18 sends or syncs.)
What Green18 does NOT do
- No collection. No name, email address, phone number, identifier, usage data, diagnostics or crash reports are collected by the developer. (Apple may collect crash and diagnostics data under Apple's own policies if you have opted in to share it with developers in iOS Settings; Green18 itself contains no crash-reporting code.)
- No tracking. No advertising identifier, no tracking across other companies' apps or websites, no tracking domains.
- No accounts. There is nothing to sign in to. Deleting the app's local data is the only "sign out" (see below).
- No third-party software. Green18 links no third-party SDKs, advertising, analytics or crash-reporting libraries.
The one thing Green18 sends: anonymous requests for shared data
The app ships with all of its football data inside it and works with airplane mode on. When your phone is online, Green18 may check for a newer copy of that shared football data (player status, injuries, depth charts, projections, schedule) from Green18's own server, hosted on Microsoft Azure. It does this when the app opens or returns to the foreground (at most once every five minutes) and when you pull to refresh.
Those requests are anonymous. They ask for the same file everyone gets and carry nothing about you, your league, your roster, your picks or your preferences — no account, no identifier, no cookies, no query. Like any internet request they include:
- your device's IP address while the request is in flight;
-
the standard iOS request header, which names the app version and iOS version (for
example
Green18/18 CFNetwork/… Darwin/…) — no device identifier; -
a cache-validation header (
If-None-Match) carrying the server's own version tag for the file — the same value for every device that already has that version, so it identifies the data, not you.
Green18's server keeps no request logs: request logging on the storage that serves the shared data is switched off, so your IP address and the headers above are used only to answer the request and are not retained. Green18 never uploads anything.
(DesignSystem's PlayerImage component contains a dormant remote-image code path with no
caller in this app, disabled by the compile-time flag PortraitResolver.remoteFetchEnabled = false.)
Your controls
- Export. Settings → Data → Export league writes your league (parameters, draft log, preferences) to a JSON file and offers the iOS share sheet. Where that file goes is your choice; Green18 never sees it again. (The file name includes your league's name.)
- Import. Settings → Data → Import league reads a Green18 export you select. Files are read once and are not retained beyond what you imported.
- Delete. Settings → Data → Delete all local data removes every league, draft, archived draft and preference from the device. Uninstalling the app also removes all of it. There is no copy anywhere else to delete.
Children
Green18 is rated 4+ and collects no data from anyone, including children. It is not directed at children.
Third-party data inside the app (not about you)
The app contains football facts licensed from a third party. None of it is personal data about you:
- Player, team and schedule facts via the nflverse open-source community (CC-BY 4.0; MIT code). The CC-BY-SA 4.0 (share-alike) FTN-charting data nflverse also distributes is not ingested by Green18, so no share-alike term applies to anything shipped.
This build carries no data from Fantasy Football Calculator or any other market-data provider — Average Draft Position is not shipped or shown. It also carries no player photographs: Green18 shows a synthesized initials tile for every player and team, never a photograph of a real person.
Attribution for the data above is shown in the app under Settings → Data sources, alongside a statement that player photographs are not included. Green18 is not affiliated with, endorsed by or sponsored by the NFL, the NFL Players Association, any NFL club or any fantasy platform.
Changes to this policy
If a future version of Green18 changes what it stores or transmits, this policy and the app's privacy manifest will change together, and the App Store listing's privacy answers will be updated before that version ships.
Contact
manager@green18.app — the same address entered in App Store Connect. See also the Support page.
Appendix — technical cross-check (for reviewers and for the build gate)
| Claim above | PrivacyInfo.xcprivacy |
Code | ASC App Privacy (docs/app-store-metadata.md) |
|---|---|---|---|
| No tracking | NSPrivacyTracking = false, NSPrivacyTrackingDomains = [] |
the only networking API in Sources/ is the board-refresh transport (Sources/DraftEngine/Refresh/BoardTransport.swift): anonymous GET of shared board files, no cookies, no identifiers, no query — pinned by PrivacyInvariantTests |
"Data Not Collected" |
| No data collected | NSPrivacyCollectedDataTypes = [] |
no analytics/telemetry code; no third-party SDKs; requests carry no user datum (docs/privacy-invariant-audit.md §1–2); IP / User-Agent / If-None-Match are in flight only and not retained (no request logging on the public boards container — infra/azure/refresh/main.bicep), which Apple's App Privacy definition of "collect" excludes |
"Data Not Collected" |
Setup progress in UserDefaults |
NSPrivacyAccessedAPICategoryUserDefaults, reason CA92.1 |
Sources/Green18App/AppShell.swift (@AppStorage("green18.setupProgress.v1", store: AppShell.preferencesStore)) — the only call site; no app group |
n/a (on-device, not collected) |
| No other required-reason APIs | only one entry in NSPrivacyAccessedAPITypes |
PrivacyInvariantTests.testPrivacyManifestRequiredReasonAPIsEqualTheSetFoundInSources greps all three targets for Apple's symbol lists: declared set == used set; embedded frameworks use none |
n/a |
| In-app statement agrees | — | Settings → Data note (SettingsScreen.swift, settings-local-only-note): "works fully offline … never uploaded … may fetch shared player data anonymously — nothing about you or your league is sent" |
— |