All 162 checks

Every check VibeCheck runs against your app. Filterable by category and severity.

162 checks

auth-001·Authentication

Login redirect loop after OAuth

Detects infinite redirect loops that occur after OAuth login completion.

CRITICAL
auth-003·Authentication

Expired JWT not handled — blank screen

Navigates to protected routes and checks for blank/white screens indicating unhandled token expiry.

CRITICAL
auth-010·Authentication

Protected routes accessible via direct URL

Attempts to navigate to common dashboard paths without auth.

CRITICAL
auth-013·Authentication

OAuth callback URL mismatch

Checks network responses for OAuth redirect_uri mismatch errors.

CRITICAL
auth-017·Authentication

Supabase RLS missing — cross-user data read

Checks if Supabase anon key is exposed without evidence of RLS policies.

supabase
CRITICAL
auth-018·Authentication

Admin routes only hidden, not protected

Checks if admin UI is merely hidden vs. actually gated server-side.

CRITICAL
pay-001·Payments

Stripe test keys in production

Detects sk_test_ or pk_test_ keys exposed in page source or network requests.

CRITICAL
pay-012·Payments

Missing HTTPS on payment pages

Verifies payment pages are served over HTTPS.

CRITICAL
db-003·Database

Supabase anon key in client with no visible RLS

Checks for exposed Supabase anon key alongside direct table access patterns.

supabase
CRITICAL
api-001·API

API returns sensitive fields

Checks common API endpoints for password, token, or secret fields in responses.

CRITICAL
api-006·API

Environment variables visible in page source

Checks for NEXT_PUBLIC_ var leaks or other env var patterns in client source.

CRITICAL
api-007·API

API endpoints accessible without auth headers

Makes unauthenticated requests to common API routes.

CRITICAL
mob-009·Mobile

Mobile viewport meta tag missing or misconfigured

Checks for correct viewport meta tag configuration.

CRITICAL
sec-002·Security

HTTP accessible — no HTTPS redirect

Checks if HTTP version of the URL redirects to HTTPS.

CRITICAL
sec-004·Security

Sensitive env vars in client bundle

Scans JavaScript bundles for private key patterns.

CRITICAL
sec-007·Security

Admin UI role-gated only on frontend

Checks if admin functionality has server-side guards.

CRITICAL
ai-001·AI Safety

OpenAI key exposed client-side

Scans page source and JS bundles for OpenAI secret key patterns.

CRITICAL
ai-002·AI Safety

Anthropic key exposed client-side

Scans page source and JS bundles for Anthropic secret key patterns.

CRITICAL
ai-003·AI Safety

Other AI provider keys exposed client-side

Scans for Replicate, Groq, and Google AI key patterns in client code.

CRITICAL
prod-002·Production Readiness

JavaScript sourcemaps publicly accessible

Checks whether .map files for JS bundles are publicly reachable.

CRITICAL
auth-002·Authentication

Social login fails silently

Checks if OAuth provider buttons exist and whether failure states show error messages.

HIGH
auth-004·Authentication

Session not invalidated on logout

Checks for logout functionality and verifies it properly clears session state.

HIGH
auth-007·Authentication

Password reset link reusable

Checks if password reset tokens are single-use.

HIGH
auth-008·Authentication

No rate limiting on login

Checks response headers for rate-limiting signals on the login form.

HIGH
auth-012·Authentication

Magic link works after expiry

Checks if the page handles expired magic link tokens gracefully.

supabase
HIGH
auth-015·Authentication

Account deletion does not invalidate sessions

Checks if account deletion UI properly signs out all sessions.

HIGH
pay-002·Payments

Webhook endpoint not reachable

Makes a HEAD request to /api/webhook/stripe to verify it responds.

stripe
HIGH
pay-003·Payments

Success redirect fires before webhook

Checks if checkout success page grants access immediately without waiting for webhook.

stripe
HIGH
pay-005·Payments

No 3DS/SCA handling detected

Checks if payment flow handles Strong Customer Authentication challenges.

stripe
HIGH
pay-006·Payments

Subscription cancel does not revoke access

Checks cancel flow for immediate vs. period-end access revocation.

stripe
HIGH
pay-007·Payments

Free trial expiry not enforced

Checks if trial state is verified server-side.

stripe
HIGH
db-001·Database

No error state when data fails to load

Simulates a slow/failed network and checks for error UI.

HIGH
db-002·Database

No pagination — full table dump to UI

Checks for extremely long lists that suggest unbound database queries.

HIGH
db-010·Database

Form submits to DB with no validation feedback

Checks forms for client-side validation and error messaging.

HIGH
api-002·API

CORS wildcard header present

Checks API responses for Access-Control-Allow-Origin: * on sensitive routes.

HIGH
api-003·API

Error responses leak stack traces

Triggers 404 and checks if error response contains stack trace.

HIGH
api-005·API

File upload endpoint with no size restriction signals

Checks file upload inputs for accept and size validation.

HIGH
api-010·API

Unhandled promise rejections in console

Checks for unhandledrejection events captured during page load.

HIGH
fe-002·Frontend

Error state missing

Checks for error boundary and error state components.

HIGH
fe-004·Frontend

Form double-submit possible

Checks if form submit buttons are disabled after first click.

HIGH
fe-012·Frontend

Delete action with no confirmation

Checks if delete buttons trigger immediate action without confirmation.

HIGH
fe-014·Frontend

Console errors present on page load

Reports any console errors captured during page load.

HIGH
mob-001·Mobile

Layout breaks at 375px viewport

Resizes viewport to 375px and checks for overflow or layout issues.

HIGH
mob-002·Mobile

Tap targets below 44px

Checks interactive elements for minimum 44px touch target size.

HIGH
mob-003·Mobile

Horizontal scroll present on mobile

Checks for horizontal scrollbar at mobile viewport.

HIGH
mob-007·Mobile

Hover-only interactions present

Checks for CSS hover states that reveal critical UI elements.

HIGH
perf-001·Performance

No image optimization (large uncompressed images)

Checks for large unoptimized images loaded on the page.

HIGH
perf-005·Performance

Bundle size above 1MB

Estimates total JavaScript bundle size from network requests.

HIGH
perf-006·Performance

Time to first byte above 800ms

Measures TTFB using Navigation Timing API.

HIGH
perf-007·Performance

Largest contentful paint above 2.5s

Measures LCP using PerformanceObserver.

HIGH
sec-001·Security

Content-Security-Policy header missing

Checks HTTP response headers for CSP.

HIGH
sec-005·Security

CSRF protection absent on forms

Checks for CSRF tokens in forms and headers.

HIGH
sec-006·Security

User content served from same origin (XSS risk)

Checks if user-generated content is served from a sandboxed domain.

HIGH
sec-008·Security

Mixed content warnings (HTTP on HTTPS page)

Checks for HTTP resources loaded on an HTTPS page.

HIGH
email-001·Email

SPF record not configured for sending domain

Checks DNS TXT records for SPF configuration.

HIGH
email-002·Email

DKIM record not configured

Checks for DKIM DNS records on common email provider selectors.

HIGH
email-003·Email

No unsubscribe mechanism detectable in email flows

Checks settings/notifications pages for unsubscribe options.

HIGH
email-004·Email

Notification links point to localhost or staging

Checks page source for localhost URLs in email/notification templates.

HIGH
email-006·Email

Email confirmation flow broken or unreachable

Checks if signup triggers an email confirmation step.

HIGH
ai-004·AI Safety

AI API called directly from browser

Detects network requests made directly to AI provider APIs.

HIGH
ai-005·AI Safety

No rate limiting on AI endpoint

Checks if detected AI proxy endpoints return rate-limit headers.

HIGH
ai-010·AI Safety

System prompt visible in client bundle

Scans JS bundles for long strings that look like LLM system prompts.

HIGH
seo-001·SEO Basics

Missing or empty title tag

Checks that the page has a non-empty <title> element.

HIGH
legal-001·Legal

No privacy policy link

Checks for a link to a privacy policy page.

HIGH
legal-003·Legal

Email collection without consent notice

Checks if email input forms have an accompanying privacy or consent notice.

HIGH
content-002·Content

Lorem ipsum placeholder text

Checks for lorem ipsum or placeholder text left in the page.

HIGH
content-005·Content

Broken images on page

Checks for img elements that failed to load (naturalWidth === 0).

HIGH
content-006·Content

Broken navigation links

Checks primary nav links for 404 or network errors.

HIGH
prod-001·Production Readiness

App running in development mode

Detects Next.js development mode, React DevTools hooks, or dev-mode strings.

HIGH
prod-003·Production Readiness

Debug or test routes accessible

Probes common debug and dev paths for non-404 responses with meaningful content.

HIGH
prod-004·Production Readiness

Localhost URLs in production

Scans page source for localhost or loopback address references outside code/pre blocks.

HIGH
prod-007·Production Readiness

Secret environment variables in client bundle

Scans JS bundles for process.env references to secret-sounding variable names.

HIGH
obs-001·Observability

No error monitoring detected

Checks for Sentry, Bugsnag, LogRocket, Rollbar, Datadog, or Highlight.io.

HIGH
obs-002·Observability

No analytics detected

Checks for Google Analytics, PostHog, Mixpanel, Plausible, Fathom, and others.

HIGH
launch-001·Launch Readiness

No clear call-to-action above the fold

Checks for a button or CTA link within the first 800px at 1280×800 viewport.

HIGH
launch-002·Launch Readiness

Autoplay video with sound

Checks for <video autoplay> elements missing the muted attribute.

HIGH
auth-006·Authentication

Password reset link expired with no message

Checks password reset flows for expired link handling.

MEDIUM
auth-009·Authentication

Auth state not synced across tabs

Checks for BroadcastChannel or storage event listeners that sync auth state.

MEDIUM
auth-011·Authentication

Email verification breaks on different device

Checks if verification links depend on session state (which breaks cross-device).

MEDIUM
auth-014·Authentication

Duplicate registration via different auth methods

Checks if signup page handles duplicate accounts across email/OAuth.

MEDIUM
auth-016·Authentication

No feedback during auth loading

Checks if auth forms show loading state during submission.

MEDIUM
pay-004·Payments

Failed payment shows generic error only

Checks payment forms for specific error message handling.

stripe
MEDIUM
pay-008·Payments

Promo field accepts invalid codes silently

Checks if promo/coupon input provides feedback for invalid codes.

stripe
MEDIUM
pay-009·Payments

Currency mismatch in display vs. charge

Checks if displayed currency matches Stripe locale.

stripe
MEDIUM
pay-010·Payments

No confirmation email flow detectable

Checks for evidence of email confirmation after purchase.

stripe
MEDIUM
pay-011·Payments

Checkout session expiry not handled

Checks if expired Stripe Checkout sessions show a proper error.

stripe
MEDIUM
pay-013·Payments

Payment form accessible without auth

Checks if payment/upgrade page requires authentication.

stripe
MEDIUM
pay-014·Payments

No loading state during payment submission

Checks if payment submit button shows loading/disabled state.

stripe
MEDIUM
db-004·Database

No soft delete pattern (direct destructive actions)

Checks for hard delete buttons without soft-delete or trash confirmation.

MEDIUM
db-006·Database

Missing unique constraint signals (duplicate data)

Scans lists for visually identical entries indicating missing DB constraints.

MEDIUM
db-008·Database

No empty state when collection is empty

Checks for appropriate empty state UI on list/collection pages.

MEDIUM
db-009·Database

Data loads without loading indicator

Checks if data-heavy sections show a skeleton or spinner.

MEDIUM
api-004·API

No rate limiting headers on API responses

Checks for RateLimit or X-RateLimit headers on API responses.

MEDIUM
api-008·API

No request timeout handling in UI

Checks if the UI handles slow API responses gracefully.

MEDIUM
api-009·API

Sequential API waterfall on page load

Checks network timing for sequential requests that could be parallelized.

MEDIUM
fe-001·Frontend

Empty state missing

Navigates to collection pages and checks for empty state UI.

MEDIUM
fe-003·Frontend

Loading state missing

Checks for skeleton screens or spinner elements.

MEDIUM
fe-006·Frontend

No character limit on text inputs

Checks for maxlength attributes on text inputs and textareas.

MEDIUM
fe-010·Frontend

Modal does not close on Escape

Checks if modals/dialogs handle the Escape key.

MEDIUM
fe-011·Frontend

Copy-to-clipboard on non-HTTPS

Checks if clipboard API is used on pages not served over HTTPS.

MEDIUM
fe-013·Frontend

Back button breaks state

Checks if browser history is managed correctly for multi-step flows.

MEDIUM
mob-004·Mobile

Font size below 16px on inputs (triggers iOS zoom)

iOS auto-zooms when input font-size is below 16px.

MEDIUM
mob-005·Mobile

Images overflow on mobile

Checks for images wider than their container at mobile viewport.

MEDIUM
mob-006·Mobile

Fixed elements hidden behind browser chrome

Checks fixed position elements at bottom of mobile viewport.

MEDIUM
mob-008·Mobile

No touch-friendly alternatives to drag interactions

Checks for drag-and-drop without touch alternatives.

MEDIUM
mob-010·Mobile

Layout shift score (CLS) above 0.1 on mobile

Measures Cumulative Layout Shift on mobile viewport.

MEDIUM
perf-002·Performance

No lazy loading on below-fold images

Checks if below-fold images have loading="lazy" attribute.

MEDIUM
perf-003·Performance

Unminified JS detected

Checks script sizes and content for minification.

MEDIUM
perf-004·Performance

No caching headers on static assets

Checks Cache-Control headers on JS, CSS, and image assets.

MEDIUM
perf-008·Performance

No skeleton/loading UI on data-dependent sections

Checks for skeleton screens on sections that load async data.

MEDIUM
sec-003·Security

X-Frame-Options header missing

Checks for clickjacking protection headers.

MEDIUM
ai-006·AI Safety

AI provider error messages leaked to client

Probes AI proxy endpoints with a malformed request to check if raw provider errors are exposed.

MEDIUM
ai-007·AI Safety

No AI response timeout visible

Checks if AI proxy calls use AbortController or timeout patterns.

MEDIUM
ai-008·AI Safety

No loading state for AI output

Checks if the app shows visual feedback while waiting for AI responses.

MEDIUM
ai-012·AI Safety

CORS wildcard on AI proxy endpoint

Checks if AI proxy endpoints have an open CORS policy.

MEDIUM
seo-002·SEO Basics

Missing meta description

Checks for a non-empty meta description tag.

MEDIUM
seo-003·SEO Basics

Missing Open Graph image

Checks for og:image meta tag used by social platforms.

MEDIUM
seo-008·SEO Basics

Missing or multiple H1 tags

Checks that exactly one H1 tag exists on the page.

MEDIUM
seo-009·SEO Basics

Images missing alt text

Counts images without alt attributes.

MEDIUM
legal-002·Legal

No terms of service link

Checks for a link to terms of service or terms of use.

MEDIUM
legal-004·Legal

No cookie consent mechanism

Checks for a cookie banner or consent dialog.

MEDIUM
legal-007·Legal

No account deletion path for authenticated apps

Checks that apps with auth expose a way for users to delete their account or data.

MEDIUM
legal-008·Legal

Age-restricted content with no age gate

Detects age-restricted product categories and checks for an age verification mechanism.

MEDIUM
content-001·Content

Default framework title in use

Checks if the page still uses the boilerplate title from a starter template.

MEDIUM
content-003·Content

Placeholder email address

Checks for example.com or placeholder email addresses in visible text.

MEDIUM
content-007·Content

TODO / placeholder text in content

Checks visible page text for TODO, FIXME, or TBD markers.

MEDIUM
content-008·Content

Missing custom 404 page

Fetches a non-existent path and checks for a custom 404 response.

MEDIUM
prod-005·Production Readiness

Vercel preview URL hardcoded in production

Checks if the production site references temporary *.vercel.app URLs.

MEDIUM
prod-006·Production Readiness

Excessive console.log in production bundle

Fetches the main JS bundle and counts console.log occurrences.

MEDIUM
prod-008·Production Readiness

Static assets missing cache headers

Checks Cache-Control headers on JS and CSS assets.

MEDIUM
obs-003·Observability

No uptime monitoring health endpoint

Checks for a /api/health or /health endpoint as a signal of uptime monitoring.

MEDIUM
launch-003·Launch Readiness

Hero section too sparse

Counts visible above-fold words (excluding nav) at 1280×800.

MEDIUM
launch-004·Launch Readiness

No social proof signals

Checks for user counts, star ratings, testimonials, or trust signals.

MEDIUM
launch-005·Launch Readiness

Page load too slow for launch traffic

Measures DOMContentLoaded time as a Time To Interactive proxy. TTFB is already covered by perf-006.

MEDIUM
auth-005·Authentication

Remember me does not persist

Checks if "remember me" checkbox exists and session cookies have appropriate expiry.

LOW
db-005·Database

Timestamps without timezone handling

Checks if timestamps displayed on page are localized.

LOW
db-007·Database

Infinite scroll with no end state

Checks infinite scroll implementations for a "no more items" state.

LOW
api-011·API

Missing Content-Type headers on API responses

Checks API responses for proper Content-Type headers.

LOW
api-012·API

API versioning absent

Checks if API routes include versioning (/v1/, /v2/).

LOW
fe-005·Frontend

Success message timeout too short

Checks if success toasts/alerts auto-dismiss too quickly.

LOW
fe-007·Frontend

Date format not localized

Checks if dates use hardcoded format instead of locale-aware formatting.

LOW
fe-008·Frontend

Number format not localized

Checks if large numbers use locale-appropriate formatting.

LOW
fe-009·Frontend

Toast notifications stack without limit

Checks if toast system has a maximum display count.

LOW
fe-015·Frontend

Form inputs missing labels

Checks for input elements that lack an associated label.

LOW
fe-016·Frontend

Potential color contrast issues

Checks for low-opacity or light-colored text that may fail WCAG contrast.

LOW
email-005·Email

No reply-to address on transactional emails

Checks for reply-to configuration in email setup code.

LOW
ai-009·AI Safety

AI-generated content not labeled

Checks if AI-generated content has any disclosure label or badge.

LOW
ai-011·AI Safety

No AI usage disclosure in privacy policy

Checks if the privacy policy mentions AI or automated processing.

LOW
seo-004·SEO Basics

Missing core Open Graph tags

Checks for og:title, og:description, and og:url tags.

LOW
seo-005·SEO Basics

robots.txt not found

Fetches /robots.txt and checks for a 200 response.

LOW
seo-006·SEO Basics

XML sitemap not found

Checks for /sitemap.xml at the site root.

LOW
seo-007·SEO Basics

Missing canonical URL tag

Checks for a <link rel="canonical"> element.

LOW
seo-010·SEO Basics

Missing Twitter card meta tags

Checks for twitter:card meta tag for Twitter/X sharing.

LOW
legal-005·Legal

No contact information found

Checks for a contact page link or email address.

LOW
legal-006·Legal

No copyright notice

Checks for a copyright symbol or statement in the footer.

LOW
content-004·Content

Missing favicon

Checks for a favicon link element in the page head.

LOW
content-009·Content

No about page linked

Checks for a link to an about or about-us page.

LOW
content-010·Content

No social media links

Checks for links to common social media platforms.

LOW
content-011·Content

Hotlinked images from third-party domains

Checks for <img> and <source> elements pointing to external domains that are not known CDNs.

LOW
obs-004·Observability

No feedback mechanism detected

Checks for feedback widgets, feedback buttons, or chat support widgets.

LOW
obs-005·Observability

No request tracing headers on API responses

Checks API responses for x-request-id, x-trace-id, cf-ray, or x-vercel-id.

LOW
launch-006·Launch Readiness

No demo or preview for non-signed-in visitors

Checks whether the homepage shows product output before requiring signup.

LOW

Know a failure mode we missed?

Suggest a check →