
Scaffold Nextjs
- 406 installs
- 74 repo stars
- Updated August 5, 2026
- mblode/agent-skills
scaffold-nextjs is a Claude agent skill that generates a production-ready Next.js turborepo with TypeScript, Tailwind, Blode UI, Ultracite tooling, and Vercel deployment so developers starting web projects skip repetitiv
About
scaffold-nextjs is an mblode/agent-skills agent skill (version 1.0.1) that scaffolds a production-ready Next.js turborepo through an 8-phase workflow: gather project metadata, create the Next.js app, install Blode UI from ui.blode.co, add Agentation, install Ultracite (Biome-based lint/format with husky), convert to Turborepo, configure GitHub and Vercel, and run a pre-launch checklist. The skill enforces opinionated conventions—no src directory, no ESLint (Ultracite replaces it), blode-icons-react instead of lucide-react—and ships reference files for turbo.json, biome.jsonc, next.config.ts, and deploy steps. Developers reach for scaffold-nextjs when spinning up marketing sites or web apps that need consistent TypeScript, Tailwind, shadcn CLI, and CI-ready monorepo structure, with handoffs to optimise-seo and audit-ui skills after deployment.
- Opinionated Next.js project bootstrap
- App router and layout defaults
- TypeScript and styling conventions
- Agent-ready file structure
- Faster first feature PRs
Scaffold Nextjs by the numbers
- 406 all-time installs (skills.sh)
- +22 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #659 of 2,245 Frontend Development skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/mblode/agent-skills --skill scaffold-nextjsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 406 |
|---|---|
| repo stars | ★ 74 |
| Last updated | August 5, 2026 |
| Repository | mblode/agent-skills ↗ |
How do you scaffold a production Next.js turborepo?
Generate a Next.js app scaffold with routing, layout, and conventions so agents start frontend work from a consistent production-ready baseline.
Who is it for?
Developers starting a new Next.js marketing site or web app who want an opinionated turborepo with Blode UI and Vercel deploy baked in.
Skip if: Teams with existing Next.js monorepos who only need minor feature work or who require ESLint and lucide-react instead of Ultracite and blode-icons-react.
When should I use this skill?
User asks to create a Next.js project, bootstrap a turborepo, scaffold a new website, or start a production-ready web app from scratch.
What you get
Next.js turborepo monorepo, Blode UI components, Ultracite config, GitHub repo, and Vercel deployment checklist.
- Next.js turborepo
- turbo.json and biome.jsonc configs
- Vercel deployment setup
By the numbers
- Runs an 8-phase scaffolding workflow from app creation to pre-launch checklist
- Skill package version 1.0.1
- Includes 3 reference files: app-setup.md, turbo-configs.md, deploy-and-launch.md
Files
Scaffold Next.js
Scaffold a Next.js turborepo with full tooling, GitHub, and Vercel deployment.
- IS: bootstrapping a brand-new Next.js turborepo end to end: app creation, Blode UI, Ultracite tooling, turborepo conversion, GitHub, and Vercel.
- IS NOT: scaffolding a TypeScript CLI or npm package (use
scaffold-cli), designing folder structure or module contracts for an existing app (usedefine-architecture), or choosing visual direction and palettes (useui-design).
This is a low-freedom workflow. Commands live in the reference files and are exact: run them as written, in phase order. The reference files are the single source of truth for commands; do not reconstruct them from memory.
Reference Files
| File | Read When |
|---|---|
references/app-setup.md | Starting Phase 2: create-next-app flags, shadcn + Blode registry setup, Agentation, Ultracite commands, and the move into apps/web/ |
references/turbo-configs.md | Starting Phase 6: root package.json, turbo.json, .gitignore, knip.json, workspace scripts, next.config.ts |
references/deploy-and-launch.md | Starting Phase 7: GitHub setup, Vercel deployment, favicon, OG images, validation checklist |
Scaffold Workflow
Copy this checklist to track progress:
Scaffold progress:
- [ ] Phase 1: Gather project info
- [ ] Phase 2: Create Next.js app
- [ ] Phase 3: Install Blode UI components
- [ ] Phase 4: Install Agentation
- [ ] Phase 5: Install Ultracite
- [ ] Phase 6: Convert to Turborepo
- [ ] Phase 7: GitHub and Vercel setup
- [ ] Phase 8: Pre-launch checklist
- [ ] Validation: run the checklist in deploy-and-launch.mdPhase 1: Gather project info
Collect from the user (ask only what was not provided):
| Variable | Example | Default | Used in |
|---|---|---|---|
{{name}} | acme-web | none (required) | Root package.json, directory name, README |
{{description}} | Marketing site for Acme | none (required) | App package.json, README |
{{repo}} | acme-corp/acme-web | none (required) | GitHub remote URL |
{{domain}} | acme.com | none (ask if missing) | Vercel custom domain, metadataBase |
{{author}} | Your Name | none (required) | package.json author |
{{year}} | 2026 | current year | LICENSE |
Phase 2: Create Next.js app
Load references/app-setup.md and run the create-next-app command exactly as written there (it pins the linter, React Compiler, and package-manager flags). Confirm the app loads at http://localhost:3000 before moving on.
Phase 3: Install Blode UI components
Follow the Blode UI section in references/app-setup.md: shadcn init, then register the @blode namespace, then add components. Registration must come before any add @blode/... call. Always use blode-icons-react for icon imports (never lucide-react).
Phase 4: Install Agentation
Follow the Agentation section in references/app-setup.md: install the package and patch app/layout.tsx with the dev-only <Agentation /> guard. Optionally add Google Analytics via @next/third-parties.
Phase 5: Install Ultracite
Follow the Ultracite section in references/app-setup.md: delete the Biome placeholder config, run ultracite init with the exact flags listed, then verify with npx ultracite fix and npx ultracite check.
Phase 6: Convert to Turborepo
Move the app into apps/web/ (commands at the end of references/app-setup.md), then load references/turbo-configs.md and:
1. Generate root package.json, turbo.json, knip.json, and .gitignore from the templates. 2. Update apps/web/package.json scripts to the turbo-compatible block in the reference. 3. Verify apps/web/next.config.ts has reactCompiler: true. 4. Run npm install from the root. 5. Verify npm run dev works from the root (turbo runs apps/web).
Phase 7: GitHub and Vercel setup
Load references/deploy-and-launch.md. Create the GitHub repo with gh, deploy to Vercel, and attach {{domain}}.
Phase 8: Pre-launch checklist
Follow the favicon and OG image steps in references/deploy-and-launch.md, then run the validation checklist at the end of that file. The scaffold is done only when every validation item passes; "the site loads" is not sufficient evidence.
Placeholder Reference
All templates use {{variable}} syntax. Before Phase 7, sweep for missed placeholders:
grep -rn '{{' --include='*.json' --include='*.ts' --include='*.tsx' --include='*.md' .A {{name}} left in package.json makes npm install fail with an invalid-name error; a {{domain}} left in metadata ships broken OG URLs.
Gotchas
- Do not add a
src/directory. The scaffold uses--no-src-dir; introducingsrc/later breaks the@/*alias and every shadcn component path. - Do not add ESLint or Prettier. Ultracite owns lint and format via Oxlint + Oxfmt; a stray
.eslintrcmakes the editor disagree with the lefthook pre-commit hook. - Do not run
oxlintoroxfmtad hoc; usenpx ultracite fix/npx ultracite check(ornpm run fix/npm run checkat the root) so config resolution matches the hook. Theoxlint ./oxfmt .scripts insideapps/web/package.jsonexist only so turbo can orchestrate per-workspace tasks. - Do not configure git hooks manually.
ultracite initwriteslefthook.ymland aprepare: lefthook installscript; adding husky or another hook manager double-runs or skips fixes. - Do not put app dependencies in the root
package.json. The root holds onlyturboandultracite; app deps at the root break workspace isolation and turbo cache keys. - Do not run
npx shadcn@latest add @blode/...beforenpx shadcn@latest registry add @blode=.... The unregistered namespace makes the add command fail. - Do not import from
lucide-react.blode-icons-reactis the icon library for Blode UI; mixed imports bundle two icon sets. Replace any generatedlucide-reactimport paths. - Do not create
apps/web/by hand. Scaffold at the root first, then move it in Phase 6; hand-building skips create-next-app defaults (Tailwind wiring, alias config). - Do not deploy from the dashboard without checking the Root Directory. If Vercel serves a 404 or the wrong app, set the project Root Directory to
apps/webin Settings > General.
Skill Handoffs
| When | Run |
|---|---|
| After deployment, optimise SEO | optimise-seo |
| Before launch, audit UI quality | ui-audit |
| Before launch, add motion and animation | ui-animation |
App Setup Commands
Contents
- Phase 2: Create Next.js app
- Phase 3: Install Blode UI components
- Phase 4: Install Agentation
- Phase 4.1: Add Google Analytics (optional)
- Phase 5: Install Ultracite
- Phase 6 prep: Move into apps/web/
---
Phase 2: Create Next.js app
Run non-interactively with all flags:
npx create-next-app@latest {{name}} --typescript --tailwind --biome --react-compiler --app --no-src-dir --import-alias "@/*" --use-npmThis sets up: TypeScript, Tailwind CSS v4, Biome (a placeholder, replaced by Oxlint + Oxfmt via Ultracite in Phase 5), React Compiler, App Router, Turbopack (default in Next.js 16+), no src/ directory, @/* import alias, npm as package manager.
If running interactively, select "No, customize settings" at the defaults prompt, then choose:
- TypeScript: Yes
- Which linter: Biome (will be replaced by Oxlint + Oxfmt in Phase 5)
- React Compiler: Yes
- Tailwind CSS: Yes
- src/ directory: No
- App Router: Yes
- Import alias:
@/*
After creation, verify:
cd {{name}}
npm run devConfirm the app loads at http://localhost:3000.
Phase 3: Install Blode UI components
Blode UI is a third-party shadcn/ui registry hosted at ui.blode.co. Use the hosted @blode namespace flow by default.
npx shadcn@latest init
npx shadcn@latest registry add @blode=https://ui.blode.co/r/{name}.json
npx shadcn@latest add @blode/buttonOrder matters: registry add must run before any add @blode/... call, otherwise the namespace is unknown and the add fails.
This creates:
components.json: shadcn configuration plus the Blode registry mappinglib/utils.ts:cn()helper (clsx + tailwind-merge)components/ui/button.tsx: button from theui.blode.coregistry- CSS variable updates in
app/globals.css
Icon library requirement:
- Use
blode-icons-reactfor all icon imports. - If any generated file imports
lucide-react, replace import paths withblode-icons-react.
Phase 4: Install Agentation
npm install agentationPatch app/layout.tsx:
1. Add import at the top:
import { Agentation } from "agentation";2. Add the component before </body>, wrapped in a dev-only guard:
{process.env.NODE_ENV === "development" && <Agentation />}Full layout pattern:
import { Agentation } from "agentation";
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
{children}
{process.env.NODE_ENV === "development" && <Agentation />}
</body>
</html>
);
}Phase 4.1: Add Google Analytics (optional)
npm install @next/third-parties@latestPatch app/layout.tsx:
import { Agentation } from "agentation";
import { GoogleAnalytics } from "@next/third-parties/google";
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
{children}
{process.env.NODE_ENV === "development" && <Agentation />}
</body>
<GoogleAnalytics gaId="G-XYZ" />
</html>
);
}Replace "G-XYZ" with your GA4 measurement ID.
Phase 5: Install Ultracite
1. Delete the Biome config and dependency created by create-next-app:
rm biome.json
npm uninstall @biomejs/biome2. Run Ultracite init non-interactively for Oxlint + Oxfmt + Lefthook:
npx ultracite@latest init \
--linter oxlint \
--frameworks next react \
--integrations lefthook \
--pm npm \
--skip-install \
--quietNotes on the flags:
--frameworkstakes space-separated values (next react), not commas. Comma-separated values fail validation.--skip-installlets you review the generatedpackage.jsonchanges before installing.- Omit
--quietif you want to confirm the generated file list interactively.
This sets up:
oxlint.config.ts: extendsultracite/oxlint/{core,next,react}oxfmt.config.ts: extendsultracite/oxfmtlefthook.yml: pre-commit hook runningnpx ultracite fixon staged JS/TS/JSON/CSS withstage_fixed: true- Adds
oxlint,oxfmt,lefthookto devDependencies andprepare: lefthook installto scripts
3. Install and verify:
npm install
npx ultracite fix # oxfmt --write + oxlint --fix
npx ultracite check # oxfmt --check + oxlintBoth pass with zero errors and the generated oxlint.config.ts needs no tuning. AGENTS.md is generated automatically with the Ultracite code-standards reference; create CLAUDE.md as a symlink or one-line @AGENTS.md reference.
Phase 6 prep: Move into apps/web/
From the parent directory of {{name}}:
mkdir -p {{name}}-turbo/apps
mv {{name}} {{name}}-turbo/apps/web
mv {{name}}-turbo {{name}}The Next.js app is now at {{name}}/apps/web/.
Next: load references/turbo-configs.md and generate root config files in {{name}}/.
Deploy and Launch
Phase 7: GitHub setup
From the project root ({{name}}/):
git init
git add -A
git commit -m "initial commit"
git branch -M main
gh repo create {{repo}} --public --source=. --remote=origin --pushThis uses the GitHub CLI (gh) to create the repo and push in one step. If gh is not available, use the manual approach:
git remote add origin https://github.com/{{repo}}.git
git push -u origin mainPhase 7: Vercel deployment
Using the Vercel CLI:
npx vercel --yes
npx vercel --prodOr via the dashboard:
1. Go to vercel.com/new and add a new project. 2. Import the GitHub repo ({{repo}}). 3. Vercel auto-detects the turborepo and Next.js app in apps/web. 4. Deploy.
Then add custom domain: {{domain}} (via dashboard Settings > Domains, or npx vercel domains add {{domain}}).
If the deployment serves a 404 or the wrong app, set the project Root Directory to apps/web (dashboard Settings > General > Root Directory) and redeploy. Vercel does not always infer the app location in a fresh turborepo.
Verify: https://{{domain}} loads the default Next.js page.
Phase 8: Pre-launch checklist
Favicon
1. Open RealFaviconGenerator. 2. Generate a favicon package from your source image. 3. Place the generated files in apps/web/app/.
OG images
Create and place in apps/web/app/:
opengraph-image.png(1200x630)twitter-image.png(1200x630)
Next.js App Router automatically serves these as OG and Twitter card images via file-based metadata conventions. Alternatively, generate images using code (.js, .ts, .tsx).
Skill handoffs
Run these skills in order after deployment:
1. optimise-seo: metadata, structured data, sitemap, robots, Core Web Vitals 2. ui-audit: accessibility, typography, interaction quality, craft polish 3. ui-animation: motion easing, timing, gestures, and review rules
Validation checklist
After all phases complete, verify:
- [ ]
npm run devstarts successfully from project root (turbo runs apps/web) - [ ]
npm run buildsucceeds with no errors - [ ]
npm run checkpasses Ultracite checks - [ ]
npm run check-typespasses TypeScript checks - [ ]
npx lefthook run pre-commit --all-filespasses all hooks - [ ] GitHub repo has the initial commit pushed
- [ ] Vercel deployment is live at
{{domain}} - [ ] Favicon appears in browser tab
- [ ] OG image renders in social card previews (use https://opengraph.xyz to test)
Turborepo Config Templates
Contents
- Root package.json
- turbo.json
- Root .gitignore
- knip.json
- apps/web/package.json scripts
- apps/web/next.config.ts
---
Root package.json
Create at {{name}}/package.json:
{
"name": "{{name}}",
"private": true,
"packageManager": "npm@10.9.3",
"workspaces": [
"apps/*"
],
"scripts": {
"build": "turbo build",
"dev": "turbo dev",
"lint": "turbo lint",
"lint:fix": "turbo lint:fix",
"format": "turbo format",
"format:check": "turbo format:check",
"check-types": "turbo check-types",
"check": "ultracite check",
"fix": "ultracite fix"
},
"devDependencies": {
"turbo": "^2",
"ultracite": "^7.1.5"
}
}turbo.json
Create at {{name}}/turbo.json:
{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**", "out/**"]
},
"dev": {
"cache": false,
"persistent": true
},
"lint": {
"dependsOn": ["^build"]
},
"lint:fix": {
"cache": false
},
"format": {
"cache": false
},
"format:check": {
"dependsOn": ["^build"]
},
"check-types": {
"dependsOn": ["^build"]
}
}
}Root .gitignore
Create at {{name}}/.gitignore:
node_modules
out
dist
*.tgz
coverage
*.lcov
logs
*.log
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
.eslintcache
.cache
*.tsbuildinfo
.idea
.DS_Store
.turbo
.vercel
.claude/
.cursor/
.vscode/knip.json
Create at {{name}}/knip.json:
{
"$schema": "https://unpkg.com/knip@5/schema.json",
"ignore": [".vercel/**"]
}Run dead-code analysis on demand with npx knip from the root (knip is not a devDependency; npx fetches it). Add workspace-specific entry points to knip.json as needed (e.g. for CLI apps or docs sites with custom entry files).
apps/web/package.json scripts
Update the scripts block in apps/web/package.json to include turbo-compatible commands:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "oxlint .",
"lint:fix": "oxlint --fix .",
"format": "oxfmt --write .",
"format:check": "oxfmt .",
"check-types": "tsc --noEmit"
}
}These script names match the tasks defined in turbo.json, allowing turbo to orchestrate them across workspaces. The oxlint/oxfmt invocations here are for turbo orchestration only; for ad-hoc lint or format runs use npx ultracite fix / npx ultracite check so config resolution matches the pre-commit hook. If the project adds a test runner later, add a matching test task to turbo.json at the same time.
apps/web/next.config.ts
Verify apps/web/next.config.ts has React Compiler enabled:
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
reactCompiler: true,
};
export default nextConfig;create-next-app generates this file when React Compiler is selected. Verify reactCompiler: true is present.
Related skills
How it compares
Pick scaffold-nextjs over bare create-next-app when you need a Turborepo monorepo with Blode UI, Ultracite, and Vercel deploy wired in one opinionated workflow.
FAQ
What does scaffold-nextjs install by default?
scaffold-nextjs installs a Next.js turborepo with TypeScript, Tailwind CSS, shadcn CLI, Blode UI from ui.blode.co, Agentation, Ultracite (Biome tooling), and GitHub plus Vercel deployment across 8 guided phases.
What conventions does scaffold-nextjs enforce?
scaffold-nextjs disables the src directory, replaces ESLint with Ultracite/Biome, uses blode-icons-react instead of lucide-react, and keeps app dependencies out of the root package.json per its reference templates.