The Pre-Deploy Security Checklist for Vibe-Coded Apps
- 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.
This checklist is designed for the final hour before production, when teams need signal instead of noise.
Confirm server-only secrets stayed server-only
- Search for
service_role,sk_live_,OPENAI_API_KEY, and internal admin tokens. - Inspect environment variable exposure through
NEXT_PUBLIC_prefixes. - 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?
- route handlers
- Server Actions
- RPC functions
- edge functions
- background jobs
Do not accept “the UI only shows this to admins” as authorization.
Check RLS, storage, and data exposure
- enable RLS on user tables
- validate policy conditions against
auth.uid() - confirm private buckets are not public
- 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:
- admin-only objects passed through serialized props
- debug payloads rendered into hidden DOM nodes
- config blobs exposing internal IDs or tokens
- user records sent to the browser unnecessarily
Confirm API and route behavior
- auth routes reject malformed tokens
- admin routes do not infer access from a UI role flag
- write endpoints validate ownership
- public APIs rate-limit or constrain abuse paths
Make the deploy observable
Before you ship, confirm you will know if the release fails securely:
- auth failures are logged
- billing errors are logged
- permission denials are visible
- important mutation paths emit useful identifiers
Final release decision
Do not ask, “Does the app work?”
Ask:
- did any privileged value reach the client?
- can one user access another user’s data?
- can a public route write or mutate unexpectedly?
- 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?+
Who should own the checklist?+
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.