Skip to content
WebViewGold Vibe Coding to App Store
English
Get WebViewGold

Claude Code

Automated App Store and Google Play readiness checks on every pull request with Claude 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.

  • Approval guarantee – or money back within 14 days
  • No coding needed
  • One-time payment, free updates
  • 24/7 human support
  • Made in Germany since 2014 · ISO 27001

Why a published app needs a store check on every PR

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:

  • Comment: anthropics/claude-code-action@v1 reviews the diff and posts one pull request comment. Advisory, readable and cheap to start with.
  • Gate: Claude Code in headless mode (claude -p) returns structured JSON and the job fails when it finds a blocker. Make it a required status check once you trust it.

Setup

You need admin access to the repository and either a Claude API key or a Claude subscription token.

  1. Install the Claude GitHub App and add a secret

    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.

  2. Commit the rules the reviewer needs

    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.

  3. Add the workflow

    Save the YAML below as .github/workflows/store-readiness.yml and adjust the paths list to your folders.

  4. Open a test pull request

    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.

  5. Add the gate when you trust it

    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.

  6. Keep costs predictable

    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.

Workflow 1: a store-readiness comment on every pull request

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.

yaml
# .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!

Antonio Davila · CodeCanyon

Workflow 2: a gate that fails on blockers

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.

yaml
  # 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
          fi

The JSON schema for the gate

Save 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.

json
{
  "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 or gate?

Comment (claude-code-action)Gate (claude -p)
OutputOne readable comment with a verdict and a tablePass or fail status, JSON in the job log
Blocks the mergeNoYes, once it is a required status check
AuthenticationClaude GitHub App plus an API key or subscription tokenAPI key as an environment variable
Best forExplaining risks to whoever wrote the pull requestMaking sure nobody merges a known blocker on a busy day
False alarmsIgnore the commentFix the code, or add the store-review-ok label and re-run

Let Claude Code write the workflows for your repository

Claude adapts the paths filter to your folder layout and leaves secrets to you.

Paste into Claude Code in your repository root
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.

Pitfalls

  • Running on everything. Without the paths filter, the draft skip and the concurrency group, a busy repository pays for reviews nobody reads.
  • A prompt that drifts into code review. A store check that also comments on naming and tests gets ignored. Keep it to store rules and leave the rest to a separate review.
  • Expecting it to see the screen. It reads code and diffs. Layout problems on a real phone, slow first loads and broken flows still need a device test and the readiness check on your preview or production URL.
  • Making the gate required on day one. Model output varies between runs. Run the gate in parallel with the comment first, tune the prompt, then make it required.
  • Forgetting what --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.
  • Stale rules. The check is only as current as CLAUDE.md. Update it when Apple or Google change a rule that affects you; the review subagent file needs the same care.

Frequently asked questions

Should I use an API key or my Claude subscription?

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.

Does the action read CLAUDE.md and the rest of .claude/?

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.

Is there an option without writing YAML?

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.

How much does a run cost?

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.

Can this run on GitLab?

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.

Will it catch every rejection reason?

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.

Three ways to get your app into the stores

Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.

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 page

Cloud Builder

$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

Full Service

$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 by WeSetupYourWebViewApp

Winter Sale prices valid until December 31, 2026.

Ready to ship your app?

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.