Do it yourself
$109 per platform, one-time
The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.
See plans on the main pageClaude Code
Once your app is live, every merge is a release, because the WebViewGold apps load your production URL. A GitHub Actions workflow with Claude Code can review each pull request for the changes that get web-based apps rejected and say so before you merge. Here are two setups that work together: a reviewer that comments through the official action, and a hard gate built on headless mode.
From $109 one-time per platform, or let our team do it all from $698.
With a WebViewGold app, the store binary is a shell and your web app is the product. A pull request that adds a Stripe button to the pricing screen, removes the Delete account action or ships a "coming soon" tab changes what your iOS and Android users see as soon as it deploys. It also changes what the reviewer sees at your next native update, because App Review tests the whole app as it is that day, not your diff.
Normal code review does not catch this, because the code is fine; the problem is a store rule. So the check below is deliberately narrow: it ignores style and architecture and looks only for App Store and Google Play risks. It comes in two variants:
anthropics/claude-code-action@v1 reviews the diff and posts one pull request comment. Advisory, readable and cheap to start with.claude -p) returns structured JSON and the job fails when it finds a blocker. Make it a required status check once you trust it.You need admin access to the repository and either a Claude API key or a Claude subscription token.
The quickest way is /install-github-app inside Claude Code; it needs the GitHub CLI, logged in with gh auth login. Manually: install the Claude GitHub App on the repository and add ANTHROPIC_API_KEY (an API key from the Claude Console) or CLAUDE_CODE_OAUTH_TOKEN (created with claude setup-token) as a repository secret.
Claude Code reads CLAUDE.md on every run, so the native context and store rules from the CLAUDE.md template apply in CI as well. Keep the file short; it is read, and paid for, on every run.
Save the YAML below as .github/workflows/store-readiness.yml and adjust the paths list to your folders.
Add a hard-coded "Buy credits" link to a page that native users see. The comment should flag it under Apple 3.1.1 and Google Play billing. Close the pull request afterwards.
Add the gate job and its JSON schema, let it run alongside the comment for a few weeks, then mark it as a required status check in your branch protection rules.
The workflow skips drafts, runs only for relevant paths, cancels superseded runs and caps turns and minutes. Each run uses GitHub Actions minutes plus API tokens or subscription usage.
Built on the official action in automation mode: because a prompt is set, it runs on every matching pull request without anyone typing @claude. The allowed tools are read-only, plus the gh commands needed to read the diff and post one comment.
# .github/workflows/store-readiness.yml
name: Store readiness
on:
pull_request:
types: [opened, synchronize, ready_for_review, reopened]
paths:
- "src/**"
- "app/**"
- "public/**"
- "native/**"
- "CLAUDE.md"
concurrency:
group: store-readiness-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
review:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read
pull-requests: write
issues: read
id-token: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
This web app is also published as iOS and Android apps built with
WebViewGold. The apps load our production URL in a native WebView, so
every merged change is live in the store apps after the next deploy.
CLAUDE.md describes the native context and the store rules we follow.
Review only the changes in this pull request (gh pr diff) for App Store
and Google Play risks:
- digital goods, subscriptions, prices or external payment links that
are visible when isNativeApp() is true (Apple 3.1.1, Google Play billing)
- removed or broken /privacy, /terms, /delete-account or the in-app
Delete account action (Apple 5.1.1, Google Play account deletion)
- a new third-party login without Sign in with Apple (Apple 4.8)
- placeholder content, "coming soon", dead links, beta labels (Apple 2.1, 2.3)
- new data collection, SDKs or tracking the privacy policy does not
cover (Apple 5.1.1 and 5.1.2, Google Play Data safety)
- fixed bars without safe-area padding, tap targets under 44 px (Apple 4.0)
- user-generated content without report and block (Apple 1.2)
- under native/: URLs other than the production domain in Config.swift
or Config.java, new permissions, version and build numbers
Post exactly one comment with gh pr comment: a verdict line, then a table
with severity (blocker, risk, polish), rule, file:line and fix. If nothing
in the diff is store-relevant, post one line saying so. Skip general code
review feedback; another check handles that.
claude_args: |
--max-turns 25
--allowedTools "Read,Grep,Glob,Bash(gh pr diff *),Bash(gh pr view *),Bash(gh pr comment *)"
WebViewGold has allowed us the shortest and most efficient time-to-market ever possible from among all the other app platforms we have ever tried during the past 5 years. I don’t know why I hadn’t discovered you sooner, but I am really, really glad I did. Currently nearing 6000 app downloads on both iOS App Store & Google Play Store without any problem!
Add this job under jobs: in the same file. It installs Claude Code, pipes the pull request diff into headless mode and asks for JSON that matches a schema. --permission-mode dontAsk denies anything that would need an approval, so the run can read files but not change them. The store-review-ok label lets a person overrule a false alarm: add the label, then re-run the job.
# Second job in the same workflow file
gate:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
pull-requests: read
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Install Claude Code
run: |
curl -fsSL https://claude.ai/install.sh | bash
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
- name: Store-readiness gate
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GH_TOKEN: ${{ github.token }}
PR: ${{ github.event.pull_request.number }}
BASE_REF: ${{ github.base_ref }}
run: |
# Human override: add the label, then re-run this job
if gh pr view "$PR" --json labels --jq '.labels[].name' | grep -qx 'store-review-ok'; then
echo "Label store-review-ok is set, skipping the gate."
exit 0
fi
git diff "origin/$BASE_REF...HEAD" | claude -p \
"The input is the diff of a pull request. This web app is also published as iOS and Android apps with WebViewGold, which load the production URL. Using the store rules in CLAUDE.md, report every change in this diff that would likely get the iOS or Android app rejected or removed. Only report findings you can tie to a file and line of the diff. Use severity blocker only for a likely rejection." \
--permission-mode dontAsk \
--allowedTools "Read,Grep,Glob" \
--max-turns 15 \
--output-format json \
--json-schema "$(cat .github/store-gate-schema.json)" > result.json
if ! jq -e '.structured_output' result.json > /dev/null; then
echo "::warning::The store gate returned no structured result; see the log."
exit 0
fi
jq '.structured_output' result.json
blockers=$(jq '[.structured_output.findings[] | select(.severity == "blocker")] | length' result.json)
if [ "$blockers" -gt 0 ]; then
echo "::error::$blockers store-review blocker(s). Fix them or add the store-review-ok label."
exit 1
fiSave as .github/store-gate-schema.json. Headless mode puts the result that matches the schema into the structured_output field of its JSON output, which the workflow reads with jq.
{
"type": "object",
"properties": {
"verdict": { "type": "string", "enum": ["pass", "risks", "blockers"] },
"findings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"severity": { "type": "string", "enum": ["blocker", "risk", "polish"] },
"rule": { "type": "string" },
"file": { "type": "string" },
"line": { "type": "integer" },
"fix": { "type": "string" }
},
"required": ["severity", "rule", "file", "fix"]
}
}
},
"required": ["verdict", "findings"]
}| Comment (claude-code-action) | Gate (claude -p) | |
|---|---|---|
| Output | One readable comment with a verdict and a table | Pass or fail status, JSON in the job log |
| Blocks the merge | No | Yes, once it is a required status check |
| Authentication | Claude GitHub App plus an API key or subscription token | API key as an environment variable |
| Best for | Explaining risks to whoever wrote the pull request | Making sure nobody merges a known blocker on a busy day |
| False alarms | Ignore the comment | Fix the code, or add the store-review-ok label and re-run |
Claude adapts the paths filter to your folder layout and leaves secrets to you.
Create GitHub Actions workflows for a store-readiness check on pull requests. Context: this web app is also published as iOS and Android apps with WebViewGold, which load our production URL, so every merged change is live in the store apps after the next deploy. CLAUDE.md contains our native context and store rules. 1. .github/workflows/store-readiness.yml, triggered on pull_request (opened, synchronize, ready_for_review, reopened), skipping drafts, with a concurrency group per pull request and a paths filter that matches our real web app and native folders (look at the repository layout first). 2. Job review: anthropics/claude-code-action@v1 with a prompt that reviews only store risks in the diff (Apple 1.2, 2.1, 2.3, 3.1.1, 4.0, 4.2, 4.8, 5.1.1, 5.1.2; Google Play billing, Data safety, account deletion, permissions; production URLs in Config.swift and Config.java) and posts one comment with gh pr comment. Allowed tools: Read, Grep, Glob and the gh pr diff, view and comment commands. At most 25 turns. 3. Job gate: install Claude Code, pipe the pull request diff into claude -p with --permission-mode dontAsk, --allowedTools "Read,Grep,Glob", --output-format json and --json-schema from .github/store-gate-schema.json. Fail when a finding has severity blocker; skip when the pull request has the label store-review-ok. 4. The schema file with verdict and findings (severity, rule, file, line, fix). Do not put any secret into a file. Tell me which repository secret to create and how to make the gate a required status check.
--bare skips. --bare makes CI runs reproducible but skips CLAUDE.md, hooks and skills. If you use it, pass your rules with --append-system-prompt-file.Both work with the action. ANTHROPIC_API_KEY bills API usage to your Claude Console account; CLAUDE_CODE_OAUTH_TOKEN, created with claude setup-token, uses a paid Claude plan. For a repository several people share, an API key is the cleaner choice, because the token is tied to one person.
It runs Claude Code in the checked-out repository, so CLAUDE.md applies to every run, and a project skill can be started by passing /skill-name as the prompt. The same rules serve your local sessions and CI.
Anthropic also offers Code Review, which reviews pull requests automatically without a workflow file. It is a general reviewer, so the store-specific rules still need to live in CLAUDE.md for it to apply them.
It depends on the size of the diff and how many files the reviewer opens. The turn limit, the paths filter and the timeout cap the worst case, and the JSON output of headless mode includes an estimated cost per run that you can log.
Claude Code also has a GitLab CI/CD integration, and the headless gate works in any CI system that can run a shell command with the API key set. The action itself is GitHub-only.
No. It catches what is visible in a diff. Review notes, screenshots, privacy questionnaires and device behavior still need you, and the review subagent is the better tool for a full pre-submission audit.
Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.
$109 per platform, one-time
The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.
See plans on the main page$349 per license, one-time add-on
No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.
How the Cloud Builder works Try the free demo$698 per platform $798
Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.
Full Service details Powered byWinter Sale prices valid until December 31, 2026.
App Store & Google Play approval guarantee – or your money back within 14 days
Rather hand it over? Full Service: we configure, build and deliver within 72 hours, from $698 per platform. Questions? Chat with us 24/7.
Refunds are granted under the conditions listed in our FAQ: a non-content rejection by Apple and/or Google, claimed within 14 days after purchase.