Skip to main content

Command menu

Jump to a page or search the catalog

AI Tools & Scripts

Expo EAS Config Check

Check Expo and EAS projects before you build, submit or publish an update: secrets in EXPO_PUBLIC_ variables, app config and eas.json, credentials.json outside .gitignore, dev builds in release profiles and unsafe over-the-air updates.

$5.00

What you get: 1 file · 53.69 KB · ZIP

See purchase options

Product description

EXPO_PUBLIC_OPENAI_API_KEY=... puts your OpenAI key in plain text inside every copy of your app, because Expo copies each EXPO_PUBLIC_ value your code reads into the JavaScript bundle. A production build profile with "developmentClient": true sends the development client to store users, and "disableAntiBrickingMeasures": true in app.json turns off the update safety net for every build, production included. This skill finds those and fourteen other Expo and EAS configuration mistakes before you ship, and tells you how to fix each one.

Your agent runs a scanner on app.json, app.config.js and app.config.ts, eas.json (comments and trailing commas are fine), credentials.json, .env files, package.json and .gitignore, and on the process.env.EXPO_PUBLIC_ references in your JavaScript and TypeScript code. It knows which parts of the app config Expo keeps out of the public config, follows eas.json profiles through extends, reads .gitignore rules the way git does, tells publishable client keys (Firebase, Supabase, Stripe and Clerk publishable keys, RevenueCat, Mapbox, PostHog) from secret ones, and works across monorepos with several apps. It never runs Expo, EAS CLI, your app config or your code. It returns BLOCK, REVIEW, or NOT FLAGGED, with the file, line, reason, and a safer approach. Secrets are never printed.

What it checks

BLOCK (fix before shipping)

  • E01: an EXPO_PUBLIC_ variable that holds a secret (in .env files, eas.json build env or code): a value with the shape of a secret key (Stripe secret keys, OpenAI, Anthropic, GitHub, AWS, a Supabase service_role key and others), a name that ends in _SECRET, _SECRET_KEY, _PASSWORD, _PRIVATE_KEY, _SERVICE_ROLE_KEY or _AUTH_TOKEN, or the API key of a server-only AI, email or SMS provider such as EXPO_PUBLIC_OPENAI_API_KEY (storage-key names such as EXPO_PUBLIC_AUTH_TOKEN_STORAGE_KEY are not flagged)
  • E02: a secret in app.json or app.config: a secret-shaped value or a literal password or secret setting in extra, plugin options or hooks, a password in a URL, or ...process.env spread into the config
  • E03: a secret in eas.json: a build profile env variable whose name ends in a secret phrase (or is a server-only provider key) set to a literal, an API key or token name set to a long generated value, or any secret-shaped value
  • E04: credentials.json, a keystore or distribution certificate it names, an App Store Connect or Google Play key that eas.json submit names, or the expo-updates code signing private key, in the project with no .gitignore rule covering it
  • E05: a production, release or store build profile (not internal) that makes a development build: developmentClient true (also through extends), a Debug iOS build configuration or a Debug Gradle command
  • E06: updates.url over plain http to a public host, unsigned, in an app config that also allows plain http (usesCleartextTraffic or NSAllowsArbitraryLoads)
  • E07: disableAntiBrickingMeasures true in app.json, which applies to every build

REVIEW (check before release)

  • E11: usesCleartextTraffic true (expo-build-properties)
  • E12: NSAllowsArbitraryLoads true in ios.infoPlist (App Transport Security off)
  • E13: a self-hosted updates server without updates.codeSigningCertificate
  • E14: updates.url set but no runtimeVersion, so expo-updates stays disabled
  • E15: expo-secure-store with configureAndroidBackup false while Android backups are allowed
  • E16: an EXPO_PUBLIC_ variable or app config value named like an API key that holds a long generated literal that is not a known publishable key
  • E17: app.config copying a secret or API key environment variable (such as OPENAI_API_KEY) into extra or plugin options, where it ships with the app
  • E18: disableAntiBrickingMeasures true written in app.config
  • E19: newArchEnabled false on Expo SDK 55 or later, where the setting is ignored
  • E20: any other plain-http updates.url to a host that is not local: iOS and Android 9 and later refuse it by default, so updates usually fail

What's included

  • The scanner (Python 3.9+, standard library only)
  • A rules guide with the reason, safer approach and official Expo or Apple documentation link for each rule
  • A risky and a safe example monorepo (three apps), and the real report the scanner produces on the risky one

Limits

It reads file text and never runs app.config.js or app.config.ts, so values built by functions or imports are not followed, and environment variables are judged by their names, not their values. E04 decides from .gitignore text, not from git history, so a file that is already committed is not detected. EAS environment variables stored on Expo's servers are not checked, and EAS Update projects without code signing are not reported because Expo offers code signing for EAS Update only on paid plans. Native ios and android files are not read. The official custom-expo-updates-server example client allows cleartext for its localhost server and is reported as E11 REVIEW on purpose. NOT FLAGGED is not a guarantee.

Contents

One ZIP file with 31 files: SKILL.md, the scanner in scripts/ (8 Python files), references/rules.md (every rule with its reason and safer approach), and examples/ (20 example files plus report.md, the real scanner output on the risky example).

How to use: This is an agent skill: a folder with a SKILL.md file and Python scripts that an AI coding agent such as Claude Code, Cursor, or Codex CLI can run. Unzip it into your agent's skills folder (for Claude Code: ~/.claude/skills/), then ask your agent to check your project. The scripts also run on their own with Python 3.9 or newer, with nothing to install. They read your files only: no network access, and nothing is sent anywhere.

What you get

1 file · 53.69 KB

  • expo-eas-config-check-1.0.0.zipZIP · 53.69 KB
LicenseCommercial use allowed
Package checkPassed

Getly opened the uploaded files and found nothing that would stop them opening. It is not a virus scan or a quality rating.

PublishedNov 12, 2026
File size53.69 KB
File formatZIP
Versionv1.0

Tags

expoeasreact-nativemobilesecurityai agent skill
R
RR HH

Frequently asked questions

Do I get access instantly?

Yes. This is a digital product - you can download it right after checkout, straight from your library.

Can I use it for commercial projects?

Yes. Commercial use is allowed: use it in your own business and in things you sell. You may not resell or redistribute the file itself.

What's your refund policy?

You can request a refund within 30 days. If something isn't right, request it from your order and the Getly team reviews it.

What file formats and sizes will I get?

You'll download 1 file - ZIP - 53.69 KB in total.

Do I get free updates?

Yes - when the seller ships a new version, you can re-download the latest files from your library at no extra cost. Check the changelog for recent updates.

Price

$5.00