#473 by GitHub stars
RevylAI/greenlight
Pre-submission compliance scanner for the Apple App Store and Google Play. Scans code, privacy manifests, Android manifests, and IPA/APK/AAB binaries against the review guidelines. Offline, no account.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
fcb36e395bd4 → fcb36e395bd4
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → fcb36e395bd4
No earlier version was observed for comparison.
codex-skill/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
fcb36e395bd4 → fcb36e395bd4
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → fcb36e395bd4
No earlier version was observed for comparison.
skills/greenlight/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
fcb36e395bd4 → fcb36e395bd4
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → fcb36e395bd4
No earlier version was observed for comparison.
Verified commit fcb36e395bd4ae20448f2535382baecba9396fd9
git clone --filter=blob:none --no-checkout https://github.com/RevylAI/greenlight.git .hotskills/revylai-greenlight && git -C .hotskills/revylai-greenlight checkout --detach fcb36e395bd4ae20448f2535382baecba9396fd9
# Copy each selected skill directory from .hotskills/revylai-greenlight into .claude/skills/<skill-name>/Heat
4.6- Star growth, last 7 daysAhead of 61% of tracked repositories
- Star growth, last 24 hoursAhead of 83% of tracked repositories
- Rank movement, last 7 daysAhead of 39% of tracked repositories
- Commits, last 30 daysAhead of 0% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- greenlight
/ - app-store-preflight-compliance
codex-skill - greenlight
skills/greenlight
How it works
When your agent uses it
What it loads into context
Frontmatter
0 tokensAlways available to the agent
SKILL.md
177 tokensWhen the skill is activated
Reference documents
5,961 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Install
Scripts executed separately
Makefilecmd/greenlight/main.gointernal/asc/apps.gointernal/asc/auth.gointernal/asc/client.gointernal/asc/session_auth.gointernal/checks/runner.gointernal/checks/tier1_metadata.gointernal/checks/tier2_content.gointernal/checks/types.gointernal/cli/auth.gointernal/cli/codescan.gointernal/cli/guidelines.gointernal/cli/ipa.gointernal/cli/playscan.gointernal/cli/preflight.gointernal/cli/preflight_test.gointernal/cli/privacy.gointernal/cli/root.gointernal/cli/scan.gointernal/cli/verify.gointernal/cli/verify_test.gointernal/cli/version.gointernal/cli/version_test.gointernal/codescan/claims.gointernal/codescan/config.gointernal/codescan/config_test.gointernal/codescan/rules.gointernal/codescan/rules_crypto.gointernal/codescan/rules_crypto_test.gointernal/codescan/rules_test.gointernal/codescan/scanner.gointernal/codescan/types.gointernal/config/config.gointernal/guidelines/guidelines.gointernal/ipa/inspect.gointernal/ipa/inspect_test.gointernal/playscan/archive.gointernal/playscan/archive_test.gointernal/playscan/axml.gointernal/playscan/gradle.gointernal/playscan/manifest.gointernal/playscan/protoxml.gointernal/playscan/rules.gointernal/playscan/rules_test.gointernal/playscan/scanner.gointernal/playscan/scanner_test.gointernal/playscan/types.gointernal/preflight/metadata.gointernal/preflight/platform.gointernal/preflight/runner.gointernal/preflight/runner_test.gointernal/privacy/scanner.gointernal/privacy/scanner_test.gointernal/report/report.gointernal/revyl/client.gointernal/revyl/client_test.gointernal/sarif/sarif.gointernal/sarif/sarif_test.gointernal/verify/flows.gointernal/verify/render.gointernal/verify/runner.gointernal/verify/runner_test.go
Files
.claude-plugin/marketplace.jsonasset849 bytes.claude-plugin/plugin.jsonasset1,040 bytes.github/workflows/ci.ymlasset878 bytes.github/workflows/release.ymlasset805 bytes.gitignoreasset64 bytes.goreleaser.ymlasset1,674 bytesLICENSEasset1,062 bytesMakefileruns762 bytesREADME.mddoc21,285 bytesRELEASING.mddoc3,051 bytesSKILL.mdcore656 bytesSKILL.mdcore656 bytesSKILL.mdcore656 bytescmd/greenlight/main.goruns470 bytesgo.modasset488 bytesgo.sumasset2,694 bytesinternal/asc/apps.goruns7,969 bytesinternal/asc/auth.goruns1,329 bytesinternal/asc/client.goruns1,711 bytesinternal/asc/session_auth.goruns8,107 bytesinternal/checks/runner.goruns2,892 bytesinternal/checks/tier1_metadata.goruns18,148 bytesinternal/checks/tier2_content.goruns3,495 bytesinternal/checks/types.goruns1,859 bytesinternal/cli/auth.goruns7,407 bytesinternal/cli/codescan.goruns9,010 bytesinternal/cli/guidelines.goruns3,001 bytesinternal/cli/ipa.goruns5,194 bytesinternal/cli/playscan.goruns8,616 bytesinternal/cli/preflight.goruns19,069 bytesinternal/cli/preflight_test.goruns3,547 bytesinternal/cli/privacy.goruns5,706 bytesinternal/cli/root.goruns2,075 bytesinternal/cli/scan.goruns2,668 bytesinternal/cli/verify.goruns15,053 bytesinternal/cli/verify_test.goruns1,145 bytesinternal/cli/version.goruns786 bytesinternal/cli/version_test.goruns753 bytesinternal/codescan/claims.goruns3,287 bytesinternal/codescan/config.goruns5,322 bytesinternal/codescan/config_test.goruns2,653 bytesinternal/codescan/rules.goruns26,739 bytesinternal/codescan/rules_crypto.goruns10,560 bytesinternal/codescan/rules_crypto_test.goruns9,308 bytesinternal/codescan/rules_test.goruns12,286 bytesinternal/codescan/scanner.goruns5,774 bytesinternal/codescan/types.goruns2,874 bytesinternal/config/config.goruns2,550 bytesinternal/guidelines/data/guidelines.jsonasset21,415 bytesinternal/guidelines/guidelines.goruns1,900 bytesinternal/ipa/inspect.goruns14,940 bytesinternal/ipa/inspect_test.goruns4,640 bytesinternal/playscan/archive.goruns14,898 bytesinternal/playscan/archive_test.goruns40,824 bytesinternal/playscan/axml.goruns14,014 bytesinternal/playscan/gradle.goruns13,979 bytesinternal/playscan/manifest.goruns9,683 bytesinternal/playscan/protoxml.goruns8,120 bytesinternal/playscan/rules.goruns29,577 bytesinternal/playscan/rules_test.goruns4,071 bytesinternal/playscan/scanner.goruns9,806 bytesinternal/playscan/scanner_test.goruns36,428 bytesinternal/playscan/types.goruns2,649 bytesinternal/preflight/metadata.goruns12,658 bytesinternal/preflight/platform.goruns2,575 bytesinternal/preflight/runner.goruns9,753 bytesinternal/preflight/runner_test.goruns9,012 bytesinternal/privacy/scanner.goruns11,779 bytesinternal/privacy/scanner_test.goruns1,198 bytesinternal/report/report.goruns4,866 bytesinternal/revyl/client.goruns15,592 bytesinternal/revyl/client_test.goruns4,741 bytesinternal/sarif/sarif.goruns4,239 bytesinternal/sarif/sarif_test.goruns3,625 bytesinternal/verify/flows.goruns3,770 bytesinternal/verify/render.goruns2,256 bytesinternal/verify/runner.goruns18,315 bytesinternal/verify/runner_test.goruns3,030 bytesmetadata.jsonasset1,142 bytes
Read SKILL.md
# The greenlight skill has moved
It now lives at [`skills/greenlight/SKILL.md`](skills/greenlight/SKILL.md).
Claude Code discovers a plugin's skills under `skills/<name>/SKILL.md`. While
this file sat at the repo root, `/plugin install greenlight` installed a plugin
that provided nothing.
This pointer stays because people look for `SKILL.md` here (see
[#3](https://github.com/RevylAI/greenlight/issues/3)).
## Install
```bash
# In Claude CodeView the complete source on GitHubapp-store-preflight-compliance
When your agent uses it
Pre-submission compliance scanner workflow for Apple App Store apps. Use when reviewing iOS, macOS, tvOS, watchOS, or visionOS projects (Swift, Objective-C, React Native, Expo) for App Store rejection risks, submission readiness, privacy compliance, or guideline violations.
What it loads into context
Frontmatter
69 tokensAlways available to the agent
SKILL.md
594 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Workflow
- Step 1: Run Scan
- Step 2: Fix Findings
- Step 3: Re-Run Until GREENLIT
- Useful Commands
- Attribution
Files
SKILL.mdcore2,477 bytesSKILL.mdcore2,477 bytesSKILL.mdcore2,477 bytesSKILL.mdcore2,477 bytesSKILL.mdcore2,477 bytesSKILL.mdcore2,477 bytesSKILL.mdcore2,477 bytesagents/openai.yamlasset263 bytes
Read SKILL.md
# App Store Preflight Compliance
Run Greenlight checks, fix findings, and repeat until the project reaches GREENLIT status.
## Workflow
1. Run `greenlight preflight` at the project root.
2. Triage findings by severity (`CRITICAL`, then `WARN`, then `INFO`).
3. Apply concrete code/configuration fixes.
4. Re-run and continue until no `CRITICAL` findings remain.
## Step 1: Run Scan
```bashView the complete source on GitHubgreenlight
When your agent uses it
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, restricted permissions, or when a user asks about App Store guidelines or Google Play Developer Program Policies.
What it loads into context
Frontmatter
138 tokensAlways available to the agent
SKILL.md
1,600 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Step 1: Run the scan
- Step 2: Read the output and fix every issue
- Step 3: Re-run and repeat
- Severity Levels
- Step 4 (optional): Validate flow-dependent guidelines at runtime
- Other CLI Commands
- About
Files
SKILL.mdcore6,729 bytesSKILL.mdcore6,729 bytesSKILL.mdcore6,729 bytesSKILL.mdcore6,729 bytesSKILL.mdcore6,729 bytesSKILL.mdcore6,729 bytesSKILL.mdcore6,729 bytesSKILL.mdcore6,729 bytes
Read SKILL.md
# Greenlight — App Store Pre-Submission Scanner
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.
## Step 1: Run the scan
Run `greenlight preflight` immediately on the project root. Do NOT try to install greenlight — it is already available in PATH. Just run it:
```bash
greenlight preflight .
```
If the user has a built IPA, include it:
```bashView the complete source on GitHubSkills included
- app-store-preflight-compliance
- greenlight
Repository facts
- License
- MIT
- Created
- Feb 11, 2026
- Last pushed
- Aug 5, 2026
- Forks
- 148
- Open issues
- 2
- Project activity
- Slowing
Rank over the last 12 weeks
Now #473 · best #339 · down 72 in 30 days
- #466 on Nov 1
- #467 on Nov 2
- #468 on Nov 3
- #470 on Nov 4
- #471 on Nov 5
- #473 since Nov 6
55 earlier periods
- #322 on Aug 2
- #328 from Aug 7 to Aug 8
- #327 on Aug 9
- #337 on Aug 10
- #338 on Aug 11
- #331 on Aug 12
- #337 on Aug 13
- #336 on Aug 15
- #339 on Aug 16
- #340 on Aug 17
- #348 on Aug 19
- #345 on Aug 20
- #348 on Aug 21
- #345 on Aug 22
- #348 on Aug 23
- #353 on Aug 24
- #354 from Aug 27 to Aug 28
- #348 on Aug 30
- #357 on Aug 31
- #365 on Sep 1
- #360 on Sep 2
- #364 on Sep 3
- #363 on Sep 5
- #360 on Sep 6
- #366 on Sep 11
- #372 on Sep 12
- #371 on Sep 13
- #375 on Sep 14
- #379 on Sep 15
- #377 on Sep 18
- #380 on Sep 21
- #384 on Sep 22
- #380 on Sep 23
- #378 on Sep 25
- #379 on Sep 27
- #383 on Sep 28
- #393 on Sep 29
- #380 on Oct 4
- #401 on Oct 8
- #413 on Oct 9
- #402 on Oct 10
- #405 on Oct 11
- #413 on Oct 12
- #415 on Oct 14
- #424 on Oct 16
- #417 on Oct 17
- #421 on Oct 18
- #426 on Oct 19
- #432 on Oct 20
- #436 on Oct 21
- #430 on Oct 24
- #452 on Oct 25
- #460 on Oct 28
- #463 on Oct 29
- #465 from Oct 30 to Oct 31
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 3, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 15 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedcodex-skill/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedcodex-skill/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedcodex-skill/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedcodex-skill/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedcodex-skill/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedcodex-skill/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/greenlight/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/greenlight/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/greenlight/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/greenlight/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/greenlight/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/greenlight/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/greenlight/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 2 dangerous shell commandsin 2 files: Makefile:14 internal/revyl/client.go:23
- 164 network referencesin 28 files: internal/asc/session_auth.go:14 README.md:3 metadata.json:5 and 25 more
- No hidden or obfuscated text
- No instruction overrides
- 63 executable scriptsin 63 files: Makefile:1 cmd/greenlight/main.go:1 internal/asc/apps.go:1 and 60 more
- 5 references to secretsin 5 files: .gitignore:5 .goreleaser.yml:56 internal/codescan/rules.go:34 and 2 more
- No requests to vote in Hot
Show all 234 signals by file
.claude-plugin/plugin.json
- Network accessline 6
"author": { "name": "revylai", "url": "https://revyl.com" - Network accessline 7
"name": "revylai", "url": "https://revyl.com" }, - Network accessline 8
"url": "https://revyl.com" - Network accessline 9
}, "homepage": "https://github.com/RevylAI/greenlight", "repository": "https://github.com/RevylAI/greenlight", - Network accessline 10
"homepage": "https://github.com/RevylAI/greenlight", - Network accessline 11
"repository": "https://github.com/RevylAI/greenlight",
.gitignore
- Access to secretsline 5
[Credential-related source omitted]
.goreleaser.yml
README.md
- Network accessline 3
[](https://github.com/RevylAI/greenlight/releases) - Network accessline 4
[](LICENSE) - Network accessline 5
[](go.mod) - Network accessline 6
[](https://revyl.com?utm_source=greenlight&utm_medium=readme&utm_campaign=badge) - Network accessline 12
A static scan can only prove a flow *exists*. `greenlight verify` proves it *works*: it runs your account-deletion, restore-purchases, and Sign in with Apple flows on a cloud device and fails the build if any of them dead-ends. That tier is - Network accessline 23
# Build from source git clone https://github.com/RevylAI/greenlight.git - Network accessline 24
git clone https://github.com/RevylAI/greenlight.git - Network accessline 220
Static checks confirm a flow *exists* in your source. `verify` confirms it *works*, by handing flow-dependent guidelines to the [Revyl](https://revyl.com?utm_source=greenlight&utm_medium=readme&utm_campaign=verify) CLI and running them on a - Network accessline 251
Unlike every other command here, `verify` is not offline: it needs the [`revyl` CLI](https://docs.revyl.com), an account, and either a registered build or a local artifact passed to `--artifact`. Revyl runs cloud simulators and emulators, s - Network accessline 308
That is what `greenlight verify` does, and it is why [Revyl](https://revyl.com?utm_source=greenlight&utm_medium=readme&utm_campaign=static-ceiling) exists. Revyl runs mobile tests written in plain English on cloud devices, so the check is " - Network accessline 314
Start with `--dry-run`. It generates the tests and prints them without touching a device or needing an account, so you can see whether the runtime tier is worth it before you [sign up](https://app.revyl.ai/signup?utm_source=greenlight&utm_m - Network accessline 418
Greenlight catches App Store rejections. [Revyl](https://revyl.com?utm_source=greenlight&utm_medium=readme&utm_campaign=footer) catches the bugs that get through. - Network accessline 422
[Start free](https://app.revyl.ai/signup?utm_source=greenlight&utm_medium=readme&utm_campaign=footer) · [Docs](https://docs.revyl.com) · [revyl.com](https://revyl.com?utm_source=greenlight&utm_medium=readme&utm_campaign=footer) - Network accessline 424
As a little easter egg for reading this far, here is one month of Revyl free: [`ng32jDS9`](https://app.revyl.ai/signup?promo=ng32jDS9&utm_source=greenlight&utm_medium=readme&utm_campaign=easter-egg) :)
RELEASING.md
- Network accessline 3
Releases are automated with [GoReleaser](https://goreleaser.com) via - Network accessline 34
`brew install revylai/tap/greenlight` is backed by [`RevylAI/homebrew-tap`](https://github.com/RevylAI/homebrew-tap). - Network accessline 35
[`RevylAI/homebrew-tap`](https://github.com/RevylAI/homebrew-tap).
SKILL.md
cmd/greenlight/main.go
- Executable scriptline 1
Executable file
codex-skill/SKILL.md
- Network accessline 38
# Build from source git clone https://github.com/RevylAI/greenlight.git - Network accessline 39
git clone https://github.com/RevylAI/greenlight.git - Network accessline 59
- Rewrite vague purpose strings with concrete app behavior. - Replace hardcoded IPs with hostnames. - Replace `http://` URLs with `https://`. - Network accessline 60
- Replace hardcoded IPs with hostnames. - Replace `http://` URLs with `https://`. - Remove debug logs or gate them behind development flags. - Network accessline 61
- Replace `http://` URLs with `https://`. - Network accessline 85
Original project and workflow: [RevylAI/greenlight](https://github.com/RevylAI/greenlight).
internal/asc/apps.go
- Executable scriptline 1
Executable file
internal/asc/auth.go
- Executable scriptline 1
Executable file
internal/asc/client.go
- Executable scriptline 1
Executable file - Network accessline 11
const baseURL = "https://api.appstoreconnect.apple.com/v1" - Network accessline 15
issuerID string keyPath string httpClient *http.Client - Network accessline 16
keyPath string httpClient *http.Client token string - Network accessline 17
httpClient *http.Client - Network accessline 25
issuerID: issuerID, keyPath: privateKeyPath, httpClient: &http.Client{ - Network accessline 26
keyPath: privateKeyPath, httpClient: &http.Client{ Timeout: 30 * time.Second, - Network accessline 27
httpClient: &http.Client{
internal/asc/session_auth.go
- Executable scriptline 1
Executable file - Network accessline 14
const ( appleAuthURL = "https://idmsa.apple.com/appleauth/auth" - Network accessline 15
appleAuthURL = "https://idmsa.apple.com/appleauth/auth" - Network accessline 16
ascSessionURL = "https://appstoreconnect.apple.com/olympus/v1/session" - Network accessline 21
AppleID string `json:"apple_id" SessionID string `json:"session_id" Scnt string `json:"scnt" Cookies []*SerializedCookie `json:"cookies" TeamID string `json:"team_id,o - Network accessline 26
ProviderID string `json:"provider_id,omitempty"` ExpiresAt time.Time `json:"expires_at"` httpClient *http.Client - Network accessline 27
ExpiresAt time.Time `json:"expires_at"` httpClient *http.Client } - Network accessline 28
httpClient *http.Client - Network accessline 89
func SignIn(appleID, password string) (*Session, error) { jar, _ := cookiejar.New(nil) client := &http.Client{ - Network accessline 90
jar, _ := cookiejar.New(nil) client := &http.Client{ Jar: jar, - Network accessline 91
client := &http.Client{ - Network accessline 292
var cookies []*SerializedCookie domains := []string{ "https://idmsa.apple.com", - Network accessline 293
domains := []string{ "https://idmsa.apple.com", "https://appstoreconnect.apple.com", - Network accessline 294
"https://idmsa.apple.com", - Network accessline 295
"https://appstoreconnect.apple.com", - Network accessline 296
"https://apple.com",
internal/checks/runner.go
- Executable scriptline 1
Executable file
internal/checks/tier1_metadata.go
internal/checks/tier2_content.go
- Executable scriptline 1
Executable file
internal/checks/types.go
- Executable scriptline 1
Executable file
internal/cli/auth.go
- Executable scriptline 1
Executable file
internal/cli/codescan.go
- Executable scriptline 1
Executable file - Network accessline 17
const greenlightInfoURI = "https://github.com/RevylAI/greenlight" - Network accessline 312
dim.Fprintln(w, " Catch more than rejections. Catch bugs.") fmt.Fprint(w, " ") color.New(color.Underline).Fprintln(w, "https://revyl.com") - Network accessline 313
fmt.Fprint(w, " ") color.New(color.Underline).Fprintln(w, "https://revyl.com") fmt.Fprintln(w) - Network accessline 314
color.New(color.Underline).Fprintln(w, "https://revyl.com")
internal/cli/guidelines.go
- Executable scriptline 1
Executable file
internal/cli/ipa.go
- Executable scriptline 1
Executable file - Network accessline 184
dim.Fprintln(os.Stdout, " Catch more than rejections. Catch bugs.") fmt.Fprint(os.Stdout, " ") color.New(color.Underline).Fprintln(os.Stdout, "https://revyl.com") - Network accessline 185
fmt.Fprint(os.Stdout, " ") color.New(color.Underline).Fprintln(os.Stdout, "https://revyl.com") fmt.Println() - Network accessline 186
color.New(color.Underline).Fprintln(os.Stdout, "https://revyl.com")
internal/cli/playscan.go
- Executable scriptline 1
Executable file
internal/cli/preflight.go
- Executable scriptline 1
Executable file - Network accessline 493
dim.Fprintln(w, " Catch more than rejections. Catch bugs.") fmt.Fprint(w, " ") color.New(color.Underline).Fprintln(w, "https://revyl.com") - Network accessline 494
fmt.Fprint(w, " ") color.New(color.Underline).Fprintln(w, "https://revyl.com") fmt.Fprintln(w) - Network accessline 495
color.New(color.Underline).Fprintln(w, "https://revyl.com")
internal/cli/preflight_test.go
- Executable scriptline 1
Executable file
internal/cli/privacy.go
- Executable scriptline 1
Executable file - Network accessline 205
dim.Fprintln(os.Stdout, " Catch more than rejections. Catch bugs.") fmt.Fprint(os.Stdout, " ") color.New(color.Underline).Fprintln(os.Stdout, "https://revyl.com") - Network accessline 206
fmt.Fprint(os.Stdout, " ") color.New(color.Underline).Fprintln(os.Stdout, "https://revyl.com") fmt.Println() - Network accessline 207
color.New(color.Underline).Fprintln(os.Stdout, "https://revyl.com")
internal/cli/root.go
- Executable scriptline 1
Executable file
internal/cli/scan.go
- Executable scriptline 1
Executable file
internal/cli/verify.go
- Executable scriptline 1
Executable file - Network accessline 406
dim.Fprintln(w, " Static catches rejections. Revyl catches broken flows.") fmt.Fprint(w, " ") color.New(color.Underline).Fprintln(w, "https://revyl.com") - Network accessline 407
fmt.Fprint(w, " ") color.New(color.Underline).Fprintln(w, "https://revyl.com") fmt.Fprintln(w) - Network accessline 408
color.New(color.Underline).Fprintln(w, "https://revyl.com")
internal/cli/verify_test.go
- Executable scriptline 1
Executable file
internal/cli/version.go
- Executable scriptline 1
Executable file
internal/cli/version_test.go
- Executable scriptline 1
Executable file
internal/codescan/claims.go
- Executable scriptline 1
Executable file
internal/codescan/config.go
- Executable scriptline 1
Executable file
internal/codescan/config_test.go
- Executable scriptline 1
Executable file
internal/codescan/rules.go
- Executable scriptline 1
Executable file - Access to secretsline 34
[Credential-related source omitted] - Network accessline 239
languages: []string{"swift", "objc", "typescript", "javascript"}, patterns: []*regexp.Regexp{ regexp.MustCompile(`"http://[^"]+"`), - Network accessline 240
patterns: []*regexp.Regexp{ regexp.MustCompile(`"http://[^"]+"`), regexp.MustCompile(`'http://[^']+'`), - Network accessline 241
regexp.MustCompile(`"http://[^"]+"`), - Network accessline 242
regexp.MustCompile(`'http://[^']+'`), - Network accessline 243
}, ignorePatterns: []*regexp.Regexp{ regexp.MustCompile(`(?i)(localhost|127\.0\.0\.1|0\.0\.0\.0|http://example)`), - Network accessline 244
ignorePatterns: []*regexp.Regexp{ regexp.MustCompile(`(?i)(localhost|127\.0\.0\.1|0\.0\.0\.0|http://example)`), regexp.MustCompile(`(?i)(w3\.org|xmlns|DTD|doctype)`), // XML/SVG namespace URIs and DTD references are identifiers, not - Network accessline 245
regexp.MustCompile(`(?i)(localhost|127\.0\.0\.1|0\.0\.0\.0|http://example)`), regexp.MustCompile(`(?i)(w3\.org|xmlns|DTD|doctype)`), // XML/SVG namespace URIs and DTD references are identifiers, not network requests },
internal/codescan/rules_crypto.go
- Executable scriptline 1
Executable file
internal/codescan/rules_crypto_test.go
- Executable scriptline 1
Executable file - Network accessline 158
tsCtx(`const APPLINK = "applinks:unigox.com";`), // the app's own brand jsonCtx(` "@unigox/web-app-shared": "1.0.0",`), // scoped brand package tsCtx(`const api = "https://api.coinbase.com/v2/prices";`), - Network accessline 159
jsonCtx(` "@unigox/web-app-shared": "1.0.0",`), // scoped brand package tsCtx(`const api = "https://api.coinbase.com/v2/prices";`), tsCtx(`const url = "https://www.binance.com/en";`), - Network accessline 160
tsCtx(`const api = "https://api.coinbase.com/v2/prices";`), - Network accessline 161
tsCtx(`const url = "https://www.binance.com/en";`), - Network accessline 162
tsCtx(`const ex = "https://crypto.com/exchange";`), - Network accessline 172
noFire := []FileContext{ tsCtx(`const ai = "https://gemini.google.com/app";`), // Google Gemini, not the exchange - Network accessline 173
tsCtx(`const ai = "https://gemini.google.com/app";`), // Google Gemini, not the exchange - Network accessline 174
tsCtx(`const repo = "https://stargate.io/docs";`), // \bgate anchored, "stargate" excluded
internal/codescan/rules_test.go
- Executable scriptline 1
Executable file
internal/codescan/scanner.go
- Executable scriptline 1
Executable file
internal/codescan/types.go
- Executable scriptline 1
Executable file
internal/config/config.go
internal/guidelines/guidelines.go
- Executable scriptline 1
Executable file
internal/ipa/inspect.go
- Executable scriptline 1
Executable file
internal/ipa/inspect_test.go
- Executable scriptline 1
Executable file
internal/playscan/archive.go
- Executable scriptline 1
Executable file
internal/playscan/archive_test.go
- Executable scriptline 1
Executable file
internal/playscan/axml.go
- Executable scriptline 1
Executable file
internal/playscan/gradle.go
internal/playscan/manifest.go
- Executable scriptline 1
Executable file
internal/playscan/protoxml.go
- Executable scriptline 1
Executable file
internal/playscan/rules.go
- Executable scriptline 1
Executable file - Network accessline 12
const ( docTargetAPI = "https://support.google.com/googleplay/android-developer/answer/11926878" - Network accessline 13
docTargetAPI = "https://support.google.com/googleplay/android-developer/answer/11926878" - Network accessline 14
docBillingDeprecat = "https://developer.android.com/google/play/billing/deprecation-faq" - Network accessline 15
docRestrictedPerms = "https://support.google.com/googleplay/android-developer/answer/14115180" - Network accessline 16
docForegroundSvc = "https://support.google.com/googleplay/android-developer/answer/13392821" - Network accessline 17
docAccountDeletion = "https://support.google.com/googleplay/android-developer/answer/13327111" - Network accessline 18
docAdvertisingID = "https://support.google.com/googleplay/android-developer/answer/6048248" - Network accessline 19
docAppContent = "https://support.google.com/googleplay/android-developer/answer/9859455" - Network accessline 20
docProgramPolicy = "https://support.google.com/googleplay/android-developer/answer/16810878" - Network accessline 21
docJul2026Policy = "https://support.google.com/googleplay/android-developer/answer/17134731" - Network accessline 22
docPageSizes = "https://developer.android.com/guide/practices/page-sizes" - Network accessline 23
doc64Bit = "https://developer.android.com/google/play/requirements/64-bit"
internal/playscan/rules_test.go
- Executable scriptline 1
Executable file
internal/playscan/scanner.go
- Executable scriptline 1
Executable file
internal/playscan/scanner_test.go
internal/playscan/types.go
- Executable scriptline 1
Executable file
internal/preflight/metadata.go
- Executable scriptline 1
Executable file
internal/preflight/platform.go
- Executable scriptline 1
Executable file
internal/preflight/runner.go
- Executable scriptline 1
Executable file
internal/preflight/runner_test.go
- Executable scriptline 1
Executable file - Network accessline 52
mustWrite(t, root, "app/build.gradle", "android {\n defaultConfig {\n targetSdk = 30\n }\n}\n") mustWrite(t, root, "app/src/main/AndroidManifest.xml", `<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.and - Network accessline 53
mustWrite(t, root, "app/src/main/AndroidManifest.xml", `<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app"> <uses-permission android:name="android.permis - Network accessline 54
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app"> - Network accessline 121
mustWrite(t, root, "app/build.gradle", "android {\n defaultConfig {\n targetSdk = 36\n }\n}\n") mustWrite(t, root, "app/src/main/AndroidManifest.xml", `<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.and - Network accessline 122
mustWrite(t, root, "app/src/main/AndroidManifest.xml", `<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app"> <application /> - Network accessline 123
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app"> - Network accessline 145
mustWrite(t, root, "android/app/build.gradle", "android {\n defaultConfig {\n targetSdk = 30\n }\n}\n") mustWrite(t, root, "android/app/src/main/AndroidManifest.xml", `<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht - Network accessline 146
mustWrite(t, root, "android/app/src/main/AndroidManifest.xml", `<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.demo"> <application /> - Network accessline 147
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.demo"> - Network accessline 200
mustWrite(t, root, "android/app/build.gradle", "android { defaultConfig { targetSdk = 36 } }") mustWrite(t, root, "android/app/src/main/AndroidManifest.xml", `<manifest xmlns:android="http://schemas.android.com/apk/res/android" packa - Network accessline 201
mustWrite(t, root, "android/app/src/main/AndroidManifest.xml", `<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.x"><application /></manifest>`) mustWrite(t, root, signal, "{}") - Network accessline 202
`<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.x"><application /></manifest>`)
internal/privacy/scanner.go
- Executable scriptline 1
Executable file
internal/privacy/scanner_test.go
- Executable scriptline 1
Executable file
internal/report/report.go
- Executable scriptline 1
Executable file - Network accessline 107
dim.Fprintln(w, " Catch more than rejections. Catch bugs.") fmt.Fprint(w, " ") color.New(color.Underline).Fprintln(w, "https://revyl.com") - Network accessline 108
fmt.Fprint(w, " ") color.New(color.Underline).Fprintln(w, "https://revyl.com") fmt.Fprintln(w) - Network accessline 109
color.New(color.Underline).Fprintln(w, "https://revyl.com")
internal/revyl/client.go
- Executable scriptline 1
Executable file - Network accessline 21
const ( SignupURL = "https://app.revyl.ai/signup?utm_source=greenlight&utm_medium=cli&utm_campaign=verify" InstallCmd = "curl -fsSL https://revyl.com/install.sh | sh" - Network accessline 22
SignupURL = "https://app.revyl.ai/signup?utm_source=greenlight&utm_medium=cli&utm_campaign=verify" InstallCmd = "curl -fsSL https://revyl.com/install.sh | sh" LoginCmd = "revyl auth login" - Dangerous shell operationline 23
InstallCmd = "curl -fsSL https://revyl.com/install.sh | sh" - Network accessline 23
InstallCmd = "curl -fsSL https://revyl.com/install.sh | sh" - Network accessline 56
return nil } return fmt.Errorf("revyl CLI not found or not executable (looked for %q): install it (https://docs.revyl.com) or pass --revyl <path>", c.Bin) - Network accessline 57
} return fmt.Errorf("revyl CLI not found or not executable (looked for %q): install it (https://docs.revyl.com) or pass --revyl <path>", c.Bin) } - Network accessline 58
return fmt.Errorf("revyl CLI not found or not executable (looked for %q): install it (https://docs.revyl.com) or pass --revyl <path>", c.Bin) - Network accessline 241
// best-effort (empty until the session registers). Format: // // https://app.revyl.ai/sessions/<session_id>?wfr=<execution_id> - Network accessline 243
// https://app.revyl.ai/sessions/<session_id>?wfr=<execution_id> - Network accessline 258
return "" } return fmt.Sprintf("https://app.revyl.ai/sessions/%s?wfr=%s", r.SessionID, r.ExecutionID) - Network accessline 259
} return fmt.Sprintf("https://app.revyl.ai/sessions/%s?wfr=%s", r.SessionID, r.ExecutionID) } - Network accessline 260
return fmt.Sprintf("https://app.revyl.ai/sessions/%s?wfr=%s", r.SessionID, r.ExecutionID) - Access to secretsline 391
[Credential-related source omitted]
internal/revyl/client_test.go
- Executable scriptline 1
Executable file - Network accessline 16
"passed_steps": 0, "execution_id": "b990b41a-f777-4239-8701-65535e3cf565", "report_url": "https://app.revyl.ai/tests/report?taskId=b990b41a-f777-4239-8701-65535e3cf565", - Network accessline 17
"execution_id": "b990b41a-f777-4239-8701-65535e3cf565", "report_url": "https://app.revyl.ai/tests/report?taskId=b990b41a-f777-4239-8701-65535e3cf565", "steps": [ - Network accessline 18
"report_url": "https://app.revyl.ai/tests/report?taskId=b990b41a-f777-4239-8701-65535e3cf565", - Network accessline 34
"total_steps": 1, "passed_steps": 1, "report_url": "https://app.revyl.ai/tests/report?taskId=abc", - Network accessline 35
"passed_steps": 1, "report_url": "https://app.revyl.ai/tests/report?taskId=abc", "steps": [ - Network accessline 36
"report_url": "https://app.revyl.ai/tests/report?taskId=abc", - Network accessline 52
"failed_steps": 0, "passed_steps": 0, "report_url": "https://app.revyl.ai/tests/report?taskId=1a04ac9e-894e-48f2-8ef3-54692700feb4", - Network accessline 53
"passed_steps": 0, "report_url": "https://app.revyl.ai/tests/report?taskId=1a04ac9e-894e-48f2-8ef3-54692700feb4", "steps": [] - Network accessline 54
"report_url": "https://app.revyl.ai/tests/report?taskId=1a04ac9e-894e-48f2-8ef3-54692700feb4",
internal/sarif/sarif.go
internal/sarif/sarif_test.go
internal/verify/flows.go
- Executable scriptline 1
Executable file
internal/verify/render.go
- Executable scriptline 1
Executable file - Network accessline 8
// renderTestYAML produces a Revyl test YAML document for a flow, matching the // schema at https://docs.revyl.com/appendix/yaml-test-format. The test name is - Network accessline 9
// schema at https://docs.revyl.com/appendix/yaml-test-format. The test name is
internal/verify/runner.go
- Executable scriptline 1
Executable file
internal/verify/runner_test.go
- Executable scriptline 1
Executable file
metadata.json
- Network accessline 5
"organization": { "name": "Revyl", "url": "https://revyl.com" - Network accessline 6
"name": "Revyl", "url": "https://revyl.com" }, - Network accessline 7
"url": "https://revyl.com" - Network accessline 8
}, "references": [ "https://developer.apple.com/app-store/review/guidelines/", - Network accessline 9
"references": [ "https://developer.apple.com/app-store/review/guidelines/", "https://developer.apple.com/design/human-interface-guidelines/", - Network accessline 10
"https://developer.apple.com/app-store/review/guidelines/", - Network accessline 11
"https://developer.apple.com/design/human-interface-guidelines/", - Network accessline 12
"https://developer.apple.com/documentation/storekit", - Network accessline 13
"https://developer.apple.com/documentation/apptrackingtransparency", - Network accessline 14
"https://developer.apple.com/documentation/localauthentication", - Network accessline 15
"https://developer.apple.com/documentation/networkextension/nevpnmanager", - Network accessline 16
"https://developer.apple.com/help/app-store-connect/", - Network accessline 17
"https://support.google.com/googleplay/android-developer/answer/16810878", - Network accessline 18
"https://developer.android.com/google/play/requirements/target-sdk"
skills/greenlight/SKILL.md
- Network accessline 38
# Build from source git clone https://github.com/RevylAI/greenlight.git - Network accessline 39
git clone https://github.com/RevylAI/greenlight.git - Network accessline 58
- **Vague purpose strings** → Rewrite to explain specifically WHY the app needs the permission (not just "Camera needed" but "PostureGuard uses your camera to analyze sitting posture in real-time") - **Hardcoded IPv4** → Replace IP addresse - Network accessline 59
- **Hardcoded IPv4** → Replace IP addresses with proper hostnames - **HTTP URLs** → Change `http://` to `https://` - **Console logs** → Remove or gate behind `__DEV__` flag - Network accessline 60
- **HTTP URLs** → Change `http://` to `https://` - Network accessline 137
**Greenlight** is built by [Revyl](https://revyl.com) — the mobile reliability platform.
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 7 facts
- Contacts api.appstoreconnect.apple.com, which SKILL.md, the README and the plugin manifest do not mentioninternal/asc/client.go:11High confidence
- Contacts idmsa.apple.com, which SKILL.md, the README and the plugin manifest do not mentioninternal/asc/session_auth.go:15High confidence
- Contacts appstoreconnect.apple.com, which SKILL.md, the README and the plugin manifest do not mentioninternal/asc/session_auth.go:16High confidence
- Contacts apple.com, which SKILL.md, the README and the plugin manifest do not mentioninternal/asc/session_auth.go:296High confidence
- Contacts support.google.com, which SKILL.md, the README and the plugin manifest do not mentioninternal/playscan/rules.go:13High confidence
- Contacts developer.android.com, which SKILL.md, the README and the plugin manifest do not mentioninternal/playscan/rules.go:14High confidence
- Contacts json.schemastore.org, which SKILL.md, the README and the plugin manifest do not mentioninternal/sarif/sarif.go:24High confidence
Signal confidence: 209 facts
- Executable script in code of a file that runsMakefile:1High confidence
- Dangerous shell operation in code of a file that runsMakefile:14High confidence
- Network access in prose of documentationREADME.md:3Low confidence
- Network access in prose of documentationREADME.md:4Low confidence
- Network access in prose of documentationREADME.md:5Low confidence
- Network access in prose of documentationREADME.md:6Low confidence
- Network access in prose of documentationREADME.md:12Low confidence
- Network access in code of documentationREADME.md:23Low confidence
- Network access in code of documentationREADME.md:24Low confidence
- Network access in prose of documentationREADME.md:220Low confidence
- Network access in prose of documentationREADME.md:251Low confidence
- Network access in prose of documentationREADME.md:308Low confidence
- Network access in prose of documentationREADME.md:314Low confidence
- Network access in prose of documentationREADME.md:418Low confidence
- Network access in prose of documentationREADME.md:422Low confidence
- Network access in prose of documentationREADME.md:424Low confidence
- Network access in prose of documentationRELEASING.md:3Low confidence
- Network access in prose of documentationRELEASING.md:34Low confidence
- Network access in prose of documentationRELEASING.md:35Low confidence
- Network access in prose of the SKILL.mdSKILL.md:9Low confidence
- Network access in prose of the SKILL.mdSKILL.md:10Low confidence
- Executable script in code of a file that runscmd/greenlight/main.go:1High confidence
- Network access in code of the SKILL.mdcodex-skill/SKILL.md:38High confidence
- Network access in code of the SKILL.mdcodex-skill/SKILL.md:39High confidence
- Network access in prose of the SKILL.mdcodex-skill/SKILL.md:59Low confidence
- Network access in prose of the SKILL.mdcodex-skill/SKILL.md:60Low confidence
- Network access in prose of the SKILL.mdcodex-skill/SKILL.md:61Low confidence
- Network access in prose of the SKILL.mdcodex-skill/SKILL.md:85Low confidence
- Executable script in code of a file that runsinternal/asc/apps.go:1High confidence
- Executable script in code of a file that runsinternal/asc/auth.go:1High confidence
- Executable script in code of a file that runsinternal/asc/client.go:1High confidence
- Network access in code of a file that runsinternal/asc/client.go:11High confidence
- Network access in code of a file that runsinternal/asc/client.go:15High confidence
- Network access in code of a file that runsinternal/asc/client.go:16High confidence
- Network access in code of a file that runsinternal/asc/client.go:17High confidence
- Network access in code of a file that runsinternal/asc/client.go:25High confidence
- Network access in code of a file that runsinternal/asc/client.go:26High confidence
- Network access in code of a file that runsinternal/asc/client.go:27High confidence
- Executable script in code of a file that runsinternal/asc/session_auth.go:1High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:14High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:15High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:16High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:21High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:26High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:27High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:28High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:89High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:90High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:91High confidence
- Network access in code of a file that runsinternal/asc/session_auth.go:292High confidence
and 159 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md codex-skill/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md codex-skill/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md codex-skill/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md codex-skill/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md codex-skill/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/revylai-greenlight/)