Skip to content

This checklist covers the launch work that changes for v0, Supabase, and None. It uses fixed rules and gives you direct prompts before you publish.

v0 plus Supabase plus None launch checklist

Defaults for the remaining questions

Auth: Email code. AI features: No. Customer data: Personal data. Hosting: Vercel.

Fix before launch

Confirm the production URL

Preview and production can return different routes, headers, and environment values.

Fix prompt

Plain http requests to this app do not redirect to https. Turn on the force-https option in your hosting dashboard, or add a permanent redirect at the server. Verify with curl -I on the http address.

Run the primary journey from a clean session

A working first screen does not prove the main task completes.

Fix prompt

Run the main user journey from a clean browser. Record each request, state change, failure path, and final result.

Enforce authorization on the server

Hidden buttons do not stop a direct request to a protected action.

Fix prompt

List every protected read and write. Enforce identity and ownership on the server for each one, then test a second account against them.

Validate every server input

Browser validation can be skipped by direct requests.

Fix prompt

Add strict server-side validation and length limits to every public or authenticated mutation. Return clear errors without internal details.

Keep private keys out of browser code

Anyone who opens the page can read this key and use it directly against the service it belongs to, with your account paying for it.

Fix prompt

A server-side secret ({pattern}) is inside the JavaScript sent to browsers. Rotate it at the provider now, move the code that uses it to your server, and remove it from any frontend environment variable.

Test the main failure path

Timeouts and rejected requests need a truthful, recoverable interface.

Fix prompt

Force the main external request to time out and fail. Show a truthful error, preserve user input, and provide a retry that cannot duplicate work.

Rollback and recovery

Whether you can put the previous version back, and how long that takes.

A URL cannot verify this. A Launch Review can.

Fix prompt

Deploy a trivial change, then roll it back, and time how long the app is wrong for.

Error monitoring

Whether a failure in production reaches a human rather than sitting in a log nobody opens.

A URL cannot verify this. A Launch Review can.

Fix prompt

Trigger a deliberate error in production and see whether anything alerts you within five minutes.

Rate limiting and abuse controls

Whether a script can hammer your forms, sign up loop, or paid endpoints without being slowed down.

A URL cannot verify this. A Launch Review can.

Fix prompt

Send the same form fifty times in a minute from one address and see whether anything stops you.

How the layout holds on a phone

Whether the layout actually works at phone width. A viewport tag allows the page to adapt; it does not prove anything fits.

A URL cannot verify this. A Launch Review can.

Fix prompt

Open every important page at 375, 390, 768, 1024 and 1440 pixels wide and look for sideways scrolling, cut text and buttons under forty four pixels.

Apply row-level policies to every table

Whether the row rules behind the app actually stop one signed in account reading another's rows.

A URL cannot verify this. A Launch Review can.

Fix prompt

Sign in as one account and request another account's record by id through the API.

Keep the service role on the server

A service role bypasses row-level access checks and must never reach browser code.

Fix prompt

Search browser imports, environment variables, logs, and built files for the service role. Move every privileged operation behind an authenticated server function.

Sign in and account flows

Whether sign in, password or code reset, and session expiry behave under real use.

A URL cannot verify this. A Launch Review can.

Fix prompt

Sign in as two different accounts in two browsers and try to open the other account's pages by address.

Test personal-data deletion

Whether stored personal details are limited, deletable on request, and out of your logs.

A URL cannot verify this. A Launch Review can.

Fix prompt

Search your logs for an email address you know is in the database and see whether it appears.

Keep personal data out of logs

Email addresses and other personal details can spread into long-lived logging systems.

Fix prompt

Trigger each customer-data flow, search the resulting logs for known personal values, then redact fields at the logging boundary and repeat the test.

Fix this week

No privacy page is linked

Payment providers, app stores, and several privacy laws expect a reachable privacy page before you take anyone's details.

Fix prompt

Create a real privacy policy page at /privacy and link it from the footer on every page. It must cover what data the app collects, why, how long it is kept, who it is shared with, and how to request deletion, written for this specific app with no placeholder text and no lorem ipsum.

No terms page is linked

Without stated terms you have no written basis for suspending misuse or limiting your liability.

Fix prompt

Create a real terms of service page at /terms and link it from the footer on every page. It must cover what the service is, acceptable use, payment and cancellation terms, limitation of liability, and governing law, written for this specific app with no placeholder text and no lorem ipsum.

Review browser response headers

Explicit browser policies reduce avoidable exposure and make deployment behavior easier to inspect.

Fix prompt

This app sends no Content-Security-Policy header. Add one that starts from default-src 'self' and lists only the sources your app really loads. Roll it out in report-only mode first, watch the browser console on every page, then enforce it.

Source maps are published next to the app code

Anyone can rebuild your original files, including comments, file names, and any logic you assumed was hidden.

Fix prompt

Your production source map is public at {map_url}. Turn off source map output for production builds, or stop uploading the .map files, so readers only get the compiled bundle.

Check missing and private routes

Fallback routing can return app content where a clear missing or denied response belongs.

Fix prompt

Request a missing page and each common private path in production. Return the intended missing or denied response without internal details.

Remove sensitive values from logs

Production logs often outlive the request that created them and may be visible to more people.

Fix prompt

Review production logging. Remove tokens, authorization headers, full request bodies, personal details, and internal error stacks from user-facing responses.

Review production dependencies

Unused and outdated packages increase maintenance work and can change deployment behavior.

Fix prompt

List production dependencies, remove unused packages, review reported issues, and run the existing test and build commands after each change.

Serve a real missing page

A fallback that answers 200 for an address that never existed gets indexed and hides broken links.

Fix prompt

Request a made up address in production. Return a 404 status and render your own missing page on it, with a way back to the main task.

Follow every link on the public pages

A dead link on a launch page reads as an abandoned product.

Fix prompt

Crawl every public page, follow every internal link and every outbound citation, record the status of each, and fix or remove the ones that error.

Give every page its own title and description

Duplicated or missing titles leave search results and shared links showing the address instead of the product.

Fix prompt

Generate a unique title under sixty characters and a description under a hundred and sixty for every public page, from that page's own constants. Fix duplicates at the source, not page by page.

Set a social preview image that answers

A link with no card looks unfinished next to every other link in the same thread.

Fix prompt

Add og:image and twitter:image with a full https address, sized twelve hundred by six hundred and thirty and under two hundred kilobytes. Paste the link into a preview debugger and confirm the card renders.

Write alt text for every image

A screen reader announces the file name, or nothing at all, where alt text is missing.

Fix prompt

Crawl the public pages and list every image with no alt attribute. Describe what each one shows, or mark it decorative with an empty alt attribute.

Compress the published images

On a phone connection the first screen waits for the heaviest image on it.

Fix prompt

Export every image at the size it is displayed, serve a modern format with a fallback, keep the largest under a few hundred kilobytes, and record the size of each one.

How fast the page is for a real visitor

Whether the first screen arrives quickly on a phone connection. This check reads the page once from a server, which says nothing about what a visitor on a train sees.

A URL cannot verify this. A Launch Review can.

Fix prompt

Run Lighthouse on the published address with the mobile profile and a slow connection, and read the largest contentful paint.

Colour contrast in the interface

Whether text and controls stay readable against their background, including muted text, placeholders, disabled buttons and focus outlines.

A URL cannot verify this. A Launch Review can.

Fix prompt

Run an accessibility audit on the published pages and check every pairing reaches four and a half to one for body text and three to one for large text and controls.

Whether your forms refuse automated submissions

Whether a script can post your public forms repeatedly. Sending test traffic at your forms is not something an outside check should do uninvited.

A URL cannot verify this. A Launch Review can.

Fix prompt

Post your own form fifty times in a minute with a script and see whether anything slows it down or refuses it.

Whether the cookie choice is honoured

Whether a banner appears where it is required, and whether declining actually stops anything being stored.

A URL cannot verify this. A Launch Review can.

Fix prompt

Open the site in a clean browser, decline, then read the cookies and local storage and confirm nothing beyond the choice itself was written.

Whether the first screen asks for one thing

Whether a visitor arriving cold knows the single next step. That is a judgement about your product, not something a request can read.

A URL cannot verify this. A Launch Review can.

Fix prompt

Show the first screen to someone who has never seen it and ask what they are meant to do next.

Keep privileged Supabase work on the server

Privileged reads and writes need an authenticated server boundary.

Fix prompt

Review every privileged Supabase read and write. Keep it inside an authenticated server function and test the function with two accounts.

Match Supabase grants to row policies

A row policy cannot help when the intended role lacks table access, and broad grants expand exposure.

Fix prompt

Review table grants and row policies together. Grant only the operations each role needs, then test allowed and denied requests through the app.

Test session expiry

Expired sessions must stop protected work and return people to a recoverable sign-in state.

Fix prompt

Expire a session during a protected read and write. Confirm access stops, unsaved input is preserved where possible, and sign-in returns to the intended page.

Define personal-data retention

Keeping personal data without a time limit increases operational and privacy obligations.

Fix prompt

List each personal field, why it is collected, its retention period, and the deletion job or manual process that enforces that period.

Good to know

Review caching boundaries

Private or personalized responses must not be reused for another visitor.

Fix prompt

Inspect caching for HTML, API responses, and service workers. Exclude authenticated, payment, and personal-data routes from shared caches.

Publish the site icon set

A blank tab is one of the first things a visitor reads as unfinished.

Fix prompt

Build the icon set from the logo, including a favicon.ico, an SVG, an Apple touch icon and a maskable icon in the manifest. Request each file and confirm it answers with the right content type.

Publish robots.txt and a sitemap

Without them, search engines guess which pages exist and private or draft addresses can be found by accident.

Fix prompt

Publish a robots.txt that allows the public pages and a sitemap listing every public page once, with no private or draft addresses. Name the sitemap in robots.txt and confirm both answer with 200.

Confirm the launch numbers are being recorded

The first week of traffic cannot be recovered later if nothing was counting.

Fix prompt

Add a tool that records visits without storing cookies, confirm each event fires once, and confirm no page address and no email address reaches it.

Review the v0 release boundary

Generated and agent-edited code still needs an explicit production review.

Fix prompt

Review the production build, server and browser boundary, environment values, and generated routes. Record every observed difference from preview.

Review v0 changes before publishing

A focused diff review catches unrelated generated changes before they reach production.

Fix prompt

Review the full release diff. Remove unrelated changes, confirm each changed file has an owner, and run the checks affected by that diff.

Record v0 release evidence

A dated record makes regressions and rollback decisions easier to explain.

Fix prompt

Record the release commit, production URL, test time, owner, observed result, and rollback reference for this launch.

Review Vercel environment scope

Preview and production environment values can differ.

Fix prompt

Compare Vercel preview and production environment values, domains, redirects, and function regions. Confirm private values are server-only.

Install this as a gate your agent has to pass

Release Gate

The launch checklist and repo guardrails you install yourself.

A URL cannot verify these

Launch Review

A written review of your production layer plus a recorded walkthrough.

Change all seven answers in the checklist generator.

ShipReady is not a penetration test or a security certification. No automated check can prove an application is secure.

Last updated October 29, 2026