Hype StackHypeStack

Going to production

Use this checklist before you point real users at a Hype Stack deploy. The fastest path is hype-stack deploy on Fly or Railway; the checks below still apply if you host the pieces yourself.

Production checklist

AreaWhat to verify
DatabaseDATABASE_URL points at the intended Postgres (not local Docker)
CacheVALKEY_URL (and password if required) match the deployed Valkey / Redis
StorageRUSTFS_* / bucket credentials match the environment; see Storage
Frontend envVITE_API_BASE_URL is the public API origin
Backend originsFRONTEND_URL (and admin URL if present) match deployed sites for CORS and email links
Auth (WorkOS)Redirect URIs and cookie settings match production domains
Auth (Better Auth)BETTER_AUTH_URL matches the public API origin; Google callback URIs updated
AdminSUPER_ADMIN_EMAIL includes your operator accounts
BillingStripe live keys, webhook URL → /checkout/webhook, price IDs for live mode
EmailRESEND_API_KEY and verified RESEND_FROM_DOMAIN
MonitoringOptional SENTRY_DSN / VITE_SENTRY_DSN for the production projects
MigrationsSchema applied with migrate deploy (or via hype-stack deploy)
DomainsCustom url values in stack.json match DNS; auth callbacks updated

Safety pitfalls

Wrong FRONTEND_URL or API origin

Auth callbacks, CORS, and email links all depend on these lining up. A staging frontend talking to a production API (or the reverse) fails in confusing ways.

Better Auth URL drift

BETTER_AUTH_URL must be the public API origin Better Auth is served from. If it still says http://localhost:3000 in production, sign-in and OAuth callbacks break.

WorkOS / Google redirect mismatch

Provider consoles must list the production callback URLs. Localhost entries alone are not enough. See the WorkOS and Better Auth pack pages.

Stripe webhook still on localhost

Live mode needs a public webhook endpoint and a live STRIPE_WEBHOOK_SECRET. The Stripe CLI secret only works for forwarded local events.

Migrations skipped or pointed at the wrong database

Deploying app code against an old schema fails at runtime. Prefer the release / pre-deploy migration step from deploy. Never run migrate dev against a shared production database.

Final preflight

  1. Run typecheck and tests locally against the branch you will ship
  2. Confirm env vars on every app and service
  3. Deploy with npx @hype-stack/cli deploy (or your own pipeline)
  4. Hit /ping on the API and sign in once on frontend and admin
  5. Trigger a test Stripe webhook (or a sandbox checkout) if billing is installed
  6. Confirm Observability is receiving events if Sentry is configured
Sponsor open source

Every purchase and sponsorship funds my 8+ years of work on open source given freely to the community. It keeps the lights on, funds new packs, and keeps the ecosystem alive. Even a small tier means a lot. Thank you!

Sponsor on GitHub