Privacy Policy
Tóm tắt (Vietnamese)
BodyGame.fit là game thể dục chạy hoàn toàn trên trình duyệt của bạn. Camera của bạn không bao giờ rời khỏi thiết bị — AI đếm rep chạy local, video không gửi lên server. Khi bạn đăng nhập (Google hoặc Facebook), chúng tôi chỉ lưu: tên hiển thị, email, điểm số, và lịch sử workout — đủ để đồng bộ giữa thiết bị và xếp hạng leaderboard.
Summary (English)
BodyGame.fit is a browser-based fitness game. Your camera feed never leaves your device — pose detection runs locally in your browser. When you sign in with Google or Facebook, we only store: display name, email, scores, and workout history — enough to sync across devices and rank you on the leaderboard.
1. Who we are
BodyGame.fit ("we", "us", "our") is operated by Phong Tran (hi@bodygame.fit). The service is hosted at https://bodygame.fit/.
2. What data we collect
2.1 Data processed locally on your device (never sent to us)
- Camera video stream — used by TensorFlow.js + MoveNet pose detection running in your browser. We do not record, transmit, or store video frames.
- Pose keypoints — the 17 body landmarks (shoulders, hips, knees, etc.) detected from your camera. Used in real-time to count exercise reps. Never sent to our servers.
-
Workout history (local) — stored in your browser's
localStorageso you can see your Journey screen offline. Bound to your browser; clearing site data deletes it.
2.2 Data sent to our servers (only when you sign in or submit a score)
When you tap "Lưu điểm" (Save Score) on the Result screen, or sign in via Google/Facebook, we collect:
| Data | Source | Purpose | Retention |
|---|---|---|---|
| Firebase Anonymous UID | Auto-generated by Firebase | Identify your device for score storage | Until you clear browser data or 30 days inactive (whichever first). Orphan anon UIDs (no submitted scores) auto-deleted weekly. |
| Display name | You enter it, OR pulled from Google/Facebook profile | Show on leaderboard | Until you delete account |
| Pulled from Google/Facebook profile | Account recovery on different device | Until you delete account | |
| Profile photo URL | Pulled from Google/Facebook profile | Avatar on leaderboard | Until you delete account |
| Workout scores | Calculated by your browser, submitted by you | Leaderboard ranking, personal best tracking | Until you delete account |
| Workout metadata + timestamps + client version | Auto-attached to each score submission | Score validation, anti-cheat, leaderboard period filtering | Until you delete account |
2.3 Data we do NOT collect
- Camera video, audio, or images
- Pose keypoint data (stays in your browser)
- Location (we don't request geolocation API)
- Phone number
- Contact list, calendar, files, or any device sensors beyond camera
- Browsing history outside our app
- Health data beyond workout reps you choose to submit
3. Why we collect data and legal basis
- Provide the service — count your reps, save your scores, show leaderboards (legal basis: contract performance — you signed in to use the service).
- Allow you to sign in across devices — Google/Facebook OAuth (legal basis: contract performance + your consent when you choose to sign in).
- Prevent cheating — server-side validation rejects impossible reps (legal basis: legitimate interest in fair competition).
- Improve the app — anonymous analytics (event counts, error logs) via Google Analytics 4 (legal basis: legitimate interest; you can opt out — see §7).
4. Who we share data with
We use the following third-party services to provide the app:
-
Firebase (Google) — authentication, Firestore
database, Cloud Functions. Firebase processes data on Google's secure
infrastructure in
asia-southeast1region. See Firebase Privacy. - Google Sign-In — when you sign in with Google. We receive your email + profile info per Google's OAuth consent. See Google Privacy Policy.
- Facebook Login — when you sign in with Facebook. We receive your email + public profile per Facebook's Login flow. See Facebook Privacy Policy.
- Google Analytics 4 — pageview + custom events (no personal data, no IP retained beyond Google's defaults). See GA4 Privacy.
- Vercel — hosting provider. Vercel handles HTTP requests for our static assets. See Vercel Privacy Policy.
We do not sell your data. We do not share with advertisers. We do not transfer data outside the listed processors.
5. Data security
- All data in transit is encrypted via HTTPS/TLS.
- Firestore data is encrypted at rest (Google-managed keys).
- Firebase rules enforce that you can only read/write your own user document; leaderboard reads are public but writes are server-only via callable Cloud Function with anti-cheat validation.
- We do not have access to your Google or Facebook password — OAuth providers handle authentication.
6. Your rights
Under GDPR, CCPA, and Vietnamese data protection norms, you have the right to:
- Access your data — email hi@bodygame.fit with subject "Data Access Request".
- Delete your data — see Data Deletion Instructions.
- Correct inaccurate data — change your display name in Settings, or email us.
- Export your data — email us; we'll provide a JSON export within 30 days.
- Opt out of analytics — see §7.
- Withdraw consent — sign out + delete your account.
We respond to requests within 30 days.
7. Analytics opt-out
We use Google Analytics 4 to count anonymous events (workout starts, errors, feature usage). To opt out:
- Browser-wide: install the Google Analytics Opt-Out Add-on.
- Or block GA via your browser's privacy settings / extensions (uBlock Origin, Privacy Badger).
Opting out does not affect app functionality.
8. Children's privacy
BodyGame.fit is intended for users 13+. We do not knowingly collect data from children under 13. If you believe we have, contact us and we will delete it.
9. Changes to this policy
We may update this policy when we add features (e.g., social sharing, weekly tournaments). Material changes will be announced on the Home screen and via the email on file. Continued use after the effective date constitutes acceptance.
10. Contact
- Email: hi@bodygame.fit
-
Subject prefix:
[BodyGame.fit Privacy] - Response time: within 30 days