feat: Google Play submission kit — build config, listing, data-safety, deletion path - #5
Conversation
…dk 35, AAB profile - permissions trimmed to location-only (the only capability the code uses); CAMERA/RECORD_AUDIO/READ+WRITE_EXTERNAL_STORAGE blocked — expo-camera and expo-image-picker are installed for a roadmap feature but have zero call sites, and Play flags unused sensitive permissions - expo-build-properties: targetSdkVersion 35 (Play rejects new apps <35 since 2025-08-31; Expo SDK 51 defaults to 34); compileSdk stays 34 to remain in AGP 8.2's support envelope - eas.json: remote appVersionSource (EAS-managed versionCode), explicit app-bundle production build, submit lane pre-wired (internal track, service-account path gitignored) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Google Play's account-deletion policy requires an in-app path for any app with account creation; linking out to the hosted deletion page is the policy-sanctioned minimal form. Keep the URL in sync with docs/delete-account.html. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- PRIVACY.md promised in-app 'Export my data' / 'Delete account' settings that don't exist yet — rewritten to the real paths (in-app link + hosted request page + email), and the photos row removed until photo upload actually ships (store data-safety declarations must match the policy) - docs/privacy.html + docs/delete-account.html: hosted copies on the Pages site (forage.techempower.org), styled to the site design system, with dark/light prefers-color-scheme support — these URLs go into the Play Console privacy-policy and data-deletion forms Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- SUBMISSION-RUNBOOK.md: phased, numbered path from account creation to production rollout; lead-time items (org account D-U-N-S) surfaced first; exact eas build/submit commands; Maps-key SHA-1 gotchas; risk register - listing.md: paste-ready store copy EN + ES (name/short/full), category recommendation (Maps & Navigation) with reasoning, keyword strategy - data-safety.md: form answers derived from code with per-answer citations (precise-location reasoning, no-photos proof, re-verify script) - content-rating.md: IARC answers + UGC-policy compliance evidence - assets.md + assets/: generated 512 Play icon and 1024x500 feature graphic (from brand og-image, stale-URL strip cropped out), regen script, emulator screenshot capture list Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 2 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (3)
📒 Files selected for processing (14)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request prepares the application for Google Play Store submission by minimizing permissions, targeting Android 15 (API 35), adding an in-app account deletion entry point, and introducing comprehensive submission documentation, runbooks, and asset generation scripts. Feedback from the review highlights critical improvements: ensuring compileSdkVersion is updated to 35 alongside targetSdkVersion to prevent EAS build failures, handling potential errors in the asynchronous Linking.openURL call when deleting an account, and ensuring the asset generation script creates its output directory before writing files.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| "expo-build-properties", | ||
| { | ||
| cameraPermission: "Allow Forage to access your camera to document finds.", | ||
| }, | ||
| ], | ||
| [ | ||
| "expo-image-picker", | ||
| { | ||
| photosPermission: "Allow Forage to access photos to attach to listings.", | ||
| android: { | ||
| targetSdkVersion: 35, | ||
| }, | ||
| }, |
There was a problem hiding this comment.
Setting targetSdkVersion to 35 while keeping compileSdkVersion at 34 (the default for Expo SDK 51) will cause build failures on EAS. In Android development, compileSdkVersion must be greater than or equal to targetSdkVersion. Additionally, modern transitive dependencies (such as androidx.activity or androidx.recyclerview) will fail to compile if the app is compiled against SDK 34. Please set compileSdkVersion to 35 as well.
"expo-build-properties",
{
android: {
compileSdkVersion: 35,
targetSdkVersion: 35,
},
},| onPress={() => | ||
| Linking.openURL("https://forage.techempower.org/delete-account.html") | ||
| } |
There was a problem hiding this comment.
Linking.openURL is an asynchronous operation that returns a Promise. If it fails (e.g., if the system fails to find an application to handle the URL), it will result in an unhandled promise rejection, which can cause instability or crashes. It is highly recommended to handle potential errors gracefully using a .catch() block.
onPress={() =>
Linking.openURL("https://forage.techempower.org/delete-account.html").catch((err) =>
console.error("Failed to open URL:", err)
)
}
| set -euo pipefail | ||
|
|
||
| cd "$(git rev-parse --show-toplevel)" | ||
| out="docs/play-store/assets" |
There was a problem hiding this comment.
The script attempts to write generated images to $out (docs/play-store/assets), but it does not ensure that this directory exists first. If the directory is missing (e.g., in a clean clone or if the directory was deleted), the convert command will fail. Adding mkdir -p "$out" prevents this issue.
| out="docs/play-store/assets" | |
| out="docs/play-store/assets" | |
| mkdir -p "$out" |
Everything needed for Play submission except the account-holder steps. Highlights: minimal permissions (camera/mic/storage cut — zero call sites, verified), targetSdk 35 (Play's floor for new apps since Aug 2025 — first EAS build must smoke-test this combo), AAB production profile + submit lane, EN/ES listing copy, code-cited data-safety answers, IARC sheet, generated 512 icon + 1024x500 feature graphic, hosted privacy + delete-account pages (Play's deletion policy requires an in-app path — added as a Profile row linking out, which policy permits), PRIVACY.md corrected to match the actual code (it promised export/delete settings and photo collection that don't exist). Runbook: docs/play-store/SUBMISSION-RUNBOOK.md — start the Play Console org account NOW; D-U-N-S verification can take 30 days and is the launch's long pole.
Maintainer: @jphein — two product changes flagged for your eyes: the Profile delete-account row and the PRIVACY.md corrections.
🤖 Generated with Claude Code