Privacy Policy
Last updated: November 1, 2026
Pushup RPG is built to respect your privacy. This policy explains exactly what the app does and does not do with your data.
Android and iPhone. This policy covers both apps. Most of it applies to both, and where they differ, the section says so. On Android, in both the Google Play and the Solana dApp Store editions: pose detection runs on your phone using Google’s ML Kit, which sends Google usage metrics about itself (see Google ML Kit); the app never asks for your microphone, your location or your contacts; it does not use the advertising ID; it contains no Singular or other install-attribution service and no health-platform integration; and two kinds of report name your phone’s make and model where the iPhone reports do not, as Diagnostics you choose to send and Automatic error reports below explain. Questions about what applies on your phone: support@pushup.quest.
On this page
- Camera
- Google ML Kit (Android)
- Clips (optional, off by default)
- Microphone (your choice, per the system's own prompt)
- Photos
- Your avatar photo (Vigil members, optional)
- Diagnostics you choose to send
- Apple Health (iPhone only, optional)
- Accounts and cloud sync
- Solana wallet (Solana dApp Store edition)
- Notifications
- Install measurement
- Creator codes
- Friends
- Guilds
- Hall chat (iPhone, from version 2.6.3)
- Your country
- Live duels and the Arena
- Data we share
- Statistics we publish
- Who is responsible for your data
- Your rights over your data
- Why we are allowed to process it
- How long we keep it
- Where your data goes
- Deleting your data
- Children
- Android beta waitlist (closed)
- Website analytics
- Advertising measurement on this website
- Contact
Camera
The app uses your device camera to count pushups, squats, sit-ups, pull-ups and dips by detecting your body pose, and to time your plank the same way. All processing happens on-device, in real time. Pose detection never records, stores, or transmits video, images, or pose data off your device. Unless you turn on clip recording (below), the camera feed exists only in memory while a battle is active and is discarded immediately. Camera data is never uploaded to our servers or anywhere else.
Google ML Kit (Android)
On Android, in both the Google Play edition and the Solana dApp Store edition, pose detection is done by Google’s ML Kit. It runs on your phone, and it sends Google information about how ML Kit itself is performing. Google’s disclosure for ML Kit lists what that is: your device’s manufacturer, model and operating system version; the app’s package name and version; a per-installation identifier that Google says is not intended to identify you; how long processing took; the format and resolution of the images ML Kit was given, and the size of what went in and came out; and event types and error codes. Camera images are not on that list, so what the Camera section says about video, images and pose data holds on Android too. Google states the data is used for diagnostics and usage analytics, is not linked to your identity, is not shared with third parties, and is encrypted in transit. The app also contains Firebase Installations and Firebase Remote Config, which ML Kit relies on and which exchange an installation identifier with Google. The iPhone app does not include ML Kit: it detects your pose with Apple’s Vision framework, on the device.
Clips (optional, off by default)
If you turn on Record clips in Settings, the app records your battle or practice screen — the camera view plus the game overlays — into a video clip stored only on your device. On iPhone, iOS asks for your explicit confirmation before each session's first recording, and a REC indicator is visible whenever recording is active. On Android, recording uses Android’s own screen-capture prompt, which the system shows before recording starts, and a clip goes into your gallery (under Movies) only when you tap Save clip to your gallery.
- Clips never leave your device unless you choose to share them (on iPhone, via the iOS share sheet) or save them to your Photos library.
- We never receive, upload, or process your clips — there is no server involved.
- Recording stops automatically after 3 minutes, and you can stop it any time by tapping the REC indicator.
- Unshared clips are kept temporarily on-device and cleaned up automatically.
Microphone (your choice, per the system's own prompt)
When a recording starts, iOS's own consent sheet lets you choose Record Screen and Microphone or Record Screen Only. If you allow the microphone, your clips include audio from the device microphone (your voice and the surrounding room) so shared videos carry the real moment. Like the video, this audio is recorded only on your device, only while you record, and is never uploaded to us. If you pick Screen Only, clips include only the game's own sound effects.
The Android app has no microphone permission, so it never records sound from your microphone.
Photos
Two separate things, and neither gives the app the run of your library.
- Saving a clip (via Save Video on the iOS share sheet, on iPhone) uses add-only access.
- On Android, saving a clip to your gallery needs no photo-library permission, and the app has none.
- Choosing an avatar photo (a Vigil perk — see Your avatar photo below) opens Apple's own photo picker, which runs outside the app (on Android, the system’s own photo picker, which works the same way). We receive only the single image you pick; the app cannot see, browse, or search the rest of your library, and it never asks for photo-library permission.
Your avatar photo (Vigil members, optional)
With a Vigil membership you can use your own photo as your portrait instead of one of our painted ones. Because this is the one thing in the app you upload, here is exactly what happens to it.
- The image is cropped and shrunk on your device before it leaves — we never receive the full-resolution original.
- Before upload, the device screens it on-device for explicit content — on iPhone this is Apple's own analyser. This uses Apple's own analyser and, like everything else in the camera path, the picture is not sent anywhere to be checked.
- It is then stored on our servers, attached to your account.
- It is public. Your avatar is shown to other players wherever your name appears — your guild roster, the friends list, the worldwide leaderboards, duels. Anyone who can see your name can see your face. Please only upload a photo you are happy for strangers to see, and only one you have the right to use — do not upload a picture of someone else without their agreement.
- You can remove it whenever you like, from the same portrait picker you chose it in. Removing it takes it off every screen in the app immediately.
- It is deleted when you delete your account.
- Other players can report your avatar, and we can remove it — see Content moderation below.
Diagnostics you choose to send
If the camera is miscounting your reps, Settings → Reps not counting? lets you send us what the detector decided. The screen shows you the exact lines before anything is sent, and nothing goes anywhere unless you tap send. It contains the detector's own measurements — joint angles, timings, the reason each rep was accepted or refused — plus your app version, attached to your account so we can follow up. On iPhone it does not include your device model. On Android, the report’s first line names your phone’s manufacturer and model and its Android version, because the pose detector behaves differently from one phone to another.
No video, no images, and no photographs of you are ever included in that report — the camera feed never leaves your device, as described under Camera above.
The app also keeps a small tally of why reps were refused (for example "too shallow"), which rides along in your cloud save and helps us see which failures are common.
Automatic camera-session diagnostics. Separately from the report above, and without asking you each time, the app sends us a short summary at the end of every camera session: how long the camera ran, how many reps were counted, how many were refused, how many attempts ended as neither (a rep abandoned halfway, for example), the most common refusal reason as a code, a code for how far the detector got if it never managed to start counting, which screen and which movement you were doing, for push-ups (iPhone, from version 2.5.10) a code for roughly where the phone stood — at your side, at an angle, or in front of you — which the app works out on your phone from how wide your shoulders look compared with how long your torso looks, whether you were on iPhone or Android, your device’s performance tier and the app build. These are numbers and codes only. They are linked to your account, batched, and sent once per session. No video, no images and no joint coordinates are included, and as everywhere else on this page the camera feed itself never leaves your device. We use this to find detection failures we would otherwise only hear about from the few people who write in. Summaries are kept for about a week, then deleted.
The shape of the camera picture (iPhone, from version 2.5.10). Beside that summary the app sends one more short record about the picture the counter received: its proportions as a number, whether it was taller than it is wide or wider than tall, how many degrees the app turned it, and where that turn came from — your device’s own reading, a reading from an earlier session, your camera-angle setting, or the app’s default — with the same screen and movement, how long the camera ran (so the two records can be matched), whether you were on iPhone or Android, your device’s performance tier and the app build. From version 2.6.1, on the push-up and plank screens, the record also carries a code for how the phone was lying when the camera opened (upright, on its side, flat, upside down or in between), worked out on your phone from its motion sensor; the angle the phone’s own camera orientation settled on once the phone had been still for a second; and whether the app straightened a sideways picture during that session, whether it would have done so had your account been in the group for which it may, whether your account was in that group, and whether you had no account yet when the camera opened. It contains no image. A picture lying on its side makes counting less accurate, and this is how we find out how often that happens (on iPads standing in a keyboard case, for example). Like the summary it is linked to your account and kept for about a week; after that only daily totals with no account attached remain.
Automatic usage events. Also without asking you each time, the app records a handful of other moments in the same way, as numbers and codes linked to your account:
- Opening the app: how long since you last opened it and since you installed it, and a rough band for your lifetime reps.
- Finishing onboarding: how long it took, which steps you saw and how long the plan step took. Version 2.6.0 also recorded how many presses the plan step’s button needed; later versions do not.
- Your first counted rep: how long after you installed the app it came.
- A membership screen closing: how long it was open, which screen and which version of it, what opened it, which price tiers it showed, and whether you closed it, started a trial or bought. From version 2.6.1, also each time you tap a buy button on one: which plan it was for and what the store answered (bought, cancelled, failed, or waiting for an approval). And, if you are a member, that you opened the membership screen, which plan you hold, and whether the offer of a lifetime membership was shown to you. Also from version 2.6.1 (iPhone only), on the offer shown to new players, which of two moments for showing it your account was given, while we are comparing the two. From version 2.6.4 (iPhone only), when a free trial starts, which of two versions of the trial week your account was given, while we are comparing the two.
- Being refused a place in a guild: the reason, such as the guild being full or you being below its minimum level.
- Battle clips, only if you turned clip recording on: how many seconds of clip were captured, how long the camera ran, which screen you were on, how the recording ended, and whether you went on to share it.
- Your difficulty baseline changing: the old and new value, and whether onboarding, Settings or a suggestion in the app changed it.
- Accepting the offer to count knee push-ups: how many reps had counted by then, what prompted the offer, and which screen you were on.
- Reps paying out: each time a set, wave, floor or duel bout is credited, where it happened (training, a fight, a duel), how many reps it credited, how many of them earned rewards, and why a set earned less (for example a replayed fight, or reps past the daily reward limit).
- Sharing a result that is not a clip (today, a duel result card): the movement, whether you won, lost or drew, whether the caption carried your duel invite link, and whether the share was opened or completed.
- Starting a New Game+ cycle: which cycle and your hero’s level at the time.
- Waiting for an Arena opponent: each step of the offer to be notified when a rival appears (shown, tapped, notifications declined, watch set, woken by the notification), how long you had waited, how many others were searching and which movement.
- Claiming a weekly leaderboard trophy: the week, your shared rank on the board, the gems it paid, its tier and which board (push-ups or squats).
- Finishing a fight (iPhone, from version 2.5.9): whether the foe fell, the clock (from version 2.5.10, sometimes your hearts) ran out or you left, how long the fight lasted, the time left on its clock, the reps you did in it, how much of the foe’s health was left, the wave or Descent floor, and whether it was a boss fight, a timed fight and one showing the foe’s attacks (from version 2.5.10, one fought with hearts).
- A timed part of a fight ending (iPhone, from version 2.5.10): whether the foe fell, your hearts or the clock ran out, or you left; the movement; whether it was a timed fight, a timed wave or a boss’s final onslaught; whether it ran past the old time limit; and, when it was fought with hearts, how many you started with and lost, how many of the foe’s attacks you blocked, how many hearts were saved by attempts the camera did not count as reps, and how many hearts you lost while the camera could not see you.
- The card suggesting you found your own guild (iPhone, from version 2.6.2), shown when every guild you applied to is full: that it was shown (at most once a day), that you tapped it or put it away, and that you founded a guild from it; whether you were a Vigil member at the time; and how many applications you had waiting and how many days the oldest had waited.
Each event also carries your device’s performance tier, the app build and whether you are on iPhone or Android. None of it includes video, images or anything you typed. This is our own record, kept on our servers, and it is separate from what Singular receives, which is described under Install measurement below. We use it to see which parts of the app work and where people give up. From version 2.6.3 we also use the app build in your most recent app opening for one more thing: hall moments are written about you only if your app has the switch to turn them off (see Hall moments). Usage events are deleted after about a week, and after that only daily totals with no account attached remain.
Your first steps in the app (iPhone, from version 2.6.0). The iPhone app keeps a short record of how far a new installation gets: which setup screens it reaches, and a few moments of the first sessions after that. It does this without asking you each time, and it starts before you have an account, because the setup screens come before sign-in. That makes it different from everything described above, so here is all of it.
- What is recorded, once each, the first time it happens on an installation: reaching each setup screen (welcome, hero name, your max set, the three practice reps, class, your plan, reminders) and finishing setup; in the practice step, your first counted rep and whether you finished or skipped it, and the tip it shows when half a minute passes with no rep counted; when its camera first started showing you, and whether you put the app away while it was on screen, and at which point (its explanation, the camera on before a counted rep, or after one); in version 2.6.0 only, letting go of the plan screen’s hold button too early; whether you allowed or refused reminders, and the camera when the practice step or a fight asked for it; seeing the sign-in screen, and whether you signed in or continued as a guest; reaching the Today screen; tapping Start Battle; a fight opening, and whether the Start Battle button, the Train button or the Adventure map opened it; in the first fight an installation opens, until its first counted rep: whether the camera was already allowed, still to be asked for or switched off, how many seconds passed before the camera first saw you, before your first rep began and before it was counted, which setup tip the fight showed you first, and whether you left the fight or put the app away before that first rep, and how many seconds in; your first counted rep in a fight; leaving the app while a fight is on screen and has not ended; winning a fight, or leaving one without winning; the membership offer shown to new players, and its closing; the one-time offer that can follow it, and that offer closing; while we are comparing two moments for showing the membership offer (straight after setup, or after a first win), which of the two your account was given; while we are comparing two places for the duel on a new player’s Today screen (from the first screen, or from a first win), which of the two your installation was given, or that a creator code put the duel first; while we are comparing two versions of the practice step’s camera screen, which of the two your installation was given, or that the app had not yet loaded its settings when you reached that step, and whether your text size was set larger than the standard size; opening the duel from the Today screen before your first win; in the Arena, while you are a new player searching alone, being offered the Standard before the search gives up, and whether you took the Standard there or when the search gave up; whether a creator code you entered was accepted or refused (never the code itself); and the first time you open the Adventure, Hall and Hero tabs and Free Training.
- What each record holds: a code for the step, how many seconds had passed since the previous step and since the first one, for some steps one small code of detail (for example whether you left a fight or its time ran out, or how many seconds into your first fight something happened), the app build, and that it came from the iPhone app. Numbers and codes only: no video, no images, nothing you typed and no device model.
- How it is labelled: with a random identifier that the app makes up on your phone when it records the first step. It is not your Apple ID or an advertising identifier, it is not read from your phone, and it is not part of your cloud save. It labels these records, and on your device it also decides which of two versions of the practice step you see while we are comparing them; it is used for nothing else. Until you have an account, a record carries that random identifier and no account, name or email.
- Once you have signed in or continued as a guest, the records the app sends also carry your account identifier (a guest has one too). The earlier records carry the same random identifier, so from that moment they can be connected to your account as well.
- When it stops: once the hero on your phone has defeated three foes, or 14 days after the first record, whichever comes first, and never more than 60 records for one installation. Signing in to an account whose hero has already defeated three foes stops it as well, as soon as that hero is restored to your phone; what was recorded before that moment is kept like any other record. If you updated to version 2.6.0 with such a hero already on your phone, nothing is recorded at all.
We use these records to see where new players stop during setup and in their first sessions. They are kept on our own servers (hosted by Supabase) and are not sent to Singular. Each record is deleted once it is 30 days old, by a clean-up that runs every night. If you delete your account, the records that carry your account identifier are deleted with it straight away; records sent before you had an account carry only the random identifier, and go when their 30 days are up.
Automatic crash and freeze reports (iPhone, from version 2.5.10). When the iPhone app crashes, freezes, or is closed by iOS (for example for using too much memory), iOS can give the app a short report about it the next time you open it. iOS also gives the app a daily count of how it closed, on ordinary days too. The app sends us a few numbers from these reports, without asking you each time:
- For a crash or a freeze: whether it was a crash or a freeze, the app build it happened in, codes for the kind of error (for example “invalid memory access” or “stopped for not responding”), how long a freeze lasted, and where in our own program it happened, as a position in the app’s program file. From version 2.6.1, also two codes: which screen of the app was open (for example a fight, the home screen or the membership screen), which the app notes on your iPhone each time the screen changes; and, when the problem was not in our own program, which part of iOS the app was inside (for example the camera or the screen-drawing system), or that it was inside a third-party component built into the app.
- Once a day, whether or not anything went wrong: how many times the app closed normally, ran out of memory, crashed, or was stopped for not responding, counted separately for while it was on screen and while it was in the background, and in which app build. For the background, also how many times iOS closed it for holding on to a file while it was paused, or for running a background task for too long.
Nothing else from these reports is sent: not your device model, not your iOS version, not your region, no error message text and nothing from the app’s memory. Like the usage events, these are numbers and codes linked to your account, with your device’s performance tier, the app build and whether you are on iPhone or Android. We use them only to find and fix crashes. They are deleted after about a week, or straight away if you delete your account; after that only daily totals with no account attached remain. The full report stays on your iPhone.
When we ask you how many you actually did. Every so often, after a session in which the camera ran for at least 40 seconds, the app shows how many reps it counted and asks whether that is right. If you say no, it asks how many you actually did. It asks at most once a day on each device, and whether it asks has nothing to do with how the set went. If you answer, we store the number the camera credited, your answer (the same number, if you said it was right), how many reps it refused, how long the camera was running, which movement it was and which screen you were on, along with your app version, attached to your account. For push-ups we also store two measurements of how you appeared in the frame, the width of your shoulders and the length of your torso as a share of the picture, which show roughly how the phone was placed. That is the whole record: no video, no images, no joint coordinates, no free text, and nothing you typed beyond the number. Answering is optional and skipping it changes nothing. We use it to measure how often the detector disagrees with the person actually doing the reps, which is the one thing the camera cannot tell us by itself.
Automatic error reports. Also without asking you first, the app records a short note when something fails in a way it recovered from quietly, such as a camera session that was interrupted or a save that had to be retried. Each note is a short label for what happened, a technical detail such as an error code, your app version and your account, and at most one of each kind is recorded per hour. On Android, when the camera itself fails, the note also names your phone’s manufacturer and model and its Android version, because camera faults depend on the hardware. Our servers write a note of the same shape in four situations, and those carry more: renaming a guild you captain records the old and new names, so a moderation takedown has a trail; a day's reps going past the leaderboard cap records that day's count and your lifetime total; and a friend addition that trips our flood or consent checks records both players' account identifiers, on the account that made the addition; and a save that tries to raise your lifetime totals faster than our servers allow may be recorded, at most once in any 20 hours, with how many reps were held back from that save, the allowance that was available, how long it had been since your profile was last updated, and your lifetime push-up and squat totals. These notes contain no video, no images and no location. Each is deleted when the account it is recorded on is deleted.
Apple Health (iPhone only, optional)
Only pushup and squat sessions are written to Apple Health — sit-ups and planks are not, and nothing about them reaches Health at all. If you turn on Sync to Apple Health in Settings, Pushup RPG saves your battles and practice sessions to Apple Health as workouts, with your rep count, and an estimate of active energy if you allow it in Apple Health. This is opt-in and write-only: we only add workouts to your Health data — we never read any of your health information, it never leaves your device to our servers, and we never sell it, use it for advertising, or share it. You can turn this off anytime in Settings, and manage or delete the data in the Health app.
Accounts and cloud sync
To back up your progress across devices and to power the friends leaderboard, the app uses a cloud account (provided by Supabase). You can sign in with:
- Sign in with Apple, Google, or email (a one-time code / magic link),
- a Solana wallet, in the Solana dApp Store edition. See Solana wallet below. Or
- Continue as a guest — an anonymous account is created so your save still backs up, with no name or email attached.
Sign in with Apple is available on iPhone only, and Google sign-in on iPhone and in the Google Play edition.
What we store on your account:
- Game progress — level, XP, streak, gear, currencies, settings, lifetime reps.
- Profile — the display name you choose, a randomly generated friend code, your level, class, portrait, current streak, and your push-up and squat counts for today, for this week and in total. Friends you add, and anyone who looks you up by your friend code, receive this profile, including today’s reps and your lifetime totals — see Friends below. The members of any guild you join see part of it — see Guilds below.
- Contact identifier — if you sign in with email, your email address; with Apple or Google, the identifier they return. Used only to authenticate your account.
- A push token, so the app can send you notifications. See Notifications below.
- Your Solana wallet address and payments in SOL, in the Solana dApp Store edition. See Solana wallet below.
- Your avatar photo, if you are a Vigil member and chose to upload one. See Your avatar photo above — it is public to other players.
- Detection diagnostics, if you sent a report. See Diagnostics you choose to send.
- Hall chat messages and hall moments, if you are in a guild and its chat is open. See Hall chat below.
We do not collect contacts, and no health/fitness data beyond the rep counts that are part of your game progress. The app never asks for GPS or precise location, and there is no location permission prompt. There is one coarse exception, and we would rather name it than bury it: your country is derived on our server from the IP address your device connects from, so that country leaderboards can exist. Your country below explains exactly what is stored and what it is used for.
Solana wallet (Solana dApp Store edition)
The edition of Pushup RPG sold in the Solana dApp Store lets you sign in with a Solana wallet and pay for Vigil in SOL. If you use either:
- Your wallet’s public address is stored on our servers, linked to your account, so the same wallet always returns to the same account and a payment can be matched to the player who made it.
- An account made from a wallet. If you have no account yet, signing in with a wallet creates one. Inside our system it is identified by an address at wallet.pushup.quest derived from your wallet’s public key. No mailbox exists behind it, and we never send mail to it.
- For each payment in SOL, we store its transaction signature, the amount, the plan and when we redeemed it, so that we can grant and restore your membership.
- To sign in, you sign a one-time message in your wallet app. We check the signature, then keep a hash of that message together with the wallet address and the time, so the same message can never be used to sign in again.
- Stopping scripted sign-ups. Anyone can create Solana wallets for free, so to stop a script from making unlimited accounts, our server keeps a one-way hash of the internet address a wallet sign-in came from, salted with a secret only our server holds, and counts how many accounts that hash has created. It cannot be turned back into an address, it is never stored on your profile, and it is deleted after 24 hours.
- We never receive your private key or your recovery phrase. Your wallet app does all the signing, so the app cannot move funds on its own.
- Payments are public. Anyone can see a transfer on the Solana blockchain, including one between your wallet address and ours. We do not publish which account a wallet belongs to.
- Confirming a payment. To check that a payment landed, the app and our server look it up on the Solana network through an RPC node, a server that answers questions about transactions. It receives your wallet address and the transaction signature. We read nothing else from your wallet’s history.
This edition includes neither RevenueCat nor Singular. It uses push notifications the same way as the Google Play edition (see Notifications).
Google ML Kit. Like the Google Play edition, this edition includes Google’s ML Kit; see Google ML Kit.
Notifications
To send you notifications, the app needs a push token: an identifier that Apple (on iPhone) or Google (on Android) issues so that a notification can reach the app on your phone. The app stores it on our servers against your account, a guest account included, together with which platform it came from, when it was last registered and, from recent versions of the iPhone app, the app version. On iPhone, the app only asks Apple for a token after you have allowed notifications.
We use it to tell you when a friend cheers you on or challenges you to a duel, when a referral you made pays out, when your streak is about to lapse, when another player starts searching the Arena while you are waiting in it, if you run a guild, when someone applies to join, and, on iPhone, once when the App Store tells us a payment for your membership did not go through. Hall chat sends no notifications. If a different account later signs in on the same phone, the token moves to that account. When Apple or Google tells us a token no longer works, we delete it. You can turn notifications off at any time in your phone's settings.
The Solana dApp Store edition uses push notifications the same way, through Google, on phones that have Google Play services; on a phone without them it cannot receive push notifications and no push token is created. The first Seeker build sent to the dApp Store used no push notifications at all. The Seeker edition also sets one reminder on your phone itself, two days before a pass paid in SOL ends.
Install measurement
The iPhone app includes Singular for install attribution and product analytics. (Versions of the iPhone app before 2.6.2 used AppsFlyer for the same purpose, and keep sending it the same kinds of events until they are updated.) The Android app contains no Singular and no other install-attribution service. It is not limited to aggregate counts, and we would rather describe it accurately than reassure you: alongside Apple’s SKAdNetwork, the app sends Singular an event stream tied to your account:
- when the app is installed and opened;
- the setup screens you reach, whether you allowed notifications and camera access, and your answer to “where did you hear about us?”;
- your first defeated foe, your first victory and the levels you reach;
- when you open the membership screen and when you close it without buying;
- trial starts and completed purchases, with the product and Apple’s transaction id — not the amount and not the currency;
- when you accept the suggestion to resize your foes to a smaller set of push-ups.
With these, Singular’s software sends what it reads from your phone: Apple’s identifier for this app on your device (the IDFV, which is not the advertising ID), an identifier Singular makes for this installation, your device model and iOS version, the IP address and browser-style “user agent” of the connection, and Apple’s ad-attribution token (from which Apple tells Singular whether you came from an Apple Ads campaign). Your Pushup RPG account id is passed to Singular as the customer identifier, so those events are linked to your account rather than being anonymous.
To tell which campaigns paid for themselves, RevenueCat (below) also sends Singular your trial starts, purchases, renewals and refunds with their amounts, matched by Singular’s identifier for this installation. The amounts come only from RevenueCat; the app itself sends Singular none.
We also use RevenueCat, on iPhone and in the Google Play edition, to manage subscriptions and entitlements. It receives your account id and your purchase and subscription history, and our server asks it whether your account has an active membership.
When Apple or Google reports that a payment for your membership failed, RevenueCat tells our server, and we keep a record of it against your account: when it happened, which store and plan, until when your access lasts, whether we sent you a notification about it, and how it ended (the payment went through, or the access ended). The record is deleted when you delete your account.
What we can still tell you plainly: the app never shows an App Tracking Transparency prompt and does not use the ATT advertising identifier, the Android app does not use Google’s advertising ID either, and there are no ad-serving SDKs — you will not see ads in Pushup RPG. We do not sell your data. Singular is nonetheless an attribution vendor with its own tracking capabilities, so if that matters to you, treat this as a real third-party disclosure rather than a formality.
Creator codes
Some players come to Pushup RPG from a creator who makes videos about training. If you enter a creator’s code in the app, we record which creator referred your account, and we attach the code to your purchase record at RevenueCat (as an attribute called creator_code) so the creator can be paid a share of what we receive from your purchases. Entering a code is optional, it does not change any price, and it can be done once, within your first 7 days. A code can be entered on iPhone only, from version 2.6.2; the Android app does not offer this yet.
Creators see only counts and earnings, never who you are. A creator’s dashboard shows how many accounts entered their code, how many started a trial or paid, and what they earned each month. It shows no name, account, email or individual purchase.
- The app records whether a creator code you entered was accepted or refused (never the code itself).
- To stop codes being guessed, each refused try is noted against your account (the time only, not what you typed) and deleted after 2 days.
- If you buy something, start a free trial or get a refund in your first 7 days before entering a code, we keep that record (the store, product, price and store transaction numbers; no name or email) so a code entered later still counts it. We do this for every account in its first 7 days, on Android as well as iPhone. It is deleted as soon as you enter a code, or within a day or two after your first 7 days are over.
- If you delete your account, the link between your account and the creator is removed. The creator keeps the count and their earnings, and our records keep the store transaction numbers needed to match a later refund, but nothing in them points to your account any more. The
creator_codeattribute stays with your purchase record at RevenueCat, which deleting your account does not remove; the deletion page explains how to have that removed.
If you apply to be a creator on this website, we keep what you send us (your name, social handles, audience size, country, payout email, the code you asked for, and the note, if you added one) to review your application and, if you are approved, to run your page and pay you. Your IP address is used to limit repeated applications and is kept only as a one-way scrambled value, for 2 days. An application we turn down is deleted after 180 days. An approved creator’s details are kept while they are in the programme, and after it ends for as long as we need them to settle earnings and for tax and accounting records. The code stays reserved so no one else can take it.
Friends
Adding a friend is mutual and is done by exchanging friend codes. A friend code only resolves to a profile when entered exactly — profiles cannot be browsed or listed. Removing a friend removes the connection for both people and revokes their access to your profile.
What a friend can see. The app on a friend’s phone receives your whole profile: your display name, friend code, class, level, portrait (and your avatar photo, if you uploaded one), the flag you picked, whether you are a Vigil member, the name of your guild, your current streak, and your push-up and squat counts for today, for this week and in total since you started. Their friends board shows your counts for today and this week, and your lifetime totals. Anyone who enters your friend code to look you up receives the same profile, before you are friends. It also carries some things the app does not display: your country code (see Your country), when your profile was last updated (which is roughly when you last played), and a few technical values, such as the ones our server uses to check your totals. Someone you have blocked, or who has blocked you, cannot find you by your code.
Guilds
You can join a guild — a small team that shares a weekly goal — or, with a Vigil membership, create one. This makes some information visible more widely than Friends:
- Your place on the roster is visible to the other members of any guild you join, who may not be your friends: your display name, class, level, portrait, streak, whether you are a Vigil member, your push-ups today, your push-ups and squats this week, your role and when you joined.
- A guild name and motto you create, and the guild names shown in the public browse directory, are visible to all players and may appear on images you choose to share.
- The hall log (iPhone, from version 2.5.9). The members of your guild see a log of the past week in the hall: your push-up and squat total for the week, when you joined, when you landed the blow that felled the weekly boss, when you cheer another member, and whom, and each gift of gold you give to the hall, with its amount (until now only the hall’s totals and your own share were shown). Only current members appear in it, only for what they did after joining — a cheer appears only if both of you were already members — and someone you have blocked, or who has blocked you, is left out of your log. Nothing new is collected: the log is built from records the guild already held, and it cannot be seen from outside the guild. A guild’s level, which rises with the gold its members give, is shown to all players on the guild ladders.
- Content moderation. Guild names/mottos, display names and avatar photos are all content players create, and so are hall chat messages. Names and chat messages are filtered against a blocklist, and avatar photos are screened on-device before upload by Apple's analyser, which catches sexually explicit imagery — other objectionable content, including a photo of someone who did not consent, is caught by the report path rather than the filter. You can report an offensive name, picture or chat message from inside the app — the ⋯ button beside any player, on every screen that shows one, and beside each chat message. The same ⋯ menu lets you block that player, or unblock one you blocked (Settings lists them too): we keep a record of whom you blocked and when, no other player can read it, and it is deleted when you unblock them or when either account is deleted. We review reports and remove violating content, and may remove an offending account's ability to upload a picture at all — there is zero tolerance for objectionable content.
Hall chat (iPhone, from version 2.6.3)
The members of a guild can write to each other in its hall. We switch hall chat on from our server, so it may appear some time after you update, and in some guilds before others. While it is on:
- What we store. For each message: its text (at most 280 characters), the account that wrote it, the guild it was written in and when, and a random identifier the app makes for each message so that a retried send is not stored twice. For each reader we also keep the last message they have read and when they last opened the chat, so the app can show how many lines are new.
- Who can read it. The current members of that guild, a guest member included. Each line shows its writer’s display name and portrait (or avatar photo) beside the text. Someone who joins later can read the lines written before they joined, for as long as those lines are kept. Nobody else can read a hall’s chat in the app. Messages are stored on our servers and are not end-to-end encrypted, so we can read them, for example to judge a report. The app does not keep chat lines on your phone.
- Who can write. A signed-in account, not a guest, that is at least a day old or has counted 50 reps.
- The word filter. A message containing a word on our blocklist, in any alphabet, a link or web address, an email address or a phone number is refused, and not stored. We never rewrite what you wrote.
- Blocks hide both ways. If you block a player, or they block you, neither of you sees the other’s messages or hall moments, and they are not counted as new. The other player is not told, and neither of you is stopped from writing.
- Deleting messages. You can delete your own messages, and the captain of a guild can delete any line in its chat. A deleted line’s text is removed at once, and the rest of its record within two days.
- How long it is kept. Every line is deleted 30 days after it was written, by a clean-up that runs every night. If you leave the guild, the messages you wrote stay in its chat until then, shown as written by a “Former member”, without your name or picture.
- Reports. Members can report a message from its ⋯ menu, choosing a reason. The report keeps who made it, the reason and a copy of the message’s text, so that we can judge it even if the message is deleted meanwhile. That copy is erased by the nightly clean-up once we have decided the report, and after 90 days at most. While a report is open, the reported message’s record (who wrote it and when) is kept even past its 30 days or after it was deleted, without its text.
- Chat bans. We can stop an account from writing in hall chat. A chat ban is kept as a record of abuse: the account identifier, when the ban was imposed and when it was lifted, and a short note we wrote. It is not deleted when the account is deleted.
- No notifications. Hall chat sends no push notifications.
Hall moments. The chat also shows short lines our server writes on its own about what the guild’s members do, so that a quiet hall still has news. They are built from records we already hold; nothing new is collected.
- About you: reaching 50, 100 or 200 push-ups in a day, or as many squats; a training streak of 7, 14, 21, 30, 50, 75, 100, 150, 200, 250, 300 or 365 days; and joining the guild. Each shows your display name and portrait. At most two are written about one member in a day.
- About the guild: the weekly boss falling, and the guild reaching its weekly goal. The top of the chat shows the members’ push-ups and squats this week against that goal.
- Turning yours off: Settings → Share my milestones in hall chat. It is on until you turn it off. Off, no new line is written about you and the ones already written are hidden. The setting is shown while hall chat is available to you, and only the iPhone app, from version 2.6.3, has it. So lines about a member are written only about members whose app has the switch (the iPhone app from version 2.6.3), and none are written about players who use only another app or an older version. We tell from the app version your app reports when it opens (see automatic usage events), or from your having set the switch.
- Hidden when you leave the guild, and from anyone you have blocked or who has blocked you.
- They are written for every guild even before its chat is open, so a chat can open with up to 30 days of moments already in it.
- They are kept like messages: deleted after 30 days, and a captain can delete one. So that a milestone is never announced twice, we keep a note of which milestones were announced (or passed over) for each member: for 40 days, or 400 days for a streak milestone.
Deleting your account deletes your messages, the moments about you, your read position, your milestones setting and those notes at once. Two things stay: the copy of a message of yours that someone reported, until the report is decided (at most 90 days), and a chat ban, as above.
Your country
Country leaderboards need to know which country you belong to. Two separate things do that, and only one of them involves your IP address. (The Solana dApp Store edition uses it once more, briefly and hashed, to stop scripted sign-ups; see Solana wallet.)
- A country code we derive (not chosen by you). When your profile is written, our server reads the two-letter country code that our network provider attaches to the request — a value derived from the IP address your device is connecting from — and stores that code on your profile. Your IP address itself is not stored on your profile; only the two-letter country code. (Every internet service processes IP addresses in order to route traffic at all, and our hosting providers are no exception.)
- It is recorded once and never updated. The first value seen is kept, and later connections do not move it. That is deliberate: re-reading it on every write would turn a single coarse attribute into a running record of where you have been, and we did not want to hold that. The practical consequence is that it reflects where you were when you first played — a VPN, a trip or a move will not change it, and you cannot edit it. It is deleted with your account.
- Where it is used. It decides which country's leaderboard you appear on, and it can be counted in country-level figures we publish, which never identify you (see Statistics we publish). If your country cannot be determined — including connections our provider reports as unknown, and traffic arriving over Tor — nothing is stored, and you simply do not appear on a country board.
- A flag you pick (optional). Separately, you can choose a flag in the app. That one is your choice, it is shown publicly next to your name, and you can change or clear it whenever you like. We suggest a likely country when you open the picker, but nothing is saved unless you tap it.
Live duels and the Arena
You can duel a friend, or enter the Arena and be matched with another player you have not met. There is no chat and no messaging in a duel — two cameras and a timer.
- While you are searching, we hold a short-lived queue entry with your account id, your level and which exercise you picked, so the matchmaker can pair you with someone at a similar level. It is removed the moment a match is made, and it is ignored after 90 seconds.
- During a bout, your opponent sees your display name, class, level, your portrait or avatar, and your rep count as it climbs. They do not see your camera: pose detection stays on your device, and only the number of reps is sent. Nothing about your opponent's video reaches you either.
- Blocking. You can block a player from the result card. We store that as a pair of account ids and the time it was made, and it stops the two of you being matched again. You can undo a block you made, from Settings — you cannot remove someone else's block on you, which is the point of the feature.
- Reporting. Reporting a player sends their account id and your reason to our moderation queue, along with context we use to judge the report — their level, lifetime reps, best day, and how deep they have gone in Endless Descent. See Content moderation above for how reports are handled.
- Recording a bout is optional and off by default. A clip stays on your device until you choose to share it. See Clips above.
- What we keep after a duel. For each duel against another player we keep both scores, the exercise, when it ended, who the two players were, and whether it was an Arena match or a duel between friends.
- Your duel record (iPhone, from version 2.5.11). We use those results to match you in the Arena with players of a similar level and to show you your own duel record: how many Arena duels you have won, lost and drawn, and your latest twenty, with each opponent’s display name beside the score. Your opponent sees the same about you. Nobody else can see your record. The app keeps a copy of your own record on your phone so it can be shown before the server answers; that copy is removed when you sign out or delete your account.
- How long duel results are kept. Until you delete your account. Deleting it removes your results, and the record we keep for your opponents then shows the score of their duels against you without your name. A duel from the last few days is removed for both of you.
- One copy is not removed. Every player’s saved game, on their phone and in their cloud save, lists their own last twenty duels of any kind, each with the opponent’s display name as it was at the time (its first 16 characters) and the score. An opponent’s saved game can therefore still hold the name you had, until twenty newer duels of theirs replace it. Other versions of the app show that list as the duel history.
Data we share
We do not sell or share your data with advertisers or data brokers. Your profile is shared with the friends you add and the members of any guild you join, and a guild name or motto you create, and an avatar photo you upload, are public to other players. Your hall chat messages and the hall moments about you are shown to the members of your guild (see Hall chat). Be aware it also goes wider than that: if you rank on the worldwide daily or weekly rep ladders, on your country's ladder, or on the Endless Descent board, your display name, class, level and the ranked figure are visible to every signed-in player — together with the flag you picked, if you picked one. Entering the Arena shows your display name, class, level and portrait to the player you are matched with; see Your country and Live duels and the Arena above. Three processors handle data on our behalf: Supabase (hosting, accounts and cloud saves), RevenueCat (subscriptions and entitlements — it receives your account id and purchase history), and Singular (install attribution and product analytics, on iPhone only — see Install measurement above for what it receives; iPhone versions before 2.6.2 used AppsFlyer instead). The Solana dApp Store edition includes neither RevenueCat nor Singular. When you pay in SOL there, the app and our server send your wallet address and the transaction signature to a Solana RPC node to confirm the payment; see Solana wallet. On Android, Google’s ML Kit sends Google usage and diagnostic information about itself; see Google ML Kit.
Statistics we publish
We may publish figures calculated across many players, such as the total number of push-ups counted in the app, or how players in different countries compare. A published figure never includes your name, your account or anything else that identifies you, and we do not publish a figure about any group of fewer than 30 players, because a figure drawn from that few people can amount to one person's result. This is separate from the leaderboards, which do show individual players, as described under Data we share above.
Who is responsible for your data
Pushup RPG is made by Yerasyl Amanbek, who is the data controller for the information described on this page. The contact address is support@pushup.quest, or use the contact page and put Privacy in the subject.
Your rights over your data
If you are in the UK or the EEA, data protection law gives you the rights below. We apply them to everyone, wherever you live, because splitting them by country would be more work than honouring them.
- Access. Ask what we hold about you and we will send it.
- Rectification. Correct anything wrong. Your display name and flag you can change yourself in the app.
- Erasure. Delete your account from Settings → Delete account, or ask us. Read Deleting your data below first, because a few records survive and we would rather you knew which.
- Portability. Ask for a copy of your account data in a machine-readable format.
- Objection and restriction. Object to, or ask us to pause, processing that rests on our legitimate interests.
- Withdrawing consent. Where something is optional and you turned it on, you can turn it off: clip recording, the avatar photo, sending a detector report, and Apple Health.
- Complaint. You can complain to your national data protection authority. In the UK that is the ICO; in the EEA it is your country's supervisory authority. We would rather you told us first, but you do not have to.
We will not charge you for any of this and will not make you justify the request.
Why we are allowed to process it
- Running your account, syncing progress, friends, guilds, hall chat, duels and leaderboards — performance of the contract you enter when you create an account and play.
- Hall moments — legitimate interests in giving a guild news of what its members do. You can turn yours off in Settings (iPhone, from version 2.6.3).
- Deriving your country from the connecting IP address — legitimate interests, so that country leaderboards can exist. The IP itself is not stored on your profile.
- Install measurement and product analytics — legitimate interests in understanding which channels bring players and which features get used.
- Including Google’s ML Kit in the Android app — legitimate interests in counting reps with an on-device pose detector. The usage metrics it sends go to Google, as described under Google ML Kit.
- Automatic usage events, first-steps records, camera-session summaries, crash and freeze reports and error reports — legitimate interests in finding what is broken and which parts of the app work.
- Purchases, entitlements and accounting records — performance of the contract, and our legal obligation to keep records of sales.
- Creator codes: recording which creator referred your account, and keeping the record of a purchase, free trial or refund from your first 7 days until you enter a code — legitimate interests in paying creators their share of what the players they brought us spend, including a purchase made before the code was entered.
- Creator applications, creators’ pages and payouts — performance of a contract (reviewing an application is a step the applicant asks us to take before entering it), and our legal obligation to keep tax and accounting records of what we pay.
- The scrambled internet address kept with a creator application — legitimate interests in stopping anyone from sending applications without limit.
- Push tokens and notifications — legitimate interests in reaching you about your game, such as a friend's challenge or a streak about to lapse. You can turn notifications off in your phone's settings.
- Statistics published across many players — legitimate interests in reporting what players achieve, limited as described under Statistics we publish.
- Security, anti-abuse and moderation — legitimate interests in keeping the boards honest and players safe.
- Keeping SOL payment and wallet sign-in records after an account is deleted — legitimate interests in making sure the same payment or sign-in can never be used twice.
- Counting wallet sign-ups per hashed internet address — legitimate interests in stopping scripts from creating accounts without limit.
- Clip recording, the avatar photo, detector reports and Apple Health — your consent, given by turning each one on, and withdrawable by turning it off.
How long we keep it
- Your account and game data — until you delete the account. We do not expire accounts for inactivity.
- Detector reports you send — kept while we investigate the counting problem they describe, then deleted.
- Usage events, camera-session summaries and crash and freeze reports — about a week, then deleted. Only daily totals with no account attached are kept after that.
- First-steps records — 30 days, then deleted.
- Hall chat messages and hall moments — 30 days, then deleted. The notes of which milestones were announced — 40 days, or 400 days for a streak milestone.
- The copy of a reported chat message — until we decide the report, and 90 days at most.
- A chat ban — kept after the account is deleted, as a record of abuse.
- Purchase and entitlement records — kept after deletion for as long as accounting and tax rules require.
- Which creator referred your account — until you delete the account. The creator records that come from it are kept after deletion, with no player id or anything else that points to your account: the creator’s count of accounts that entered their code, their earning lines, and the store transaction numbers behind them, for as long as we need them to pay creators, match a later refund, and keep accounting and tax records.
- A purchase, free trial or refund held in your first 7 days — until you enter a creator code, or a day or two after your first 7 days are over.
- A refused creator code try — 2 days.
- Creator applications — 180 days for one we turn down. An approved creator’s details are kept while they are in the programme, and after it ends for as long as we need them to settle earnings and for tax and accounting records. The scrambled internet address kept with an application is deleted after 2 days.
- The referral anti-abuse hash — kept after deletion by design, because its whole purpose is to stop the same device claiming a referral repeatedly. It is one-way and cannot be turned back into a device or an account.
- SOL payment and wallet sign-in records (Solana dApp Store edition) — kept after deletion, with no link to your account, because their only purpose is to stop the same payment being redeemed twice or the same sign-in being replayed. The payments themselves stay on the Solana blockchain, where nobody can delete them.
- Hashed internet addresses from wallet sign-ins (Solana dApp Store edition) — deleted after 24 hours. They are never linked to an account.
Where your data goes
The processors we use are named under Data we share: Supabase for accounts and cloud saves, RevenueCat for subscriptions and entitlements, and Singular for install measurement (AppsFlyer for iPhone versions before 2.6.2). Apple and Google hold your purchase records because they take the payment. A payment in SOL is recorded on the Solana blockchain, which is public and outside our control.
These are international services, so your data may be processed outside the country you live in, including outside the UK and the EEA. Each of them publishes its own data-processing terms and transfer safeguards, which are linked from their own sites.
Deleting your data
You can delete your account at any time from Settings → Account → Delete account. That removes your profile, cloud save, avatar photo, leaderboard entries, friend connections, duel results, and your hall chat messages and the hall moments about you from our servers (what an opponent’s own saved game can still hold is described under Live duels and the Arena). A few things survive by necessity — a one-way referral hash, purchase and entitlement records held for accounting, the creator records described under Creator codes (a creator’s count of the accounts that entered their code, their earning lines and the store transaction numbers behind them, with no player id), any anti-abuse record (a hall chat ban among them), and, until its report is decided (at most 90 days), the copy of a chat message of yours that someone reported — and records held by Apple, Google Play, RevenueCat, Singular and AppsFlyer are not ours to delete. The deletion page lists each one and how to reach those providers. Uninstalling the app removes the local copy on your device.
In the Solana dApp Store edition, deleting your account also removes your wallet link and your pass. We keep each redeemed payment’s transaction signature, amount, plan and time, and the wallet sign-in records described under Solana wallet, with no link to any account, only so that the same payment or sign-in can never be used twice. Transactions on the Solana blockchain cannot be deleted by anyone, including us.
Children
The app is designed for general audiences. Account creation (and therefore the social features) is intended for users able to consent under their local law; younger players can use the app fully in guest mode.
Android beta waitlist (closed)
Pushup RPG is now released on Google Play, so the Android beta waitlist is closed and we are no longer collecting emails for it. If you signed up while it was open, we stored only your email address in order to send you a single notification, and it was never used for anything else, sold, or shared. You can have it deleted at any time by emailing support@pushup.quest.
Website analytics
This website uses privacy-friendly, cookieless analytics (Vercel Web Analytics) that count aggregate page views. It sets no cookies and builds no advertising profile.
Advertising measurement on this website
If we are running ads, we need some way to tell which ones actually bring people here. We ask first. When advertising measurement is switched on you will see a banner offering Accept or Decline, and nothing is set until you choose Accept. Declining costs you nothing: every page works identically either way.
If you accept, we load tags from Google Ads and Meta. These are ordinary advertising trackers and we would rather say so plainly than call them something softer: they set cookies, they can recognise you on other websites that use the same networks, and they let us see that someone who clicked an ad went on to open the App Store link. They do not receive your name, your email, your account, or anything you do inside the app.
Your choice is remembered in your browser, not on our servers, and it applies until you clear your browser storage. To change it, clear site data for pushup.quest and the banner returns. If you never see a banner, no advertising tag has been loaded at all.
None of this applies to the app. Advertising measurement described here is a website matter only. What the app collects is described above, under Install measurement.
Contact
Questions or data requests: support@pushup.quest