The short version: PullUpLeague counts your pull-ups with your iPhone’s camera, and the counting runs on your iPhone. Video and camera frames never leave it. The app works fully without an account. If you sign in with Apple to join a crew, send or answer a callout or enter a board, the league’s server keeps what those features need: your card, your counted sets (with their city and spot, never coordinates) and your crews and callouts. The app also sends a small set of usage events and crash reports, tied to a random analytics ID, so we can see whether the app works. No ads, no tracking, and we never sell data.
This policy covers the PullUpLeague app for iPhone (the “App”) and this website, pullup.getcorpus.app (the “Site”). Both are run by Felipe Passos, an individual in Brazil (“we”, “us”), who is the controller of the personal data described here. Contact: pullup@getcorpus.app.
1. On your iPhone
Counting happens on your iPhone. The App reads the camera’s frames on the device, finds the 19 joints of your body in each frame and judges every rep there. No video, photo or camera frame is ever recorded to the server or sent anywhere.
The App keeps on your iPhone:
- your sets, each with its reps and verdicts and a replay of the skeleton (joint positions over time, never video);
- your athlete card, records, achievements, editions, program, objectives, weekly goal and streak;
- your answers from onboarding, including your sex and body weight if you chose to give them (they’re optional and only used to compare your max with published norms), and your settings.
You can export everything with Settings › Account › Export data, and erase it with Settings › Account (Erase your data, or Delete account when signed in). Your iPhone’s own backups include the App’s data.
A few small items are kept in your iPhone’s Keychain, which iOS usually keeps even after an app is deleted: the analytics ID (section 6), your sign-in session, and the count of this week’s free sets (so deleting the App doesn’t reset the week).
2. Your account and the league’s server
You don’t need an account to count sets, see your card or use your history. You sign in, with Sign in with Apple only, when you first join a crew, send or answer a callout, or enter a board.
- Sign in with Apple: we ask Apple for your name only, never your email address. Your name becomes your card’s display name, which you can change. To be able to revoke the App’s access when you delete your account, the server keeps a token from Apple, encrypted.
- What the server keeps once you’re signed in: your card (display name, country flag, crew, rating, tier, edition, six stats and a portrait of 19 joint positions taken from your best rep); your counted sets (the count and the timing of each rep, the mode, the date and time, and the city and spot, if location is on); your training days and weekly goal; your crews and their members; your callouts; any report you send (with its optional note); and, if you allow notifications, your iPhone’s notification token, language, time zone and notification choices.
- Checks against cheating: submitted sets are checked for plausibility, and the App uses Apple’s App Attest so the server can tell a set came from the genuine App. App Attest gives the server a key identifier for your copy of the App, not your identity.
- Where it’s stored: the server runs on Supabase, in Amazon Web Services’ us-east-1 region (Virginia, United States).
What other people see
The league is social, so some of this is shown to other people:
- Boards (crew, friends, city, country, world) show your display name, flag, card, rating and counted results, with dates but never times of day. City and spot boards show the city’s or spot’s name.
- Crews show their members’ names and cards to each other.
- Callouts: anyone with a callout’s link can see the challenger’s card (display name, flag, tier, rating, edition, stats and portrait), the number to beat and when it ends, in the App and on the link’s page on this Site.
You can report and block people from the App. We review reports and may remove names, sets or accounts that break the Terms.
3. Location
Location is optional and asked for only after your first counted set (or from Settings › Location). If you allow it, the App uses Apple’s MapKit on your iPhone to turn your position into a city and, when you’re at a known public place with a bar, that spot’s identifier and name. Only the city and the spot are kept and sent. We never store or send coordinates, and a home is never a spot. Apple handles the lookup under its own privacy policy. You can turn location off at any time in Settings.
4. Notifications
If you allow notifications, the server uses your notification token to send league news through Apple’s Push Notification service: a crewmate passing you, a new callout, a callout answered, the week opening and closing. You choose which ones in Settings. Turning notifications off in iOS stops them.
5. Purchases
PullUpLeague Pro is sold through Apple’s App Store. Apple handles payment; we never see your payment details. To unlock Pro and keep it in step across your devices, the App uses RevenueCat, which receives your purchase history, the App’s analytics ID (as RevenueCat’s user ID) and your iPhone’s identifier for vendor (Apple’s per-developer device identifier). RevenueCat sends us what happens to a subscription (a trial starting or converting, renewals, cancellations, billing problems and revenue) through our analytics, under the same analytics ID. RevenueCat is based in the United States.
6. Usage analytics and crash reports
To know whether the App is used, whether people subscribe and whether they get through its steps, the App sends a fixed set of events to PostHog, using its servers in the European Union (Frankfurt, Germany), plus crash reports through PostHog’s error tracking. Events never include names, rep counts, results, ratings, places or your onboarding answers.
Each event carries technical details: the App’s version and build, the iOS version, the device model, your language and region settings, the time zone, the App Store country, whether it’s a TestFlight build, and a random ID for the session. Once after install, the App also asks Apple’s AdServices framework whether the install came from an Apple Ads campaign and records the answer. This doesn’t use your device’s advertising identifier and isn’t tracking.
Events are grouped by a random analytics ID the App creates on first launch and keeps in the Keychain. It isn’t an account, your name or an advertising identifier; it’s also the ID Apple and RevenueCat see on your purchases, so purchases can be matched with usage. Settings › Privacy shows it. PostHog receives your IP address as part of any internet request; our PostHog project is set to discard it, and location lookup from the IP is turned off. Only App Store and TestFlight builds send analytics.
7. This website
- Hosting: the Site is served by Cloudflare. Like any web host, Cloudflare processes your IP address and request details to deliver the pages and protect them from abuse.
- Analytics: the Site uses Cloudflare Web Analytics, which counts visits without cookies, without fingerprinting and without following you across sites. It records the page’s address, the referring site, your country and your type of browser and device. A callout or invite page’s address includes the link’s code.
- Callout pages: a callout link’s page asks the league’s server (section 2) for the challenger’s card. The server sees your IP address to limit how often it can be asked; it keeps only a keyed hash of it, for 7 days.
- Your browser keeps a cookie named
hlif you pick a language (for a year), and your sound choice if you turn sound on. Neither is used for anything else.
8. What we don’t do
- No ads, no advertising identifiers, no tracking across apps or websites, and we never sell or rent personal data.
- No video, photos or camera frames leave your iPhone.
- No coordinates are stored or sent.
- No session recording, screen recording or heatmaps.
9. Who processes data for us
- Supabase, Inc. hosts the league’s server and database (Amazon Web Services, us-east-1, United States).
- PostHog, Inc. receives usage analytics and crash reports and stores them in the European Union.
- RevenueCat, Inc. handles in-app purchase status (United States).
- Cloudflare, Inc. serves this Site and its analytics, and sits in front of the league’s server.
- Apple provides Sign in with Apple, the App Store and its payments, App Attest, push notifications and MapKit, under Apple’s privacy policy.
Some of these process data outside your country, including in the United States. Where a law such as the GDPR or Brazil’s LGPD requires it, those transfers rely on the providers’ standard contractual safeguards. Our legal basis is the performance of our agreement with you for the league features you choose to use, and our legitimate interest in keeping the App working, fair and improving, for analytics, crash reports and anti-cheating checks.
10. How long we keep it, and deleting it
- On your iPhone: until you erase it or delete the App (except the Keychain items in section 1).
- On the server: while your account exists. Callouts expire 14 days after they’re sent. Request logs used for rate limits (with a keyed hash of the IP address) are deleted after 7 days.
- Deleting your account: Settings › Account › Delete account deletes your account and everything the server holds about you, revokes Sign in with Apple, and erases the App’s data on your iPhone. Crews you started pass to their next member; answered callouts stay for the other person without your name. Deleting your account doesn’t cancel a subscription; manage that in your Apple Account settings.
- Analytics: events and crash reports are kept in PostHog for up to 7 years. To have them deleted sooner, email pullup@getcorpus.app with the analytics ID from Settings › Privacy.
11. Your rights
Depending on where you live, you may have the right to access, correct, export or delete your personal data, to object to or restrict some processing, and to complain to a data protection authority (in Brazil, the ANPD). Most of this you can do in the App: Settings › Account to export or delete, Edit card to change your name. For anything else, email pullup@getcorpus.app. We may need to confirm the request comes from you.
12. Children
PullUpLeague isn’t directed at children under 13, and you must be at least 13 (or older where your country requires it) to use it. If you think a child under 13 has given us personal data, contact us and we’ll delete it.
13. Changes to this policy
We may update this policy. We’ll change the date at the top and, for significant changes, tell you in the App.
14. Contact
Felipe Passos · pullup@getcorpus.app