airing
Scans a project directory using Cloudflare Pages' actual upload rules (as implemented by wrangler pages deploy) to report which files — such as .env, database dumps, and source maps — would be publicly served, and suggests the command change that keeps them private. Also provides a probe_url tool to check an already-deployed Pages site for ~40 well-known exposed paths and leaked keys.
Evaluates a directory against Cloudflare Workers static asset upload rules to show which files would become public (including .git/ and .env), and how to exclude them via .assetsignore. Includes URL probing of deployed Workers sites for exposed secrets.
Analyzes a Firebase Hosting deploy, which uploads dotfiles and .git/, and reports the hosting.ignore rules in firebase.json needed to keep secrets from being served.
Checks deployments targeting GitHub Pages (both the Actions flow and the gh-pages npm tool) for files that would be published, such as source maps and hidden files, and how to avoid them — for example not setting include-hidden-files: true or --dotfiles.
Scans the publish directory for a Netlify deploy to surface files that would be served publicly, such as source maps, and advises keeping sensitive files out of the publish dir.
Checks which files a Vercel static deployment would publish by default (e.g. .env and .env.production are public while .env.local is not), and how .vercelignore can be used to keep them out.
The problem
wrangler pages deploy . uploads your .env. So does Firebase (dotfiles are in), and Workers assets ship even .git/. Vercel skips .env.local but not .env or .env.production. None of them read your .gitignore. A coding agent that deploys "the folder that works" can publish your keys — one leaked Gemini key cost $90k this week.
airing reads the folder the way each host's CLI actually does (rules ported from their source and cross-checked against the real libraries in CI) and tells you which secrets would sit at a public URL, plus the one change that keeps them home. Names, sizes and SHA-256 fingerprints only — it never prints a value.
Related MCP server: opzyai
Try it (10 seconds, nothing to install)
cd my-site
npx github:Blackman99/airing .$ npx github:Blackman99/airing .
airing · Cloudflare Pages · ./ (package.json scripts.deploy)
15 files go public · 7 stay home
LEAK .env 314 B env file — 5 variables, 4 look secret
GOOGLE_API_KEY Google Cloud / Gemini AIza…(39 chars) sha256:1aa0cc79
rotate → https://console.cloud.google.com/apis/credentials
OPENAI_API_KEY OpenAI sk-proj-…(72 chars) sha256:41d45bff
…
LEAK backup.sql 111 B database dump — your data, downloadable in one request
RISK dist/assets/index-8f3a.js.map 135 B source map with original source
…
keep it home: you are deploying the project root — deploy the build output instead: wrangler pages deploy dist
saved by the host: .git/ (wrangler IGNORE_LIST "**/.git")
✗ 2 leaks would be public. nothing was uploaded — airing only reads. Fix, then deploy.Exit code 1 means something would leak, 0 means clean, 2 means a usage or I/O error — so it drops straight into scripts.
Stop the agent before it deploys
Claude Code — a PreToolUse hook that denies a leaking wrangler / vercel / netlify / firebase / gh-pages command and hands the agent the fix:
npm i -g https://github.com/Blackman99/airing/releases/latest/download/airing.tgz # once, so the hook starts in ms// .claude/settings.json
{ "hooks": { "PreToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", "command": "airing hook" }] }] } }Any agent or human — put guard -- in front of the deploy; it runs only if nothing would leak:
airing guard -- npx wrangler pages deploy distCheck what is already public
airing probe https://my-site.pages.dev
airing probe https://blackman99.github.io/airing/leaky-demo/ # our deliberately leaky page~40 well-known paths (/.env*, /.git/config, keys, dumps, agent settings) plus the source maps of the page's own scripts, soft-404 aware so an SPA catch-all never counts. Only probe sites you own; if it finds a key, rotate it first.
In CI, and over MCP
# after your build step
- uses: Blackman99/airing@v0
with:
path: .
probe-url: https://my-site.pages.dev # optional, after deployOutputs leaks, risks, json; findings are annotated on the files and written to the job summary. fail-on: leak | risk | never.
{ "mcpServers": { "airing": { "command": "npx", "args": ["-y", "github:Blackman99/airing", "mcp"] } } }Read-only tools: scan_deploy, probe_url, host_rules.
What each host publishes by default
host |
|
|
| reads | how to keep files home |
Cloudflare Pages ( | public | home | public | no | deploy the build dir — no ignore file for direct uploads |
Cloudflare Workers assets | public | public | public | no |
|
Vercel (static) | public | home | public | no |
|
Netlify | home | home | public | no | keep them out of the publish dir |
Firebase Hosting | public | public | public | no |
|
GitHub Pages (Actions) | home | home | public | no | don't set |
gh-pages (npm) | home | home | public | no | don't pass |
airing hosts prints these rules with links to the upstream source each one is ported from.
Install
airing is not on the npm registry yet (so npx airing won't find it). Run it from GitHub, or install the release tarball — it has no runtime dependencies and dist/ is committed, so nothing builds on install. (Use the tarball for a global install: npm 11's npm i -g github:… links a temp clone and leaves a dead airing command.)
npx github:Blackman99/airing . # one-off, nothing installed
npm i -g https://github.com/Blackman99/airing/releases/latest/download/airing.tgz # the `airing` command (latest release)
npm i -g https://github.com/Blackman99/airing/releases/download/v0.1.0/airing-0.1.0.tgz # pinnedNode 18.17+. Full reference, configuration and FAQ: docs.
MIT · goal · contributing · roadmap
This server cannot be deployed
Maintenance
Related MCP Connectors
Compliance & security scan for your app: secrets, exposed files, headers, privacy, AI-disclosure.
Scan configs, files, or text for leaked secrets and obvious misconfigurations. Nothing stored.
Zero-config MCP security scanner for AI-generated apps. 25K+ vulnerability patterns.
Audit GitHub repos for malicious and supply-chain code before you depend on them.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenancePredeploy security scanner for AI-generated code. 80+ vulnerability patterns across secrets, auth, injection, config, Supabase, and logging. Runs locally, code never leaves your machine. Optional x402 witnessed attestation.51 npmApache 2.0
- AlicenseNot gradedqualityDmaintenanceLocal-first security check for AI coding agents — finds hardcoded secrets, exposed .env files, git-history leaks and vulnerable dependencies (OSV), entirely on your machine. Ask your agent "is this safe to ship?" and get a Launch Readiness score with a fix for every finding.MIT
- AlicenseAqualityAmaintenanceLocal-first, zero-egress security scanner for AI-generated / "vibe-coded" JS/TS. Bundles Opengrep, Gitleaks & Trivy behind one CWE-keyed schema and adds AI-code-specific checks (client-side secret exposure, Supabase RLS, prompt-injection & LLM-output XSS sinks). No account, no telemetry.1099 npm48Apache 2.0
- AlicenseAqualityDmaintenanceScans projects for hardcoded secrets, unprotected .env files, and console.log leaks to prevent credential exposure.530 npmMIT