Last updated: 25 August 2026
This document describes what the Worldpiece app does with data. It is written from the source code, not from intent: every claim below can be checked in the repository, and the sections at the end say exactly where.
Worldpiece does not collect, receive, or share any data about you.
The app has no servers of its own, no accounts, no analytics, and no advertising SDK. Nothing you do is sent to us, because there is nowhere for it to be sent: we operate no service that could receive it.
There are exactly two exceptions to "nothing leaves the device". Both go to Apple, never to us, and both are yours to switch on or off.
Apple Game Center. If — and only if — you choose to sign in, the game asks Apple to record your score in the leaderboard under your own Apple ID. That request goes to Apple, not to us. We never see your name, your Apple ID, your rank, or anyone else's score: the leaderboard is drawn by Apple in Apple's own window.
Your own iCloud. If you are signed in to iCloud, the game keeps a copy of your progress there so it appears on your other devices. It is stored in your personal iCloud account, in the small key-value area Apple gives each app, and it counts against your iCloud storage, not ours. We have no access to it: we run no servers, hold no keys, and cannot read what is in your iCloud. If you are not signed in to iCloud, the game simply plays on, saving locally, and says nothing about it.
What travels is the same list of progress you see in the next section, minus two things that stay on each device on purpose: your settings (sound, vibration, language, reminders) and the unfinished game you are in the middle of. Settings belong to the device — you may want silence on one and sound on another. An unfinished board should not jump between devices mid-move.
If you sign in to neither, the app makes no network requests at all.
The game saves your progress locally so you can continue where you stopped:
That is the complete list — it mirrors DEFAULT_SAVE in src/storage.js field for field, and you can check it there.
This data is written to the device's own storage (Web Storage inside the app and, on mobile, the system preferences store). A copy also goes to your own iCloud when you are signed in to it — see the two exceptions above; it reaches Apple, never us. The local copy is removed when you delete the app, and "Reset progress" in Settings clears it from inside the game. The iCloud copy is yours: it is removed with the rest of an app's iCloud data in iOS Settings → your name → iCloud.
Worldpiece can turn your own photo into a puzzle. You can pick an existing photo or take a new one — iOS offers both inside its own picker, and either way the picture goes straight into the puzzle and no further.
The app never asks for access to your photo library: the system picker runs outside the app and hands over only the one file you chose. It does ask for camera permission, but only at the moment you choose "Take Photo" yourself.
When you pick a photo:
The app never browses your photo library: it receives only the single file you hand it through the system picker, which runs outside the app. Camera permission is requested once, and only if you yourself choose "Take Photo" in that picker — the shot then goes straight into the puzzle.
Worldpiece contains no chat, no user-to-user contact, no user-generated content shared with anyone, no links out of the app, and no advertising. Nothing in the app can put a child in contact with a stranger.
Purchases inside the app are processed entirely by Apple's App Store or Google Play. Worldpiece never sees, receives, or stores your payment details — the app is told only whether a purchase succeeded. Refunds, receipts, and payment data are handled by the store under its own privacy policy.
Worldpiece contains no advertising. Not disabled by a setting — there is no advertising code in the app at all: no ad SDK, no ad network, no rewarded video, no interstitials between levels.
This is a property of the game, not a paid privilege: nobody sees ads, and nobody has to pay to avoid them.
Reminders about the daily puzzle are off until you turn them on in Settings, and they are local notifications: the phone schedules them and the phone shows them. Nothing is sent anywhere, and nothing about you leaves the device — the reminder is created on your phone from data that was already on your phone.
The app uses no push notifications. Push would require a server that knows who you are and when to write to you; we run no such server and hold no such list. There is no APNs key in the project and no Push Notifications capability in the build.
Reminders never advertise: they say that a new daily puzzle is available, or that a streak you already started is about to end. Turning them off in Settings removes every scheduled reminder. Sound, banner style, badges and Scheduled Summary belong to iOS Settings, not to the app.
There are none. The app does not measure sessions, crashes, retention, or anything else, because it never contacts a server.
None. There is nobody to share data with: no third-party services are embedded in the app.
Because no data ever reaches us, there is nothing for us to disclose, export, correct, or delete on your behalf. You are in full control:
Should this ever change, this policy will be updated first.
Questions about this policy: [email protected]
We answer every letter. This address forwards to a real person — it is not a robot and not a ticket queue.
Reviewers and curious players can check every statement above:
| Claim | Where to look |
|---|---|
| No network requests of our own | no fetch, XMLHttpRequest, WebSocket, or sendBeacon anywhere in src/ |
| Game Center and iCloud are the only things that leave the device | src/gamecenter.js and ios/App/App/GameCenterPlugin.swift — three calls: sign in, submit a number, show Apple's window |
| The iCloud copy goes to your account, not to us | src/cloudsave.js and ios/App/App/CloudSavePlugin.swift — Apple's NSUbiquitousKeyValueStore and nothing else; there is no address in the code to send anything anywhere |
| Settings and the unfinished game stay on the device | NOT_SYNCED in src/cloudmerge.js names them, and the merge tests check that they never travel |
| Game Center is optional and silent | signIn never presents a sign-in sheet on launch; submitScore does nothing unless the player signed in |
| We receive nothing back | the plugin returns only available and sent flags — no names, no ranks, no other players |
| No analytics or trackers | no such dependency in package.json; no SDK in src/ |
| Storage is local only | src/storage.js — Web Storage plus @capacitor/preferences |
| Photos are never uploaded | src/screens/custom.js — FileReader only, no upload path |
| No camera plugin, no library access | no camera plugin in package.json; src/screens/custom.js uses a plain <input type="file">, so iOS runs its own picker outside the app |
| Camera only on your own choice | NSCameraUsageDescription in ios/App/App/Info.plist; iOS asks before the camera opens, and only if you tap "Take Photo" |
| No advertising at all | no ad SDK in package.json; no ad module in src/; a test forbids one appearing (adsTests in tests/board.test.mjs) |
| Purchases go through the store | src/billing.js — refuses without a real store plugin |
| Reminders are local, never push | ios/App/App/RemindersPlugin.swift uses UNUserNotificationCenter; no registerForRemoteNotifications, no aps-environment in App.entitlements |
| Reminders are off by default | settings.reminders: false in src/storage.js; the system prompt is shown only after you switch the row on |
| The review prompt is Apple's own | src/rating.js and ios/App/App/RatingPlugin.swift — a single AppStore.requestReview(in:) call and nothing else |
The full plugin list is: App, Haptics, Preferences, Splash Screen, Status Bar, and three plugins of our own — Game Center, Reminders, and Rating. Only Game Center talks to the network, only after you sign in, and only to Apple. Reminders runs entirely on the phone; Rating asks the system to show Apple's own review sheet and learns nothing about what you answer.