One scan to catch them all
323 checks across your repo and your live services. Filter by the platform they run against, by what they are about, or both.
Platform
Category
Security & compliance
152 checks
Direct prompt injection: request input in a system/instruction prompt
Indirect prompt injection: fetched/DB/file content into prompt or tool context
Model output run as raw SQL (LLM-authored query executed unparameterized)
Excessive agency: over-powered tool-using agent, no scoping/human-in-loop
Sensitive data disclosure: secret or unminimized PII in the model prompt
JWT verify without algorithm check
jwt.decode used instead of jwt.verify — token signature not checked
Weak password hash (MD5/SHA/low-bcrypt)
Deprecated/insecure crypto primitive
eval / dynamic exec on user input
TLS verification disabled
Commented-out secret
Raw/unparameterized SQL on user input (A03)
Secret-shaped NEXT_PUBLIC_ env var (A02)
SSRF — fetch to user-controlled URL (A10)
Next.js middleware-only authz (CVE-2025-29927)
Path traversal: request path into a filesystem sink, no containment
Open redirect: user-controlled redirect target, no validation
SSRF via connection string / non-fetch sink / DNS rebinding
Known-risky / deprecated package
postinstall script in unknown dep
Header/recipient injection
Unverified sender / no SPF·DKIM·DMARC
API-key exposure
PII/secret in email or logs
HTML injection
No throttling
Missing unsubscribe
No input validation at route boundary
PII columns discovered (inventory)
Special-category / financial PII unprotected
Plaintext credential / unhashed sensitive column
User object logged — may write PII to logs
No retention / erasure path on PII table
Missing consent capture
PII flows to third-party processor (verify DPA)
No HTTP security headers configured
Authorization header logged in plaintext
Unverified webhook
Missing idempotency
Client-trusted amount
Secret-key exposure
PCI/card-data handling
Unhandled failure/dispute
Client-success fulfillment
Hardcoded config / credential
No rate limit on public POST
Permissive CORS with credentials
Object fetched by request id with no owner check (IDOR)
Missing auth guard on a state-changing or sensitive route
Broken function-level authz: privileged operation with no role check
Mass assignment: request body written wholesale into a model
Third-party action pinned to mutable tag
Pull_request_target with PR-head checkout (pwn-request)
Secret value echoed in run step
Workflow missing permissions block
Script injection via github.event expression in run step
CI pipeline failing repeatedly
Production config file with hardcoded values
Package publish token passed as CLI argument (log-visible)
Commit signing not required
GitHub Actions allows all third-party actions
Secret-scanning push protection disabled
Org does not require two-factor authentication
Hardcoded provider API token
Committed .env file
Committed private key or certificate
Known-vulnerable dependency (Dependabot)
Open code-scanning (SAST) alert
Active leaked secret (secret scanning)
Project is publicly visible
Group does not require two-factor authentication
Secret push protection disabled
Known-vulnerable dependencies
Open SAST findings
Active leaked secrets
Service-role key exposed in client-side code — full RLS bypass
Service-role client queries a table with no tenant filter
Anon-key client used for a privileged write
IDOR risk: user_id from request body used in Supabase query without JWT verification
No auth check before a Supabase query in a route handler
Email OTP expiry over 1 hour (interception window)
Manual account linking enabled without a product need
Refresh-token reuse interval over 30 seconds
Schemas beyond public exposed through the data API
Unauthenticated edge function
Legacy keys / HS256 still enabled
RLS enabled on a table but no CREATE POLICY found — app rows locked out
Postgres extension enabled without review
RLS disabled on a table — cross-tenant rows accessible
No RLS policy found for a queried table — lockout or bypass risk
Over-permissive RLS policy on a table — no tenant scoping
RLS-denial spike
Storage bucket is public — objects readable without auth
No RLS policy on storage.objects for a bucket
Storage upload has no MIME type or file-size limit
getPublicUrl() used for user-specific storage object — enumerable by anyone
Signed URL TTL long enough to act as a public URL
Neon connection string with embedded password committed to source
.env.production committed with DATABASE_URL (not gitignored)
?sslmode=disable in connection string
TLS certificate verification disabled in a production-scoped file
DATABASE_URL logged / included in error context
Same endpoint hostname in dev + prod env files
Missing sslmode=require in production config
Connection string in test fixture / snapshot
Neon project accepts connections from any IP — no allowlist and public connections not blocked
IP allowlist set but public connections not blocked
Postgres version end-of-life (< 14)
Unprotected role on the primary/protected branch
IP allow-list not scoped to protected branches
Over-permissioned or team-wide integration
Suspended/disabled integration still installed
Non-marketplace integration with multiple scopes
Excessive OWNER count
Large number of pending invites
Domain not verified with Vercel
Domain DNS misconfiguration detected by Vercel
Log drain pointing at an unrecognized third-party host
No deployment protection (password/SSO/trusted-IP all absent)
OIDC issuer in global mode (tokens honored beyond this team)
Firewall enabled but no managed rulesets active
Preview deployments publicly accessible with staging data signals
Production/live secret found in preview env scope config
productionBrowserSourceMaps: true
Source maps enabled without environment guard in bundler config
No robots noindex for preview environments
Debug/verbose logging without production guard
Live Stripe secret key exposed via NEXT_PUBLIC_ prefix
Secret-named value behind a client-bundle prefix
Ambiguous key or credential name behind a client-bundle prefix
System env vars auto-exposed to every build (autoExposeSystemEnvs)
Production secret env var older than a year (rotation hygiene)
Unproxied A/AAAA/CNAME records expose the origin IP
Wildcard DNS record widens the attack surface
No DMARC record (domain can be spoofed in email)
Mail domain (has MX) missing an SPF record
SSL mode off/flexible (unencrypted origin hop)
Minimum TLS version below 1.2
Always Use HTTPS is off
DNSSEC not active on the zone
Automatic HTTPS Rewrites off (mixed-content risk)
TLS 1.3 not enabled
HSTS missing, disabled, or max-age under 6 months
0-RTT early data enabled (request replay risk)
No managed WAF ruleset on a production zone
No rate-limiting rules on the zone
Security Level essentially off (no IP challenges)
Browser Integrity Check off
Connected Cloudflare API token never expires
Row-Level Security off / no policies (Postgres)
Encryption at rest off (SQL Server TDE)
Cost
34 checks
Polling where webhook exists
SELECT * / over-fetching
Unbounded retries / log storm
Missing cache TTL / unbounded cache
Cron runs every minute on full scan
Missing caching on hot reads
Unfiltered Realtime subscription broadcasts every mutation
Realtime channel never unsubscribed — connection leak
Polling loop queries Supabase on a short interval — use Realtime instead
select('*') fetches every column — unnecessary egress
Branch created in PR workflow with no delete-on-close
Compute ran continuously for 30 days (no scale-to-zero)
Storage growing — likely orphaned branch data
No spend quota on non-trial project
Ephemeral branch past expiry date
Preview/feature branch accumulating compute with no expiry
Non-primary branch > 1 GiB logical size
Non-primary branches hold 5× primary storage
Neon autosuspend disabled — compute bills as always-on
Autosuspend timeout > 1 h on non-prod branch
Pinned min/max CU (no scale-down)
Pool with idleTimeoutMillis: 0 or missing (long-lived process)
Background poll < 5 min interval hitting DB
Health-check SELECT used by uptime monitor
force-dynamic on non-personalized route
Missing revalidate / cache option on public data fetch
maxDuration > 60 s on non-streaming function
Image optimizer disabled (unoptimized: true)
Overly broad image remotePatterns wildcard
Unbounded collection response without pagination or streaming
Heavy bundle dependency in serverless route
Paid-plan zone with negligible traffic (idle spend)
High-volume Worker (Workers cost driver)
Large R2 bucket storage (storage cost)
Performance
26 checks
PrismaClient instantiated on every serverless invocation
Unbounded fan-out / no concurrency cap
N+1 DB queries — per-ID fetch inside map()
Unbounded query / no pagination
Whole table / large file in memory
Sync CPU-heavy work in request path
Event-loop blocking
Data API max_rows unbounded or above 10000
Missing index on a hot query column — sequential scan
N+1 Supabase queries: .from() called inside a loop
select('*') without .limit() — unbounded result set
createClient() called inside a request handler — avoids connection reuse
Unused index — wasted write overhead
Edge route uses pg driver — Neon connections will exhaust on cold starts
Direct endpoint instead of -pooler in serverless
new Pool/new Client inside handler body (not singleton)
max pool size > 10 in serverless context
Missing @neondatabase/serverless in edge (general)
Foreign key has no covering index
Large table with only its base/PK index
SQL Server heap (no clustered index)
MongoDB collection with no indexes
Large MongoDB collection with only the _id index
SQL Server auto-shrink enabled
Slow-query signal (normalized)
Heap cache-hit ratio under 0.90 on a hot table
Stability
30 checks
Swallowed exception on a critical path
Unhandled promise rejection
await on external call without try/catch
No timeout on fetch/DB/HTTP
No retries / backoff on external call
No circuit breaker on critical path
process.exit in library code
Console.log-only / no structured logger
No request / correlation IDs
No error-reporting integration
No health / readiness endpoint
Health endpoint doesn't check DB
No distributed tracing (multi-service)
Silent failure / fire-and-forget
A specific workflow failing repeatedly
Connection-pool exhaustion
Statement-timeout/slow-query
Repeated constraint violations
API 5xx spike
Repeated apply_migration failures
Failed-op ratio > 10%
Neon PITR retention window is less than 1 day
PITR retention < 7 days (production)
Worker runtime error rate elevated (last 24h)
Worker throwing unhandled exceptions (last 24h)
Worker exceeding CPU/memory limits (last 24h)
Pages project's latest production deployment failed
Pages project has repeated recent deployment failures
Out-of-date engine major version
MySQL table uses MyISAM (no transactions)
Code quality
35 checks
Hallucinated / nonexistent API call
@ts-ignore masking type error
TODO/FIXME/mock data in production
Dead / never-imported file
Scaffold boilerplate left uncustomised
Inconsistent auth/error patterns
No lockfile committed — installs are non-deterministic
Lockfile out of sync with manifest
Unpinned / floating version in deps
Abandoned package in dependencies
Mixed package managers
No automated tests in an app repo
Critical module (auth/payments/data) untested
TypeScript strict mode is off — whole classes of bugs go undetected
Unsafe type escapes on external input
No CI test/typecheck/lint gate
Missing README / runbook docs
Oversized untested core module
Throwing string literal
Missing / stale .env.example
No CI gates on main
Missing .env.example
Config value hardcoded instead of env var
Env vars used in code but missing from .env.example
No CODEOWNERS file
No Dependabot config — dependency updates not automated
Dependabot security updates disabled
Connected repo is archived
No pushes for 90+ days on a scanned production repo
Delete-branch-on-merge disabled
Missing .gitignore coverage for env files
Connected project is archived
Source branches kept after merge
Table has no primary key
MySQL table not utf8mb4
Releases
46 checks
Bundle bloat (serverless)
Native-build dep in serverless target
No SIGTERM / graceful shutdown
Health endpoint behind auth / misleading
No feature-flag on risky path
DB migration runs in the same step as server start
Destructive migration without shim
Debug/dev mode in prod config
Global mutable state in serverless
No CI workflows — no status checks to gate merges
Production deploy job without environment protection
Automated release triggered on every push without a tag/release guard
Default branch is unprotected
Branch protection too weak
Default branch is unprotected
Branch protection too weak
Merge allowed without a passing pipeline
Out-of-date Postgres
PITR disabled
Backups failing/none
Disk pressure / read-only lockdown
SSL not enforced
Network open to 0.0.0.0/0
Migration drops a table or column with no rollback path
Column type change may silently truncate data
CREATE INDEX on a table without CONCURRENTLY — locks writes during deploy
Table subscribed via Realtime but absent from the supabase_realtime publication
Hardcoded connection string in migration config (not env var)
Destructive migration drops table with no rollback path
DELETE FROM without WHERE in migration
PII or large seed data inside migration file
CI creates branch but sets wrong DATABASE_URL
gitForkProtection: false — forked PRs get env vars + OIDC token
Single-region function defaults with a cross-region database
Short maxDuration with active crons
OOM crashes in recent production deployments
High ERROR-state deployment rate
No production deployments recorded
Runtime 5xx / error-level failures on the latest production deployment
No promotion-gate checks before production, or a blocking check failed yet promoted
Production deployments shipping with failing checks
Node-only API in edge runtime
Node-incompatible or oversized dependency in edge runtime
Heavy DB/network work in middleware.ts
Middleware missing config.matcher (runs on all routes)
Edge data-fetch route missing preferredRegion
Nothing matches that. Try a shorter search, or clear a filter.
Run them all on your app
Connect your repo and your live services with read-only scopes. The first scan is free, and nothing changes without your approval.