Branch-to-Environment Map
Hosted Web Release Flow
Preview
- Preview workflows are named
vercel-preview-<app>.yaml. - Most preview workflows are manual-only from
mainwith a requiredpreview_ref;vercel-preview-platform.yamlalso triggers on protectedmainpushes so the staging database workflow receives a same-SHA platform build signal. e2e-tests.yamlalso runs only on non-productionpushes; production promotion relies on the already-green validation before the branch is promoted plus the production build-validation gates below.- Each workflow checks whether a newer commit exists on the same branch before spending time on install/build/deploy.
- Each deploy job is bound to a
vercel-preview-<app>GitHub Environment and introduces Vercel credentials only after dependency installation. - Platform preview is build validation only; on-premise machines own the actual
apps/webruntime deployment. - Satellite preview deploys remain the normal Vercel validation surface for
branch work and merged
mainchanges. - Platform preview can reuse a successful same-SHA production platform build marker to avoid redundant preview builds. Production does not reuse preview markers because it must build and deploy the prebuilt production artifacts.
Staging Database
supabase-staging.yamlis tied to theVercel Platform Preview Deploymentworkflow onmain.- The staging migration runs only when the triggering platform preview build concludes successfully, or when manually dispatched.
- The staging deploy step runs
supabase db push --include-allafter linking the staging Supabase project, so staging can converge aftermainmigration history changes. - This means
mainis where app preview and staging schema advancement are meant to stay aligned. - If a production commit was promoted before the same-SHA staging migration run
existed, manually dispatch
supabase-staging.yamlfrommain; production migration re-evaluates after that staging run succeeds.
Production
- Satellite production web deploys run through
vercel-production-<app>.yaml. - Hosted
apps/webproduction deploys run throughvercel-production-platform.yaml; self-hosted machines still use the Docker release flow below for their own runtime deployment. apps/appsproduction deploys are handled byvercel-production-apps.yaml.apps/qrproduction deploys are handled byvercel-production-qr.yaml.- The production workflow also skips if a newer commit already exists on
production. - Production deploy jobs are bound to
vercel-production-<app>GitHub Environments and reject manual dispatches unless the selected branch isproduction.
Browser App Version Metadata
- Browser apps share one platform version from
packages/utils/src/platform-release.ts; do not read visible app versions from individual apppackage.jsonfiles. - The shared browser app version is the
TUTURUUU_PLATFORM_VERSIONconstant exported frompackages/utils/src/platform-release.ts. Release Please owns that value (it carries thex-release-please-versionannotation), so do not pin a literal version in docs or bump it by hand. Read the constant directly when you need the current value. - Every Vercel browser app workflow runs
bun run --silent scripts/ci/generate-build-metadata.tsbeforevercel build. The generated metadata includes the commit hash, short hash, commit message, ref, environment, deployment URL, deployment stamp, and build timestamp. - The account-scoped version badge uses
public.user_configskeySHOW_VERSION_BADGE. It is hidden by default and only exact@tuturuuu.comaccounts may enable a truthy value. - Exact-domain enforcement happens on the server through
isExactTuturuuuDotComEmail; subdomains such as@xwf.tuturuuu.comare not eligible, and client cookies cannot make the badge render for ineligible users.
Production Database
supabase-production.yaml is stricter than staging:
- It re-evaluates automatically after either
Vercel Platform Production Deploymentcompletes its production deploy onproductionorSupabase Staging Migrationcompletes onmain. - The production platform deployment for the target commit must have concluded
successfully on
productionand recorded the successfulvercel-production-platformdeployment marker for the same SHA. A workflow run that skipped because package releases were still publishing is not enough. - The
mainstaging migration for the same target commit must have completed with asuccessconclusion. - A manual dispatch can still be used when an operator explicitly wants to run
it, but the dispatch must select the
productionbranch and still satisfy the same production-deployment and staging-migration SHA checks.
supabase db push --include-all. This keeps production schema changes
behind application deployment, staging validation, and branch promotion
for the same commit.
Self-Hosted Web Release Flow
If a server receives code throughgit pull, use the Docker production commands from
the checked-out commit:
bun serve:web:dockerfor in-place replacementbun serve:web:docker:bgfor blue/green rebuild-before-cutover deployment
Migration Release Path (TanStack + Rust)
apps/web (Next.js, port 7803) is being replaced by apps/tanstack-web
(TanStack Start) plus apps/backend (the Rust HTTP core, port 7820). See
the TanStack/Rust migration overview
for the full plan.
While that migration is incomplete, Docker blue/green remains the canonical
production rollout and rollback mechanism for the live hostname. Cloudflare
Workers are used as a separate, incremental preview surface to prove Worker
compatibility for apps/tanstack-web and apps/backend before any cutover:
- Validate the Wrangler deploy configs without contacting Cloudflare with
bun check:cloudflare. - Deploy the Rust backend Worker (
apps/backend/wrangler.jsonc) and the TanStack Start Worker (apps/tanstack-web/wrangler.jsonc) to preview, then smoke both returned origins withbun smoke:cloudflare. - Do not route the production hostname to preview Workers until the
TanStack/Rust route manifest, compare-mode Docker E2E, benchmark report, and
cutover gates (
bun migration:tanstack:gates) all pass. - Rollback from the preview path is DNS/routing-based (remove the Cloudflare
route or roll back the Worker version); the Docker blue/green
apps/webstack keeps serving the canonical hostname throughout.
Team Release Checklist
- Merge the change set with green CI.
- If Docker behavior changed, make sure
docker-setup-check.yamlis green. - If database migrations changed, confirm the
main-driven staging path first. - Promote to
productiononly after preview and staging behavior is understood. - Confirm the follow-up Supabase workflow after production deployment.
- For self-hosted rollout, deploy from the intended commit and prefer
bun serve:web:docker:bg.
Rollback Guidance
- Vercel-hosted rollback: for satellite apps, redeploy the previous known-good commit or use Vercel rollback tooling.
- Supabase rollback: use a corrective migration instead of editing applied migration history.
- Self-hosted Docker rollback: checkout the previous known-good commit and rerun
bun serve:web:docker:bg.
What Not To Do
- Do not push production schema changes directly from a laptop as the normal path.
- Do not assume staging and production migrations are interchangeable; they are gated differently.
- Do not manually dispatch production Supabase migration from
main; the only validmainpath is the automatic staging-migration re-evaluation, and the production gate still requires the same commit to have both a successful production platform deployment and a completed successfulmainstaging migration. - Do not use the in-place Docker path when you specifically need rebuild-before-restart semantics.