Security Checklists

The Pre-Deploy Security Checklist for Vibe-Coded Apps

UbserveFebruary 5, 20262 min read
Focus
Checklist
Risk
High
Stack
Supabase/Next.js
Detection
Ubserve Runtime Simulation

A high-intent deployment checklist for founders and product teams shipping AI-built apps to production.

Dark release checklist screen beside a white product brief on a desk.

This checklist is designed for the final hour before production, when teams need signal instead of noise.

Confirm server-only secrets stayed server-only

  1. Search for service_role, sk_live_, OPENAI_API_KEY, and internal admin tokens.
  2. Inspect environment variable exposure through NEXT_PUBLIC_ prefixes.
  3. Verify that client bundles do not reference internal endpoints protected only by obscurity.

One recurring AI-generated edge case is a helper that accidentally promotes a server secret into a client-safe constant:

export const supabaseAdmin = createClient(
  process.env.NEXT_PUBLIC_SUPABASE_URL!,
  process.env.NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY!,
);

The hallucination is not subtle. The model often invents a NEXT_PUBLIC_ prefix because the code “needs to run everywhere.”

Verify authorization at the mutation layer

Every write path should answer: who is allowed to do this, and where is that enforced?

  1. route handlers
  2. Server Actions
  3. RPC functions
  4. edge functions
  5. background jobs

Do not accept “the UI only shows this to admins” as authorization.

Check RLS, storage, and data exposure

  1. enable RLS on user tables
  2. validate policy conditions against auth.uid()
  3. confirm private buckets are not public
  4. review RPC functions for broad execution

JWT payloads are useful, but they are not a permission model by themselves.

[Component: DarkWireframeKey]

The DarkWireframeKey visual should show a release path flowing from commit to deploy, with red markers on secrets, server actions, storage buckets, and JWT validation. The article references those exact points because the checklist is meant to be run visually as well as textually.

Review client-side hydration and debugging output

Hydration leaks are easy to miss because they look like harmless convenience during development.

Check for:

  1. admin-only objects passed through serialized props
  2. debug payloads rendered into hidden DOM nodes
  3. config blobs exposing internal IDs or tokens
  4. user records sent to the browser unnecessarily

Confirm API and route behavior

  1. auth routes reject malformed tokens
  2. admin routes do not infer access from a UI role flag
  3. write endpoints validate ownership
  4. public APIs rate-limit or constrain abuse paths

Make the deploy observable

Before you ship, confirm you will know if the release fails securely:

  1. auth failures are logged
  2. billing errors are logged
  3. permission denials are visible
  4. important mutation paths emit useful identifiers

Final release decision

Do not ask, “Does the app work?”

Ask:

  1. did any privileged value reach the client?
  2. can one user access another user’s data?
  3. can a public route write or mutate unexpectedly?
  4. can we explain our authorization model in one paragraph?

If you cannot answer those cleanly, the deploy is not ready.

Related resources

FAQs

How often should this checklist run?+
Before every production deploy, and again after major auth, billing, or data model changes.
Who should own the checklist?+
The person approving deployment should own the final pass, even if implementation spans multiple contributors or AI agents.
Next step

Turn this resource into a real security check.

Review the guidance, then run Ubserve to validate whether this issue is actually exploitable in your app and get fix-ready output.