#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

Compare on GitHub

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.

Compare on GitHub

codex-skill/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Instructions only

fcb36e395bd4 → fcb36e395bd4

Compare on GitHub

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.

Compare on GitHub

skills/greenlight/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Instructions only

fcb36e395bd4 → fcb36e395bd4

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
2.5kGitHub stars
7stars in 7 days
3skills in this repository
0commits in 30 days

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

Aug 2, 2026Nov 6, 20262,466

Individual skills in this repository

How it works

When your agent uses it

What it loads into context

Frontmatter

0 tokens

Always available to the agent

SKILL.md

177 tokens

When the skill is activated

Reference documents

5,961 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Install

Scripts executed separately

  • Makefile
  • cmd/greenlight/main.go
  • internal/asc/apps.go
  • internal/asc/auth.go
  • internal/asc/client.go
  • internal/asc/session_auth.go
  • internal/checks/runner.go
  • internal/checks/tier1_metadata.go
  • internal/checks/tier2_content.go
  • internal/checks/types.go
  • internal/cli/auth.go
  • internal/cli/codescan.go
  • internal/cli/guidelines.go
  • internal/cli/ipa.go
  • internal/cli/playscan.go
  • internal/cli/preflight.go
  • internal/cli/preflight_test.go
  • internal/cli/privacy.go
  • internal/cli/root.go
  • internal/cli/scan.go
  • internal/cli/verify.go
  • internal/cli/verify_test.go
  • internal/cli/version.go
  • internal/cli/version_test.go
  • internal/codescan/claims.go
  • internal/codescan/config.go
  • internal/codescan/config_test.go
  • internal/codescan/rules.go
  • internal/codescan/rules_crypto.go
  • internal/codescan/rules_crypto_test.go
  • internal/codescan/rules_test.go
  • internal/codescan/scanner.go
  • internal/codescan/types.go
  • internal/config/config.go
  • internal/guidelines/guidelines.go
  • internal/ipa/inspect.go
  • internal/ipa/inspect_test.go
  • internal/playscan/archive.go
  • internal/playscan/archive_test.go
  • internal/playscan/axml.go
  • internal/playscan/gradle.go
  • internal/playscan/manifest.go
  • internal/playscan/protoxml.go
  • internal/playscan/rules.go
  • internal/playscan/rules_test.go
  • internal/playscan/scanner.go
  • internal/playscan/scanner_test.go
  • internal/playscan/types.go
  • internal/preflight/metadata.go
  • internal/preflight/platform.go
  • internal/preflight/runner.go
  • internal/preflight/runner_test.go
  • internal/privacy/scanner.go
  • internal/privacy/scanner_test.go
  • internal/report/report.go
  • internal/revyl/client.go
  • internal/revyl/client_test.go
  • internal/sarif/sarif.go
  • internal/sarif/sarif_test.go
  • internal/verify/flows.go
  • internal/verify/render.go
  • internal/verify/runner.go
  • internal/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 bytes
  • LICENSEasset1,062 bytes
  • Makefileruns762 bytes
  • README.mddoc21,285 bytes
  • RELEASING.mddoc3,051 bytes
  • SKILL.mdcore656 bytes
  • SKILL.mdcore656 bytes
  • SKILL.mdcore656 bytes
  • cmd/greenlight/main.goruns470 bytes
  • go.modasset488 bytes
  • go.sumasset2,694 bytes
  • internal/asc/apps.goruns7,969 bytes
  • internal/asc/auth.goruns1,329 bytes
  • internal/asc/client.goruns1,711 bytes
  • internal/asc/session_auth.goruns8,107 bytes
  • internal/checks/runner.goruns2,892 bytes
  • internal/checks/tier1_metadata.goruns18,148 bytes
  • internal/checks/tier2_content.goruns3,495 bytes
  • internal/checks/types.goruns1,859 bytes
  • internal/cli/auth.goruns7,407 bytes
  • internal/cli/codescan.goruns9,010 bytes
  • internal/cli/guidelines.goruns3,001 bytes
  • internal/cli/ipa.goruns5,194 bytes
  • internal/cli/playscan.goruns8,616 bytes
  • internal/cli/preflight.goruns19,069 bytes
  • internal/cli/preflight_test.goruns3,547 bytes
  • internal/cli/privacy.goruns5,706 bytes
  • internal/cli/root.goruns2,075 bytes
  • internal/cli/scan.goruns2,668 bytes
  • internal/cli/verify.goruns15,053 bytes
  • internal/cli/verify_test.goruns1,145 bytes
  • internal/cli/version.goruns786 bytes
  • internal/cli/version_test.goruns753 bytes
  • internal/codescan/claims.goruns3,287 bytes
  • internal/codescan/config.goruns5,322 bytes
  • internal/codescan/config_test.goruns2,653 bytes
  • internal/codescan/rules.goruns26,739 bytes
  • internal/codescan/rules_crypto.goruns10,560 bytes
  • internal/codescan/rules_crypto_test.goruns9,308 bytes
  • internal/codescan/rules_test.goruns12,286 bytes
  • internal/codescan/scanner.goruns5,774 bytes
  • internal/codescan/types.goruns2,874 bytes
  • internal/config/config.goruns2,550 bytes
  • internal/guidelines/data/guidelines.jsonasset21,415 bytes
  • internal/guidelines/guidelines.goruns1,900 bytes
  • internal/ipa/inspect.goruns14,940 bytes
  • internal/ipa/inspect_test.goruns4,640 bytes
  • internal/playscan/archive.goruns14,898 bytes
  • internal/playscan/archive_test.goruns40,824 bytes
  • internal/playscan/axml.goruns14,014 bytes
  • internal/playscan/gradle.goruns13,979 bytes
  • internal/playscan/manifest.goruns9,683 bytes
  • internal/playscan/protoxml.goruns8,120 bytes
  • internal/playscan/rules.goruns29,577 bytes
  • internal/playscan/rules_test.goruns4,071 bytes
  • internal/playscan/scanner.goruns9,806 bytes
  • internal/playscan/scanner_test.goruns36,428 bytes
  • internal/playscan/types.goruns2,649 bytes
  • internal/preflight/metadata.goruns12,658 bytes
  • internal/preflight/platform.goruns2,575 bytes
  • internal/preflight/runner.goruns9,753 bytes
  • internal/preflight/runner_test.goruns9,012 bytes
  • internal/privacy/scanner.goruns11,779 bytes
  • internal/privacy/scanner_test.goruns1,198 bytes
  • internal/report/report.goruns4,866 bytes
  • internal/revyl/client.goruns15,592 bytes
  • internal/revyl/client_test.goruns4,741 bytes
  • internal/sarif/sarif.goruns4,239 bytes
  • internal/sarif/sarif_test.goruns3,625 bytes
  • internal/verify/flows.goruns3,770 bytes
  • internal/verify/render.goruns2,256 bytes
  • internal/verify/runner.goruns18,315 bytes
  • internal/verify/runner_test.goruns3,030 bytes
  • metadata.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 Code
View the complete source on GitHub

Skills 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

  1. #466 on Nov 1
  2. #467 on Nov 2
  3. #468 on Nov 3
  4. #470 on Nov 4
  5. #471 on Nov 5
  6. #473 since Nov 6
55 earlier periods
  1. #322 on Aug 2
  2. #328 from Aug 7 to Aug 8
  3. #327 on Aug 9
  4. #337 on Aug 10
  5. #338 on Aug 11
  6. #331 on Aug 12
  7. #337 on Aug 13
  8. #336 on Aug 15
  9. #339 on Aug 16
  10. #340 on Aug 17
  11. #348 on Aug 19
  12. #345 on Aug 20
  13. #348 on Aug 21
  14. #345 on Aug 22
  15. #348 on Aug 23
  16. #353 on Aug 24
  17. #354 from Aug 27 to Aug 28
  18. #348 on Aug 30
  19. #357 on Aug 31
  20. #365 on Sep 1
  21. #360 on Sep 2
  22. #364 on Sep 3
  23. #363 on Sep 5
  24. #360 on Sep 6
  25. #366 on Sep 11
  26. #372 on Sep 12
  27. #371 on Sep 13
  28. #375 on Sep 14
  29. #379 on Sep 15
  30. #377 on Sep 18
  31. #380 on Sep 21
  32. #384 on Sep 22
  33. #380 on Sep 23
  34. #378 on Sep 25
  35. #379 on Sep 27
  36. #383 on Sep 28
  37. #393 on Sep 29
  38. #380 on Oct 4
  39. #401 on Oct 8
  40. #413 on Oct 9
  41. #402 on Oct 10
  42. #405 on Oct 11
  43. #413 on Oct 12
  44. #415 on Oct 14
  45. #424 on Oct 16
  46. #417 on Oct 17
  47. #421 on Oct 18
  48. #426 on Oct 19
  49. #432 on Oct 20
  50. #436 on Oct 21
  51. #430 on Oct 24
  52. #452 on Oct 25
  53. #460 on Oct 28
  54. #463 on Oct 29
  55. #465 from Oct 30 to Oct 31

Before you install

Network or broad shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • codex-skill/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • codex-skill/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • codex-skill/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • codex-skill/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • codex-skill/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • codex-skill/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/greenlight/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/greenlight/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/greenlight/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/greenlight/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/greenlight/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/greenlight/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/greenlight/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
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

  • Network accessline 55
    [Credential-related source omitted]
  • Network accessline 56
    [Credential-related source omitted]
  • Access to secretsline 56
    [Credential-related source omitted]
  • Network accessline 57
    homepage: "https://github.com/RevylAI/greenlight"

Makefile

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 14
    rm -rf build/

README.md

  • Network accessline 3
    [![Release](https://img.shields.io/github/v/release/RevylAI/greenlight?color=2ea44f)](https://github.com/RevylAI/greenlight/releases)
  • Network accessline 4
    [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
  • Network accessline 5
    [![Go](https://img.shields.io/badge/go-1.24+-00ADD8?logo=go&logoColor=white)](go.mod)
  • Network accessline 6
    [![Powered by Revyl](https://img.shields.io/badge/powered%20by-Revyl-1C1833)](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

  • Network accessline 9
    This pointer stays because people look for `SKILL.md` here (see [#3](https://github.com/RevylAI/greenlight/issues/3)).
  • Network accessline 10
    [#3](https://github.com/RevylAI/greenlight/issues/3)).

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

  • Executable scriptline 1
    Executable file
  • Network accessline 526
    httpClient := &http.Client{Timeout: 10 * time.Second}

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 15
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 342
    // Only strip when the // is not inside a quoted string, which is the 		// common case for URLs in maven { url "https://..." } lines.
  • Network accessline 343
    // common case for URLs in maven { url "https://..." } lines.

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

  • Executable scriptline 1
    Executable file
  • Network accessline 64
    const manifestHeader = `<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  • Network accessline 65
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

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

  • Executable scriptline 1
    Executable file
  • Network accessline 24
    const schemaURL = "https://json.schemastore.org/sarif-2.1.0.json"

internal/sarif/sarif_test.go

  • Executable scriptline 1
    Executable file
  • Network accessline 17
    var buf bytes.Buffer 	if err := Write(&buf, "greenlight", "v1.2.3", "https://example.com", findings); err != nil {
  • Network accessline 18
    if err := Write(&buf, "greenlight", "v1.2.3", "https://example.com", findings); err != nil {

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
Signal confidence: 209 facts

and 159 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md codex-skill/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md codex-skill/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md codex-skill/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md codex-skill/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.

RevylAI/greenlight: #473 on hotskills, 2.5k stars

[![RevylAI/greenlight on hotskills](https://hotskills.dev/badge/revylai-greenlight.svg)](https://hotskills.dev/skill/revylai-greenlight/)