Turn a product idea into a production-ready architecture, a generated starter repo, and a live deploy — in one shot.
See ARCHITECTURE.md for the full design.
apps/web Next.js 15 (App Router, RSC streaming, Clerk, Tailwind)
services/api FastAPI + uv + Alembic + arq worker
packages/ui Shared React components
packages/schemas Shared Zod schemas (mirror of Pydantic in services/api)
infra/terraform Neon · Upstash · R2 · Fly · Vercel
.github/workflows CI + prod deploy pipeline
# prereqs: pnpm 9, node 20, python 3.12, uv, terraform 1.9+
make install
cp .env.example .env
cp apps/web/.env.local.example apps/web/.env.local
cp services/api/.env.example services/api/.env
make devWeb: http://localhost:3000 · API: http://localhost:8000/healthz
make bootstrap # terraform apply: infra
make migrate # alembic upgrade head
git push origin main # GitHub Actions handles deploy + smoke + rollbackClicking Deploy on a finished generation fans out to three providers:
- Neon — creates a preview branch, forwards
DATABASE_URLonward - Fly.io —
createApp+flyctl deploy --remote-onlyagainst the generatedservices/apidirectory (Fly's remote builder does the image build, so no Docker-in-Docker) - Vercel — uploads each file under
apps/webto/v2/files, thenPOST /v13/deployments, and polls untilreadyStateis terminal
Missing provider tokens (FLY_API_TOKEN, VERCEL_API_TOKEN,
NEON_API_KEY) cause that driver to fall back to a deterministic
dry-run URL so local dev works without credentials. The pipeline fetches
and extracts the R2 tarball once per run and hands the path to both
drivers via DeployContext.extracted_path.
Rollback is just a redeploy of a prior generation: each plan has a
history list at GET /v1/plans/{id}/generations, and deploying any
non-latest generation tags the audit row with
rollback: true, rollback_from_generation_id: <id> for forensics.