You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
github-actions template update (checkout@v4, setup-node@v4, pnpm/action-setup@v4) (superseded by Phase 9)
react-query ^4 -> ^5 + App Router provider slots
sass, next-plausible, react-hook-form, formik version checks + App Router slots where needed (next-plausible slipped — caught and bumped to ^4 in Phase 9)
Breaking changes
Tailwind CSS v3 -> v4 (CSS-based config via @import "tailwindcss", drop tailwind.config.js/autoprefixer, use @tailwindcss/postcss)
Update chakraWithoutEmotion test (remove --framer-motion from args)
Bugs found and fixed during E2E testing
oclif v4 single-command CLI: commands config must use { strategy: "single", target: "..." } format instead of old string path + default key. Without this, flags like --debug were parsed as command names.
CNA 15 Turbopack prompt: create-next-app@15 now prompts interactively for Turbopack. Added --turbopack flag to prevent hanging.
LandingPageTemplate missing "use client": Template uses onLoad, localStorage, and window -- needs client directive for App Router.
Emotion jsxImportSource breaks App Router: Setting jsxImportSource: "@emotion/react" globally in tsconfig makes Server Components import Emotion's JSX runtime, causing createContext is not a function. Fix: only set for Pages Router, use per-file pragma for App Router.
Emotion cache.inserted type: EmotionCache.inserted is typed as Record<string, string | true | undefined> -- no any cast needed. Values of true indicate already-inserted styles that should be skipped.
Discovered during a post-merge review of #274. PR did what it said, but two bugs slipped through and several "update to latest" todos are now stale after time passed.
Bugs
plugins/material-ui.ts:87: import path is @mui/material-nextjs/v15-appRouter but CNA is pinned to v16 — change to /v16-appRouter (breaks MUI + App Router on Next 16)
plugins/plausible.ts:11: next-plausible still pinned ^3.0.0; v4 shipped. Missed during Phase 2a "version checks".
Version currency (missed or released since merge)
TypeScript ^5 -> ^6
MUI ^7 -> ^9 (both @mui/material and @mui/material-nextjs; resolves the v15→v16 import path above)
Mantine ^8 -> ^9 (plugin + website)
vercel CLI ^50 -> ^51 (^50.0.0 does NOT cover v51)
netlify-cli ^24 -> ^25
GH Actions bump (both .github/workflows/*.yml AND plugins/github-actions.ts template):
actions/checkout@v4 -> @v6
actions/setup-node@v4 -> @v6
pnpm/action-setup@v4 -> @v5
Revisit Finish Prisma support #270: Prisma v7 is now released — re-evaluate the "too breaking" block. Still too breaking: v7 requires provider rename (prisma-client-js → prisma-client), mandatory output field, new prisma.config.ts, driver adapters (e.g. @prisma/adapter-better-sqlite3), import-path changes, removed middleware, disabled env auto-load. Needs a dedicated migration PR — left at ^6.
The project has been dormant since mid-2023. This issue tracks the full maintenance update to make create-next-stack current and relevant again.
Key decisions
--routerflagPhase 0: Build tooling & infrastructure
pipeline->tasks)Phase 1: Slot system refactoring + router flag
--routerflag (app/pages, default app)slots.app->slots.pagesApp, addslots.appLayoutfor App Routerproviders.tsxpattern (separate'use client'wrapper component)app/layout.tsx,app/providers.tsx,app/page.tsxcreate-next-app13.2.3 -> 15.x, update CNA flagsPhase 2: Plugin updates
Simple bumps
framer-motion->motion^12 (package renamed, imports frommotion/react)Breaking changes
@import "tailwindcss", drop tailwind.config.js/autoprefixer, use@tailwindcss/postcss)@emotion/react, drops@emotion/styled/framer-motion/@chakra-ui/icons, usescreateSystem/defineConfig, needsnext-themes)postcss-preset-mantine, CSS imports,createTheme). Hybrid App Router approach: layout slots for CSS import/mantineHtmlProps/ColorSchemeScript, provider slots forMantineProvider(superseded by Phase 9: now ^9)@mui/material-nextjsfor App Router (AppRouterCacheProvider) (superseded by Phase 9: now ^9)@types/styled-components, add App Router registry viauseServerInsertedHTML)CacheProvider+useServerInsertedHTML), add README todo about CSS-in-JS Client Component requirementInfrastructure
postcssConfigslot to Plugin type (likenextConfigslots) for PostCSS plugin merging (Mantine + Tailwind coexistence)next.config.js->next.config.tsgenerationFormatting/hooks
mrm/mrm-task-lint-staged, use Husky v9 (npx husky init) + lint-staged ^16Phase 3: Validation rules
Phase 4: E2E tests
--router=pagestest variants (pages-router-emotion-all-flags, pages-router-tailwind-css-only)--prismaand--github-actionsto all-flags testsBugs found and fixed during E2E testing
commandsconfig must use{ strategy: "single", target: "..." }format instead of old string path +defaultkey. Without this, flags like--debugwere parsed as command names.create-next-app@15now prompts interactively for Turbopack. Added--turbopackflag to prevent hanging."use client": Template usesonLoad,localStorage, andwindow-- needs client directive for App Router.jsxImportSourcebreaks App Router: SettingjsxImportSource: "@emotion/react"globally in tsconfig makes Server Components import Emotion's JSX runtime, causingcreateContext is not a function. Fix: only set for Pages Router, use per-file pragma for App Router.cache.insertedtype:EmotionCache.insertedis typed asRecord<string, string | true | undefined>-- noanycast needed. Values oftrueindicate already-inserted styles that should be skipped.CI fixes (PR #274)
--jsonlists test cases not files (use--filesOnly),--poolOptions.*removed (use--no-fileParallelism)require.resolve(): Replace withimport.meta.resolve()+fileURLToPath()verbatimModuleSyntax: true, convert 53 files toimport type.ts/.tsxextensions fail across router configs)no-explicit-anyin LandingPage utils--no-frozen-lockfileflag (pnpm usesci-infoto detect CI)ThemeProvider: Alias MUI's toMuiThemeProviderwhen Chakra+MUI coexistproviderAfterImportstoproviderLogicfor TS narrowing@types/reactcorruption:auto-install-peersrewrites@types/reactto^6.0.0; fix by adding explicit@types/react@^19devDepprettier-plugin-organize-importsas tmpDependency to dedupe/sort imports during formatting.prettierignore(with prettier plugin) to exclude lock files; E2E creates temp ignore when prettier not selectedStyledComponentsRegistrycomponent so early return doesn't make other plugins' hooks conditionalPhase 5: Website overhaul
Phase 6: Next.js 16 / CNA 16 support
create-next-appfrom v15 to v16, add--yesflag (skips React Compiler prompt).eslintrc.json->eslint.config.mjs(flat config, ESLint v9)next lint->eslinteslint-config-prettier)removeOfficialCNAContentfor CNA 16 file structureperformFinalChecksfor new lint command (already usesnpm run lint)Phase 7: Update internal tooling dependencies
Website
ESLint ^9 -> ^10Blocked:eslint-config-next@16plugins don't support ESLint 10 yetCLI internal tooling
.eslintrctoeslint.config.mjs(flat config)typescript-eslintpackage)Phase 8: Migrate CLI to ESM
tsconfig.json:module: "nodenext",moduleResolution: "nodenext",rewriteRelativeImportExtensions: true, dropdeclaration: truepackage.json: add"type": "module"bin/run+bin/dev: convertrequire()toimport()__dirnameusages withimport.meta.dirname.tsextensions to all relative importsPhase 9: Post-merge review follow-ups (2026-04-18)
Discovered during a post-merge review of #274. PR did what it said, but two bugs slipped through and several "update to latest" todos are now stale after time passed.
Bugs
plugins/material-ui.ts:87: import path is@mui/material-nextjs/v15-appRouterbut CNA is pinned to v16 — change to/v16-appRouter(breaks MUI + App Router on Next 16)plugins/plausible.ts:11:next-plausiblestill pinned^3.0.0; v4 shipped. Missed during Phase 2a "version checks".Version currency (missed or released since merge)
@mui/materialand@mui/material-nextjs; resolves the v15→v16 import path above)^50.0.0does NOT cover v51).github/workflows/*.ymlANDplugins/github-actions.tstemplate):actions/checkout@v4->@v6actions/setup-node@v4->@v6pnpm/action-setup@v4->@v5prisma-client-js→prisma-client), mandatoryoutputfield, newprisma.config.ts, driver adapters (e.g.@prisma/adapter-better-sqlite3), import-path changes, removed middleware, disabled env auto-load. Needs a dedicated migration PR — left at ^6.