Generate production-ready React project with TypeScript, Tailwind, testing, CI/CD. Use when user asks to "scaffold a React app".
Generate production-ready React project with TypeScript, Tailwind, Vitest, Playwright, and GitHub Actions CI/CD — scaffolded from decisions, not defaults.
"Every React project should start with tested foundations, not framework fatigue. The best scaffold is the one the team will actually maintain."
scaffold-nextjs-app).[HECHO] if confirmed, [SUPUESTO] if inferred from repo context.pnpm-workspace.yaml, turbo.json) → scaffold as a Turborepo app package.tsconfig.json strict baseline (see BoK). Relax only with documented rationale.docs/ADR-001-stack-decisions.md.vite.config.ts with path aliases (@/), proxy config, and vitest inline config block.tsconfig.json with strict: true, paths matching vite aliases, noUncheckedIndexedAccess: true.tailwind.config.ts with content paths, design token extension, and dark-mode class strategy..env.example with all required variables; never commit .env. Write src/env.ts with Zod validation.eslint.config.mjs using flat config + @typescript-eslint/strict, eslint-plugin-react-hooks, eslint-plugin-jsx-a11y.vitest.config.ts (or inline in vite.config.ts), jsdom environment, coverage with v8 provider.@testing-library/react, @testing-library/user-event, @testing-library/jest-dom.src/test/setup.ts with jest-dom matchers import and global cleanup.playwright.config.ts targeting Chromium + Firefox, base URL from env, screenshots on failure.msw).statements: 70, branches: 65, functions: 70 minimum. Add to CI gate..github/workflows/ci.yml: install → type-check → lint → unit tests + coverage → build → E2E (headless).husky pre-commit hook: lint-staged running ESLint + Prettier on staged files only.Dockerfile with multi-stage build (node:20-alpine build stage, nginx:alpine serve stage).README.md with: local setup, env variables, test commands, deployment notes.pnpm run build and pnpm run test to verify scaffold compiles and passes baseline.| Decision | Default Choice | Alternative | When to Switch |
|---|---|---|---|
| Build tool | Vite 5 | Rspack / Turbopack | Build times >60s in CI at scale |
| State — local | Zustand 5 | Jotai, Recoil | Team prefers atomic model |
| State — server | TanStack Query v5 | SWR, Apollo | GraphQL-first → Apollo; simplicity → SWR |
| Routing | React Router v7 | TanStack Router | Type-safe route params required |
| Styling | Tailwind CSS v4 | CSS Modules | Design token system incompatible with Tailwind |
| Component library | shadcn/ui (headless) | Mantine, Chakra | Fully managed a11y needed out of box |
| Testing unit | Vitest + RTL | Jest + RTL | Legacy Jest suite already exists |
| Testing E2E | Playwright | Cypress | Team has existing Cypress knowledge |
| Forms | React Hook Form + Zod | Formik | Large forms with complex validation |
| Dates | date-fns | dayjs | Bundle size <3kb target |
pnpm run build exits 0 with no TypeScript errors.pnpm run test exits 0 with coverage above configured thresholds.pnpm run lint exits 0 — no ESLint errors, no unresolved @/ aliases.Dockerfile builds a working image: docker build -t app . && docker run -p 80:80 app.index.css for component styles — Causes specificity wars. Use Tailwind utility classes or CSS Modules per component.useState or Zustand slice.strict: false silently allows any propagation, defeats the purpose. Accept the initial friction..env files — Use .env.example + runtime Zod validation. Add .env* to .gitignore from day one.scaffold-nextjs-app instead.2699c1e
Also appears in
since Aug 28, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.