Skip to content

feat: Google Play submission kit — build config, listing, data-safety, deletion path - #5

Merged
jphein merged 4 commits into
mainfrom
feat/play-store-submission
Jul 4, 2026
Merged

feat: Google Play submission kit — build config, listing, data-safety, deletion path#5
jphein merged 4 commits into
mainfrom
feat/play-store-submission

Conversation

@jphein

@jphein jphein commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator

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

jphein and others added 4 commits July 3, 2026 20:42
…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>
Copilot AI review requested due to automatic review settings July 4, 2026 03:43

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Jul 4, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@jphein, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 2 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 0eb7170a-6353-44a1-a384-ca9a6f20f437

📥 Commits

Reviewing files that changed from the base of the PR and between 6ef7d15 and c5179ee.

⛔ Files ignored due to path filters (3)
  • docs/play-store/assets/feature-graphic-1024x500.png is excluded by !**/*.png
  • docs/play-store/assets/play-icon-512.png is excluded by !**/*.png
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (14)
  • .gitignore
  • PRIVACY.md
  • app.config.ts
  • app/(tabs)/profile.tsx
  • docs/delete-account.html
  • docs/play-store/SUBMISSION-RUNBOOK.md
  • docs/play-store/assets.md
  • docs/play-store/assets/generate.sh
  • docs/play-store/content-rating.md
  • docs/play-store/data-safety.md
  • docs/play-store/listing.md
  • docs/privacy.html
  • eas.json
  • package.json
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/play-store-submission

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread app.config.ts
Comment on lines +93 to 98
"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,
},
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

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,
        },
      },

Comment thread app/(tabs)/profile.tsx
Comment on lines +125 to +127
onPress={() =>
Linking.openURL("https://forage.techempower.org/delete-account.html")
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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.

Suggested change
out="docs/play-store/assets"
out="docs/play-store/assets"
mkdir -p "$out"

@jphein
jphein merged commit 200b824 into main Jul 4, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants