Agent skill

App Store Review

by templetongroup in templetongroup/radiant

Get an iOS/iPadOS app through App Store review and keep it there — preparing a submission, reading App Store Connect instead of guessing, answering a 2.1 information request, fixing a metadata…

MITAuto-check passedMobile

Install App Store Review

skills CLI
$ npx skills add templetongroup/radiant --skill app-store-review -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install templetongroup/radiant app-store-review --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/templetongroup/radiant.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/app-store-review .claude/skills/app-store-review && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
app-store-review
GitHub stars
113
Token cost
~3.8k tokens
SKILL.md length
2,380 words
Files
5
Skills in repo
9
Repo updated
First seen
Licence
MIT

At a glance

Get an iOS/iPadOS app through App Store review and keep it there — preparing a submission, reading App Store Connect instead of guessing, answering a 2.1 information request, fixing a metadata…

  • Works in 5 steps: Before the first submission — the… → While it is in review — statuses and… → When it is rejected — read it like this → …
  • The user says submit to the App Store
  • SKILL.md covers Rule zero: read App Store…, The workflow, Uploading a build from the… and Driving App Store Connect with…, plus 3 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

App Store Review is an agent skill from templetongroup/radiant. Get an iOS/iPadOS app through App Store review and keep it there — preparing a submission, reading App Store Connect instead of guessing, answering a 2.1 information request, fixing a metadata rejection without a new build, and the App Store Connect traps that cost a round trip each. Use when the user says "submit to the App Store", "Apple rejected the app", "what's the status of the submission", "fill in TestFlight", "app privacy", "age rating", or anything about App Store Connect. Learned the hard way shipping…

Its SKILL.md is about 3.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files (for example `README.md`, `reference/checklist.md` and `reference/rejections.md`).

It sits in Mobile, covering App store release. It works with App Store Connect and iOS. The repository describes itself as: A local coding harness for Mac. Chat with coding agents across cloud and local models, watch every tool call in a live activity feed, and drive a real terminal — in one window… The licence is MIT.

When your agent uses it

  • The user says submit to the App Store
  • Apple rejected the app
  • Whats the status of the submission
  • Fill in TestFlight

Example prompts

  • “submit to the App Store”
  • “Apple rejected the app”
  • “s the status of the submission”
  • “/app-store-review”

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Before the first submission — the checklist
  2. While it is in review — statuses and what they mean
  3. When it is rejected — read it like this
  4. When a new build is needed while one is in the queue
  5. After approval

What it can do on your machine

Read from SKILL.md and the folder at commit 94838ca. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • appstoreconnect.apple.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

App Store Review loads about 3.8k tokens when it runs. Until then it costs about 158 tokens; SKILL.md has 2,380 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~158
When it runs · the whole SKILL.md, loaded when a task matches
~3.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from templetongroup/radiant at commit 94838ca, republished under its MIT licence (© templetongroup). 2,380 words, ~3,836 tokens.

Download SKILL.mdSave it as .claude/skills/app-store-review/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
app-store-review
description
Get an iOS/iPadOS app through App Store review and keep it there — preparing a submission, reading App Store Connect instead of guessing, answering a 2.1 information request, fixing a metadata rejection without a new build, and the App Store Connect traps that cost a round trip each. Use when the user says "submit to the App Store", "Apple rejected the app", "what's the status of the submission", "fill in TestFlight", "app privacy", "age rating", or anything about App Store Connect. Learned the hard way shipping Radiant for iPhone (two rejections, one lost day, a subtitle that was both rejections at once).

App Store Review — what actually happens, and what to do about it

This is a working protocol, not Apple's documentation. Every rule in it was paid for by a real round trip on a real app (Radiant for iPhone, 2026-08 to 2026-09). Where a rule looks paranoid, the reference files say what it cost.

It is model- and harness-agnostic. "Open App Store Connect" means: drive a browser if you have one, and otherwise write the exact steps for the user. Only the account holder can press Submit, reply to App Review, or upload a build — prepare everything, then hand over, and never report a step as done that you did not see finish.

Rule zero: read App Store Connect before you trust anything

The status of a submission lives in exactly one place:

https://appstoreconnect.apple.com/apps/<app id>/distribution/reviewsubmissions

Not in your notes, not in the last commit message, not in the project file's build number, not in what the user remembers. Every one of those went stale on Radiant — a status doc said "Waiting for Review" for nine days while the app had been REJECTED, and a whole day of work was done on a build that was not in the queue at all. Reading the page costs one navigation. Do it first, every time the task touches the submission, and write what you saw (status, build number, date) into whatever record you keep, dated.

Corollary: a prediction of why Apple will reject is worth nothing. Radiant's notes predicted guideline 1.2 twice; Apple raised 2.1, then 5.0.0 + 5.2.5. Do not build a fix for a rejection that has not happened.

The workflow

1. Before the first submission — the checklist

Work through reference/checklist.md in full. The items that bite:

  • The name must be unique across the whole store and can be held by an app that never shipped. Have a second name ready.
  • Name and subtitle must not contain Apple trademarks (iPhone, iPad, Apple, Mac). The description may mention them; the subtitle reads as branding and is held to guideline 5.2.5.
  • Say nothing that reads as another company's brand. "Open AI models" (meaning open-weight) was read as OpenAI and triggered China's deep-synthesis rule (5.0.0). Write "open-weight" or "open models".
  • If the app can send anything to a third party — even optionally, even with the user's own API key — the app itself must disclose and ask first. Guidelines 5.1.1(i) and 5.1.2(i): before the first byte goes to a cloud AI service (or any third party), the app shows what is sent, to whom (by name), what it is used for, and gets an explicit Allow / Not now. A privacy policy saying the same thing does not count — Apple's own words: "only including this information in the app's Terms of Service or Privacy Policy is not sufficient." The policy must ALSO state what data, how it is collected, all uses, and that the third party protects it. Radiant lost a review cycle to this with a bring-your-own-key provider list; the sheet took an afternoon after the rejection and would have taken an hour before it. Build it before the first submission.
  • Every claim in the metadata must be true when a reviewer pokes at it. "Fully offline" is false the moment the app accepts a cloud API key. A subtitle can be shorter than the truth; it cannot be bigger.
  • App Privacy has a Publish button. Saving the answers is a draft. The submit button then refuses with "an Admin must provide information about the app's privacy practices", which does not sound like "you forgot to publish". Verifying a value reloads correctly is not verifying the section is done.
  • Age rating: do not chase 4+ with an app that generates text. Answer as the closest shipped peer did (look them up on the store), plus whatever your app adds. A reviewer who types a rude question and gets a rude answer has caught a false declaration (2.3).
  • Review notes are capped at 4,000 characters and a 4,151-character draft is refused with no useful message. Write them in a file, count, then paste.
  • Fetch every URL you enter and check the title of what comes back. A site that answers 200 with its homepage for unknown paths makes a typo look fine.
  • Run the app on a physical device before uploading if any code path cannot run in the Simulator (anything using Metal/GPU: MLX, Core ML on GPU, camera). "Verified in the Simulator" is not a claim you can make about it.
1b. The app has to survive being live, not just pass review

⚠️ THIS SECTION EXISTS BECAUSE THE SKILL DID NOT HAVE IT. Everything above gets a binary through review. None of it makes the app a product once it is on sale, and Radiant shipped 1.0 with no way to rate it — discovered a day after launch, by the owner, not by the checklist. His words: "not being able to rate the app is a crippling problem."

Review these before the first submission, because two of them cannot be fixed without another review cycle.

A rating prompt. Non-negotiable. Ratings are a ranking input, and a new app has none. No ratings means no ranking means no downloads means no ratings — the loop does not break on its own, and every week without the prompt is a week of installs that could have left one and did not. Implement AppStore.requestReview(in: scene) (iOS 18+), falling back to SKStoreReviewController.requestReview(in: scene), and:

  • ask after a success the person can feel, never on launch, never mid-task. Radiant asks after a model finishes downloading AND the person has had a real conversation — they have seen it work twice, on their own device;
  • ask once, and record that you asked before the call, so a slow or failing request cannot produce a second prompt. The system caps it at three a year, but "the system will stop me" is not a reason to ask twice;
  • it must never block, branch or report failure. The system decides whether a prompt actually appears and never tells you;
  • verify the class is in the shipped binary. A new plugin/source file that is not in the Xcode target's Sources phase compiles nothing, and the call is refused at runtime where a catch swallows it. strings -a <binary> | grep <ClassName> — do not trust BUILD SUCCEEDED.

Keywords, or nobody finds it. 100 characters, comma-separated, no spaces after the commas (a space costs a character and buys nothing). Do not repeat words already in the name or subtitle — those are indexed and a repeat wastes the budget. No competitor brand names and no other companies' model names: the description is held to a looser standard than keywords, so name the models there instead. A day after Radiant launched it was findable at #17 for one narrow phrase and nowhere in the top 40 for anything else, including its own name — indexed, but ranking nowhere, which is the normal state of an app with no ratings and empty keywords.

Promotional text. 170 characters, sits above the description, and is the only listing field that can be changed at any time with no review. Not indexed for search, so it is for what changes — a new feature, a moment — not for keywords. Radiant shipped with it empty.

Then look at the app the way a stranger will, before the reviewer does: first launch with no data, the empty states, what the first sixty seconds asks of someone who has never seen it, and whether anything a new user hits first is half-built. A reviewer opens the app cold; so does every download.

2. While it is in review — statuses and what they mean
StatusMeaningDo
Waiting for Reviewin the queuenothing; do not resubmit, do not touch the build
In Reviewa person has itnothing
Rejected — Information Needed (2.1)not a violation; questionsanswer in App Review and paste the answers into Review Notes; no button to press, the reply is the resubmission
Rejected — a guideline numbera findingsee step 3
Pending Developer Releaseapproved, heldthe user presses Release
Removedyou pulled ita fresh submission is needed

"Missing Test Information" is a TestFlight warning, not an App Store one. It gates external TestFlight testing only and does not block review. It lives under TestFlight → Test Information, a different tab with its own fields. Fill it (it takes ten minutes; reference/checklist.md lists the fields), but do not read it as a problem with the submission.

Show full SKILL.md (971 more words)Show less
3. When it is rejected — read it like this
  1. Copy the rejection text verbatim into your record, with the guideline numbers, the submission ID, the reviewed device, and the date.
  2. For each citation, find the exact field that contains the flagged words. Apple quotes them. Search name, subtitle, description, keywords, promotional text, review notes, screenshots, what's-new — separately. One 30-character subtitle carried both of Radiant's citations.
  3. Decide: metadata-only fix, or new build? Most first-app rejections are metadata. A metadata fix needs no upload and keeps the same binary.
  4. Read Apple's Next Steps literally — they often name the cheap option (deselect the China mainland storefront rather than strip every OpenAI reference and hold an MIIT licence you do not have).
  5. Make the edits. Verify each by reloading the page. App Store Connect greys its Save button whether or not the write reached the server.
  6. Resubmit. For a metadata fix this is two buttons on two pages: on the version page, Update Review moves the item from Rejected to Ready for Review; only then does Resubmit to App Review on the submission page become enabled. The second is greyed out until the first is pressed, and nothing says so.
  7. Record the new status, dated, and stop predicting.

reference/rejections.md has the four Radiant rejections in full — the text, the field, the fix, the buttons — including the one that needed a new build.

4. When a new build is needed while one is in the queue

A submitted binary cannot be edited. Raise the build number (read it from the project file — it has drifted from every note that recorded it), archive, upload. While the state is Waiting for Review or In Review, use Remove this version from review first, attach the new build, submit again — that keeps the same version listing. Once it is Pending Developer Release or on sale, the new build is an update instead.

5. After approval

Being approved is not being found. Check where the app actually ranks rather than assuming the store will surface it: itunes.apple.com/search? term=<...>&entity=software&country=us&limit=50 and look for your trackId, and itunes.apple.com/lookup?id=<id> for what the listing really holds (promotional text, release notes, screenshot counts, description). Search a few terms including the app's own name. Found by developer name but not by app name means it is indexed and ranking nowhere — a keywords and ratings problem, not a propagation one. Do not report "the index hasn't caught up" without measuring; that was said about Radiant and was wrong.

Nothing in the store updates itself. Metadata edits (promotional text, review notes, what's-new for the next version) do not need a build; the subtitle, name, screenshots and description are tied to a version and change with the next submission. Keep a list of "change on the next submission" items in your record — Radiant's is the subtitle — and put it in front of the user as part of the next build's checklist. Do not assume they remembered.

Uploading a build from the command line

xcodebuild -exportArchive -archivePath <.xcarchive> -exportOptionsPlist <plist with destination: upload> -allowProvisioningUpdates uploads without Xcode's GUI — but it reads the Apple ID from Xcode → Settings → Accounts. "exportArchive Failed to Use Accounts" / "No Accounts" means nobody is signed in on this Mac; the log also says "No signing certificate iOS Distribution found", which is a red herring — once an account is signed in, cloud-managed signing supplies the certificate and no local Distribution identity is needed. Ask the user to sign in, rerun, look for "Upload succeeded" and "EXPORT SUCCEEDED". Processing on Apple's side takes several minutes before the build can be attached to a version.

Driving App Store Connect with a browser

  • Two kinds of fields refuse programmatic value-setting. React-controlled inputs ignore .value = — the field stays empty and Save never enables. Click and type, or set through the native value descriptor and dispatch input then change. The TestFlight Beta App Description is a contenteditable div, not a textarea; a querySelectorAll('textarea') sweep misses it.
  • Reload after every save and read the value back. Greyed Save proves nothing.
  • The "Publish" on App Privacy is separate from Save. Look for it.
  • Storefront availability is under Pricing and Availability, a different page from the version; deselecting a country there is what "not distribute in China" means.
  • Only the account holder can sign in. Do not handle credentials; have them sign in, then continue.

Screen recordings for App Review

Apple asks for one when they cannot see the feature work (2.1). Rules that each cost a take on Radiant:

  • Check the status bar before believing an offline demo. Airplane Mode with Wi-Fi re-enabled shows a Wi-Fi fan; Wi-Fi off with cellular up shows "5G+". The take that counts shows Airplane Mode on and no radio in the status bar.
  • Do not put a hallucination in front of the reviewer of an AI app. A tiny model inventing history is not a demo. Use a prompt with a short, checkable answer (a haiku, a unit conversion).
  • Record on a physical device; the Simulator is not accepted for this.

Keeping the record

Keep one file in the repo (Radiant uses docs/APP_STORE_LISTING.md): every metadata field's current text with its character count, the privacy answers and why, the age rating answers and why, each rejection verbatim with the fix, and a dated status line that says when it was last read from App Store Connect. Headings that state a status go stale; prefer "checked 2026-09-10: Waiting for Review, build 6" to "Waiting for Review".

What this skill does not do

It does not decide the product's content policy, it does not enrol the developer account, and it does not convert an Individual enrolment to an Organization (that is a D-U-N-S number plus a support request, and it updates the seller name on shipped apps without a resubmission — so it never blocks a release).

© templetongroup, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 4 other files in .claude/skills/app-store-review of templetongroup/radiant.

  • SKILL.md
  • LICENSE
  • README.md
  • reference/checklist.md
  • reference/rejections.md

Open the folder on GitHubat commit 94838ca

Compare with similar skills

App Store Review next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

App Store Review compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
App Store Review this skilltempletongroup/radiant113—~3.8kAutomated safety check: PassMIT
App Store Release Flowrorkai/app-store-connect-cli-skills1.1k2 repos~2kAutomated safety check: PassMIT
App Store Submission Healthrorkai/app-store-connect-cli-skills1.1k2 repos~2.2kAutomated safety check: PassMIT
App Store Preflight Skillstruongduy2611/app-store-preflight-skills1.4k—~1.4kAutomated safety check: PassMIT
App Store Connect App Creatorrorkai/app-store-connect-cli-skills1.1k3 repos~1.5kAutomated safety check: PassMIT
OdevioOdevio/Odevio-CLI423—~7.6kAutomated safety check: PassMIT

Similar skills

  • App Store Release Flow

    rorkai/app-store-connect-cli-skills

    Orchestrates App Store releases with the asc CLI: staging a version, uploading or building, publishing and submitting for review, with dry-run and confirmation gates.

    1.1k GitHub starsUsed in 2 repos~2k tokens
    MobileAuto-check passed
  • App Store Submission Health

    rorkai/app-store-connect-cli-skills

    Diagnoses why an App Store version cannot be submitted or is stuck in review, using the asc CLI for validation, repair routing, status checks and retry decisions.

    1.1k GitHub starsUsed in 2 repos~2.2k tokens
    MobileAuto-check passed
  • App Store Preflight Skills

    truongduy2611/app-store-preflight-skills

    Scan an iOS/macOS Xcode project for common App Store rejection patterns before submission.

    1.4k GitHub stars~1.4k tokensUpdated 4 mo ago
    MobileAuto-check passed
  • App Store Connect App Creator

    rorkai/app-store-connect-cli-skills

    Creates a new App Store Connect app record by driving the New App form through browser automation, for cases where no public API covers app creation.

    1.1k GitHub starsUsed in 3 repos~1.5k tokens
    MobileAuto-check passed
  • Odevio

    Odevio/Odevio-CLI

    Take a Flutter project to an iPhone or the App Store with Odevio - build, sign and publish iOS apps from Windows, Linux or macOS with no Mac and no Xcode.

    423 GitHub stars~7.6k tokensUpdated 17 days ago
    MobileAuto-check passed
  • iOS App Store Submit

    ZestfulPulse/ios-app-store-submit

    Build, sign, and submit a Flutter/iOS app to the App Store Connect — covers Xcode archive/export, code signing (including headless-Mac keychain workarounds), the asc CLI for App Store Connect…

    142 GitHub stars~4.7k tokensUpdated 10 days ago
    MobileAuto-check passed

More from templetongroup/radiant

All 9 skills in this repo
  • Design System

    templetongroup/radiant

    A skill your agent uses to generate or audit design systems, check visual consistency, and review PRs that touch styling.

    113 GitHub stars~775 tokensUpdated 5 days ago
    Auto-check passed
  • Master Design

    templetongroup/radiant

    Design, redesign, build, audit, polish, and production-verify exceptional interfaces across web, mobile, and native apps.

    113 GitHub stars~2.9k tokensUpdated 5 days ago
    Auto-check passed
  • Tinystruct Patterns

    templetongroup/radiant

    Expert guidance for developing with the tinystruct Java framework.

    113 GitHub stars~3k tokensUpdated 5 days ago
    Auto-check passed
  • Agent Payment X402

    templetongroup/radiant

    Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets.

    113 GitHub stars~2.7k tokensUpdated 5 days ago
    Auto-check passed
  • Motion UI

    templetongroup/radiant

    Production-ready UI motion system for React/Next.js. An agent skill from templetongroup/radiant.

    113 GitHub stars~3.5k tokensUpdated 5 days ago
    Auto-check passed
  • Plan Orchestrate

    templetongroup/radiant

    Read a plan document, decompose it into steps, design a per-step agent chain from the ECC catalogue, and emit ready-to-paste /orchestrate custom prompts.

    113 GitHub stars~4.5k tokensUpdated 5 days ago
    Auto-check passed

Categories

Questions about App Store Review

What does App Store Review do?

Get an iOS/iPadOS app through App Store review and keep it there — preparing a submission, reading App Store Connect instead of guessing, answering a 2.1 information request, fixing a metadata…. App Store Review is an agent skill from templetongroup/radiant.1 information request, fixing a metadata rejection without a new build, and the App Store Connect traps that cost a round trip each.

When should I use App Store Review?

App Store Review fits situations like: the user says submit to the App Store; apple rejected the app; whats the status of the submission; fill in TestFlight.

How do I install App Store Review in Claude Code?

Run `npx skills add templetongroup/radiant --skill app-store-review -a claude-code`. Or copy the skill folder (.claude/skills/app-store-review in templetongroup/radiant) into .claude/skills/app-store-review in your project. Claude Code loads it when a task matches its description.

How do I install App Store Review in Codex?

Run `npx skills add templetongroup/radiant --skill app-store-review -a codex`. Or copy the skill folder (.claude/skills/app-store-review in templetongroup/radiant) into .agents/skills/app-store-review in your project. Codex loads it when a task matches its description.

Can I use App Store Review in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add templetongroup/radiant --skill app-store-review -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/app-store-review, .gemini/skills/app-store-review, .github/skills/app-store-review and .opencode/skills/app-store-review in your project.

What does App Store Review need to run?

SKILL.md names no scripts, command-line tools or credentials: App Store Review is instructions for the agent only.

Does App Store Review access the network?

SKILL.md names 1 domain. As links in the text: appstoreconnect.apple.com. This is read from the text; nothing was executed.

Is App Store Review safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does App Store Review use?

App Store Review is published under the MIT licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does App Store Review use?

About 3.8k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to App Store Review?

Skills that share tags, products or a category with App Store Review: App Store Release Flow (rorkai/app-store-connect-cli-skills, 1.1k stars), App Store Submission Health (rorkai/app-store-connect-cli-skills, 1.1k stars), App Store Preflight Skills (truongduy2611/app-store-preflight-skills, 1.4k stars) and App Store Connect App Creator (rorkai/app-store-connect-cli-skills, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains App Store Review?

templetongroup (a GitHub user) maintains it in templetongroup/radiant, which has 113 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 6, 2026.

Source: templetongroup/radiant on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.