platform/architecture/tanstack-rust-migration.
For how to start the native services, run the dual-stack Docker stack, deploy
the Workers, validate the Vercel TanStack frontend build, or expose a VPS
through Cloudflare Tunnel, use
TanStack/Rust Local And Deployment.
Purpose
Use this runbook when proving the new production target is ready:apps/tanstack-webserves the frontend.apps/backendserves Rust-owned backend routes.- the dual stack runs from production Docker artifacts.
- compare mode proves the legacy and new frontend paths can pass the same smoke suite before traffic moves.
Local Dual-Stack Commands
Validate the compose file without starting anything:docker-compose.tanstack-dual.yml, waits for backend-dual
and tanstack-web-dual to become healthy, runs Playwright in
apps/tanstack-web, and tears the stack down unless --keep-up is passed to
the runner.
Run the focused compare smoke used by CI:
Services And Ports
docker-compose.tanstack-dual.yml exposes only loopback ports by default:
The frontend healthcheck must prove the root page renders and can reach the
backend. Keep real secret values in ignored env files or CI secrets; docs and
workflow files should reference environment variable names only.
CI Coverage
The E2E workflow includes a migration matrix:tanstack-dual-stackruns the minimal dual-stack compose runner againstapps/tanstack-web/e2e.compare-smokerunsscripts/run-web-e2e-docker.js --frontend compareagainst a focused public no-auth spec.
tmp/e2e artifacts for failure triage.
Evidence For Gates
The final cutover gate consumes fresh evidence reports:--skip-* evidence flags.
Final Checklist
bun migration:tanstack:cutover-checkpasses with zerolegacy-nextartifacts.- dual-stack Docker E2E passes against
docker-compose.tanstack-dual.yml. - compare-mode Docker E2E passes for both Next and TanStack frontends.
- benchmark compare evidence is fresh and within thresholds.
- Cloudflare smoke probes pass for backend and TanStack origins.
bun migration:tanstack:gatesexits0with all evidence present.- final
bun validatepasses or has only documented unrelated blockers.
apps/web available as rollback fallback until the cutover window is
complete and the post-cutover smoke has stayed green.
Satellite additions during migration
The main manifest inventories the live Web API and dashboard. New satellite surfaces must also remain visible: register their exact source-based route IDs inapps/tanstack-web/migration/satellite-route-overrides.json. The manifest command
also generates satellite-route-backlog.json; bun migration:tanstack:check
verifies both inventories. The satellite registry currently covers hosted Learn
playground pages, Infrastructure account benefits and the native Meet editor
shell. Adding an app derives its inventory from the registered source path;
removing a registered route requires an explicit accepted-removal decision.
Preserve shared Internal API contracts and authorization when migrating each
surface. This backlog does not change live routing or authorize a Rust cutover.
Meet production cutover
Meet’s production publication is admitted intuturuuu.ci.ts
(productionPublicationPolicy.meet, surfaces frontend and realtime-do).
Unlike Calendar, Meet does not change origin: the native Start + Void build
publishes as a new version of the same tuturuuu-meet Worker that served the
legacy OpenNext build, on the same meet.tuturuuu.com custom domain. The
MeetLiveDurableObject migration (meet-live-v1) is identical in both
configurations, so no Durable Object migration runs.
Release owner steps:
- Promote a green
mainSHA toproduction. The planner selectsmeet-cloudflare.yaml; itsdeployjob records the currenttuturuuu-meetandtuturuuu-meet-realtimeversions and deployments in themeet-rollback-<sha>-<run>artifact before any write. - Private smoke before promotion (required): the deploy job’s
wrangler deployis the public flip, so first upload the qualified artifact withwrangler versions upload(no traffic) and route only operator requests to it with theCloudflare-Workers-Version-Overridesheader onmeet.tuturuuu.com. Promote only after the real-call QA passes (join, SFU media, lobby rename, consent, an authenticated API call and a server action). Record the legacytuturuuu-meetandtuturuuu-meet-realtimeversion IDs first. - Keep
MEET_AI_ENABLED_WORKSPACE_IDSset as a secret ontuturuuu-meet(Meet AI is default-allow without it; the deploy job fails closed) and watch errors for 30 minutes after the flip, rolling back at the first regression. - Rollback is one step:
wrangler versions deploy <legacy-version-id>@100% --name tuturuuu-meet(and the same fortuturuuu-meet-realtimeif its version changed), using the IDs from the rollback artifact. Rehearse once before announcing. - Verify
https://meet.tuturuuu.com/api/build-inforeports the promoted SHA.
productionPublicationPolicy.meet back to
{ state: 'held', reason: ... }; the planner and the deploy job’s
production-policy gate then skip every Meet production write.