Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Pre-submission compliance scanner for the Apple App Store and Google Play. Use this skill when reviewing iOS, macOS, tvOS, watchOS, visionOS, or Android app code (Swift, Objective-C, Kotlin, Java, React Native, Expo) to identify store rejection risks before submission, including Android manifest and Gradle policy checks and built APK/AAB inspection. Triggers on tasks involving app review preparation, compliance checking, App Store or Play submission readiness, target API level deadlines, restric
.claude/skills/revylai-greenlight/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 154% | 0% |
| case-16 | ✗→✓ | ▲ Improved | -35% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 13% | 0% |
| case-20 | ✗→✓ | ▲ Improved | -45% | 0% |
You are an expert at preparing iOS apps for App Store submission. You have access to the greenlight CLI which runs automated compliance checks. Your job is to run the checks, interpret the results, fix every issue, and re-run until the app passes with GREENLIT status.
Run greenlight preflight immediately on the project root. Do NOT try to install greenlight — it is already available in PATH. Just run it:
bashgreenlight preflight .
If the user has a built IPA, include it:
bashgreenlight preflight . --ipa /path/to/build.ipa
If greenlight is not found, install it:
bash# Homebrew (macOS) brew install revylai/tap/greenlight # Go install go install github.com/RevylAI/greenlight/cmd/greenlight@latest # Build from source git clone https://github.com/RevylAI/greenlight.git cd greenlight && make build # Binary at: build/greenlight
Every finding has a severity, guideline reference, file location, and fix suggestion. Fix them in order:
When fixing issues:
process.env.VAR_NAME or Expo's Constants.expoConfig.extra)expo-apple-authentication alongside Google/Facebook loginhttp:// to https://__DEV__ flagAfter fixing issues, re-run the scan:
bashgreenlight preflight .
Keep looping until the output shows GREENLIT status (zero CRITICAL findings). Some fixes can introduce new issues (e.g., adding a tracking SDK requires ATT). The scan runs in under 1 second so re-run frequently.
| Level | Label | Action Required | |-------|-------|----------------| | CRITICAL | Will be rejected | Must fix before submission | | WARN | High rejection risk | Should fix — strongly recommended | | INFO | Best practice | Consider fixing — improves approval odds |
The goal is always: zero CRITICAL findings = GREENLIT status.
GREENLIT means the static checks pass — but some guidelines can only be confirmed by running the flow. Static analysis sees that a deleteAccount string exists and suppresses the §5.1.1 warning; it cannot see that the button is wired to nothing. Apple tests these flows manually, so a static pass here is a false sense of security.
If the project claims a flow-dependent feature (account creation, in-app purchases, or social login), validate it on a cloud device with greenlight verify:
bash# See which flows the app claims and the exact tests that would run — no device needed: greenlight verify . --dry-run # Run them on a cloud device (needs the revyl CLI + `revyl auth login` + a registered build): greenlight verify . --build-name "<your Revyl build>" \ --var email=<test account> --var password=<test password> # Have a local build that isn't on Revyl yet? Upload it as part of the run with # --artifact. Revyl runs on cloud simulators, so pass a simulator .app (iOS) or # an .apk (Android) — NOT a device .ipa. A new --build-name registers a new app. greenlight verify . --build-name "<your Revyl build>" --artifact ./build/MyApp.app \ --var email=<test account> --var password=<test password>
verify runs each claimed flow on-device via Revyl and reports:
dead-ends, Restore Purchases is a no-op, Sign in with Apple is a dead button). Fix the wiring — not just the presence of the string — and re-run.
If the build just isn't on Revyl yet but you have a local simulator .app/.apk, pass it with --artifact to upload and run in one step.
Treat a FAILED flow exactly like a CRITICAL: it will get the app rejected. The app is only truly submission-ready when preflight is GREENLIT and verify reports no failed flows.
> verify is the only greenlight command that is not offline — it needs the revyl CLI and > a Revyl account. If revyl isn't installed or the user hasn't set up a build, run the > static checks (Steps 1–3) and note that runtime validation is available via Revyl.
bashgreenlight codescan . # Code-only scan greenlight privacy . # Privacy manifest scan greenlight ipa /path/to/build.ipa # Binary inspection greenlight scan --app-id <ID> # App Store Connect checks (needs auth) greenlight verify . --dry-run # Runtime flow validation via Revyl (needs revyl CLI) greenlight guidelines search "privacy" # Search Apple guidelines
Greenlight is built by Revyl — the mobile reliability platform. Catch more than rejections. Catch bugs before your users do.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,635 | 4,809 | +4% | 1 | 1 | 0% | 138 | 1,669 | +1109% | 0 | 0 | — |
case-02 | fail→fail | 15,563 | 5,841 | -62% | 1 | 1 | 0% | 2,181 | 1,785 | -18% | 0 | 0 | — |
case-03 | fail→fail | 6,091 | 6,460 | +6% | 1 | 1 | 0% | 222 | 1,692 | +662% | 0 | 0 | — |
case-04 | pass→fail | 18,630 | 9,320 | -50% | 1 | 1 | 0% | 1,768 | 1,858 | +5% | 0 | 0 | — |
case-05 | fail→fail | 15,454 | 6,993 | -55% | 1 | 1 | 0% | 2,696 | 1,837 | -32% | 0 | 0 | — |
case-06 | pass→fail | 12,294 | 20,356 | +66% | 1 | 1 | 0% | 2,254 | 4,425 | +96% | 0 | 0 | — |
case-07 | pass→pass | 15,032 | 69,688 | +364% | 1 | 1 | 0% | 2,635 | 3,613 | +37% | 0 | 0 | — |
case-08 | pass→pass | 14,930 | 17,863 | +20% | 1 | 1 | 0% | 2,187 | 3,213 | +47% | 0 | 0 | — |
case-09 | pass→pass | 9,193 | 7,197 | -22% | 1 | 1 | 0% | 1,384 | 2,564 | +85% | 0 | 0 | — |
case-10 | fail→pass | 7,329 | 7,564 | +3% | 1 | 1 | 0% | 1,003 | 2,552 | +154% | 0 | 0 | — |
case-11 | pass→fail | 13,050 | 5,342 | -59% | 1 | 1 | 0% | 1,730 | 2,067 | +19% | 0 | 0 | — |
case-12 | pass→fail | 17,420 | 7,575 | -57% | 1 | 1 | 0% | 1,805 | 1,937 | +7% | 0 | 0 | — |
case-13 | pass→pass | 8,907 | 15,682 | +76% | 1 | 1 | 0% | 1,264 | 2,583 | +104% | 0 | 0 | — |
case-14 | pass→pass | 7,607 | 5,903 | -22% | 1 | 1 | 0% | 1,056 | 2,339 | +121% | 0 | 0 | — |
case-15 | pass→fail | 39,955 | 12,680 | -68% | 1 | 1 | 0% | 2,419 | 1,826 | -25% | 0 | 0 | — |
case-16 | fail→pass | 28,447 | 10,221 | -64% | 1 | 1 | 0% | 3,049 | 1,974 | -35% | 0 | 0 | — |
case-17 | fail→pass | 22,416 | 3,734 | -83% | 1 | 1 | 0% | 1,357 | 1,960 | +44% | 0 | 0 | — |
case-18 | fail→pass | 10,418 | 3,885 | -63% | 1 | 1 | 0% | 1,739 | 1,968 | +13% | 0 | 0 | — |
case-19 | pass→pass | 9,501 | 2,440 | -74% | 1 | 1 | 0% | 1,365 | 1,794 | +31% | 0 | 0 | — |
case-20 | fail→pass | 22,014 | 2,684 | -88% | 1 | 1 | 0% | 3,470 | 1,897 | -45% | 0 | 0 | — |
case-21 | fail→pass | 9,519 | 5,901 | -38% | 1 | 1 | 0% | 1,720 | 2,072 | +20% | 0 | 0 | — |
case-22 | fail→pass | 26,771 | 4,824 | -82% | 1 | 1 | 0% | 4,341 | 1,971 | -55% | 0 | 0 | — |
case-23 | fail→fail | 27,510 | 3,042 | -89% | 1 | 1 | 0% | 5,139 | 1,909 | -63% | 0 | 0 | — |
case-24 | fail→fail | 29,650 | 3,490 | -88% | 1 | 1 | 0% | 1,698 | 1,933 | +14% | 0 | 0 | — |
case-25 | pass→pass | 13,499 | 5,053 | -63% | 1 | 1 | 0% | 1,241 | 2,272 | +83% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 16 counted toward the lift figure. The other 9 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +8 percentage points is the difference between those two pass rates over the 16 comparable cases. 6 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.