Deployment Checklist
The shortest path from "works locally" to a real production URL.
1. Make it work locally first
Do not skip this.
teeny deploy --localnpx teeny deploy --localteeny dev --localnpx teeny dev --localBefore you deploy, verify at least these:
curl http://localhost:8787/api/v1/healthThen check these in the browser:
http://localhost:8787/api/v1/doc/ui- your main sign-up flow
- your main login flow
- at least one protected write action
2. Create production secrets
cp .dev.vars .prod.varsThen open .prod.vars and replace every value with a strong random string. Generate one per secret with:
openssl rand -base64 32At minimum, replace all of these:
JWT_SECRETJWT_SECRET_USERSADMIN_JWT_SECRETADMIN_SERVICE_TOKENPOCKET_UI_VIEWER_PASSWORDPOCKET_UI_EDITOR_PASSWORD
3. Create or reuse your Teenybase Cloud account
First time:
teeny registernpx teeny registerAlready have an account:
teeny loginnpx teeny login4. First remote deploy
Before deploying, set RESPOND_WITH_ERRORS to false in .prod.vars (or under [vars] in wrangler.jsonc) so failed SQL generation/execution errors do not return raw SQL errors to the caller.
teeny deploy --remotenpx teeny deploy --remoteOn the first remote deploy, teenybase also uploads .prod.vars automatically.
5. Copy the exact production URL
teeny statusnpx teeny statusCopy the exact URL it prints.
Use that exact URL for:
- your frontend API base URL
- Google OAuth callback/origin setup
Set appUrl separately based on where users should land after browser auth and where email links should point to:
- frontend app: set
appUrlto the frontend's public URL - backend-only app (no frontend yet): set
appUrlto your real deployed backend URL
For email verification and password reset, appUrl is also the base for the link templates teenybase embeds in outgoing emails ({appUrl}/reset-password/{token} and {appUrl}/verify-email/{token}). Your frontend hosts those routes. See Email Verification & Password Reset.
6. Update appUrl and deploy again if needed
If appUrl was still set to localhost or a placeholder value, fix it now.
export default {
appUrl: 'https://YOUR_REAL_FRONTEND_URL_HERE',
// rest of config
}Then redeploy:
teeny deploy --remotenpx teeny deploy --remote7. Later secret changes
Changing .prod.vars locally does nothing until you upload the new values.
teeny secrets --remote --uploadnpx teeny secrets --remote --upload8. Final pre-launch check
Before you hand the URL to users, verify all of these:
teeny statusshows the URL you expectappUrlmatches the real deployed URL- sign-up works in production
- login works in production
- one protected write action works in production
- if you use Google auth, the provider settings match the deployed URL exactly
- if you send emails, password reset and verification work end to end
.prod.varscontains real secrets, not dev defaults
9. Useful production commands
Get the live URL again:
teeny statusnpx teeny statusList your deployed apps:
teeny listnpx teeny listDelete an app you no longer need:
teeny delete my-appnpx teeny delete my-appIf you self-host on your own Cloudflare account
The flow is mostly the same. The main difference is that your wrangler.jsonc points at your own Cloudflare account instead of Teenybase Cloud.
Authenticate with Cloudflare first:
wrangler loginThen use the same deploy command:
teeny deploy --remotenpx teeny deploy --remote