Tailwind Next.js starter: create-next-app vs popular boilerplates

By Nayan Kyada · · 5 min read

Part of Next.js Performance

Picking a tailwind Next.js starter sounds trivial until you're six months in and your chosen boilerplate hasn't touched its dependency tree since the Pages Router was current. This post compares the two main paths — create-next-app with manual Tailwind wiring versus grabbing a community starter — and gives you a concrete checklist for telling the difference between a starter that will serve you and one that will quietly rot.

What "aging well" actually means for a starter

A starter ages well when:

  • It tracks the Next.js App Router and drops Pages Router patterns as those patterns become legacy.
  • Its Tailwind config doesn't lock you to v3 conventions that don't translate to v4 (the @import "tailwindcss" directive, CSS-first config, the new @theme block).
  • Its dependency list is short and each dependency has an active maintainer.
  • It uses next/image with explicit width, height, or fill — not wrapped in a custom component that papers over CLS.
  • TypeScript is strict from day one, not added as an afterthought with @ts-ignore patches everywhere.

Those criteria filter out a lot of what you'll find on GitHub.

Option 1: create-next-app + manual Tailwind

This is what I use on client projects. The command:

# Creates App Router project, TypeScript, ESLint, src/ directory, no src/app/page default styles
npx create-next-app@latest my-site \
  --typescript \
  --eslint \
  --app \
  --src-dir \
  --no-import-alias

Then install Tailwind v4 the way the v4 docs say to, not the v3 PostCSS path:

npm install tailwindcss @tailwindcss/vite
# Or with the PostCSS plugin if you need it:
npm install tailwindcss @tailwindcss/postcss postcss

Add a single line to your src/app/globals.css:

/* src/app/globals.css */
@import "tailwindcss";
 
@theme {
  --font-sans: var(--font-geist-sans);
  --color-brand: oklch(55% 0.2 250);
}

No tailwind.config.ts. No PostCSS config file unless your project actually needs PostCSS plugins. That's it.

This path wins on longevity because:

  1. create-next-app is the official scaffold — it will track App Router, Turbopack, and RSC conventions as they move.
  2. You control every dependency. Nothing sneaks in that you don't know about.
  3. When Tailwind v5 arrives you read the migration guide and update one package, not untangle a boilerplate author's opinions.

The cost is setup time. Budget 30–45 minutes to wire up fonts, a base layout, and next-sitemap or the App Router sitemap.ts convention. That's a one-time cost.

Option 2: community starters and boilerplates

The most-starred Tailwind Next.js starters on GitHub (as of mid-2026) include next-starter, taxonomy (shadcn's older reference app), and a long tail of personal-portfolio templates. Here's how they compare on the criteria that matter.

Criterioncreate-next-app + manualActively maintained starterAbandoned starter (>12 months stale)
App Router nativeUsually ✓Often Pages Router
Tailwind v4 config✓ (you set it)Varies — check the config fileTypically v3, sometimes v2
TypeScript strict modeVariesRarely
Dependency count~6 prod deps15–40+15–40+, often outdated
next/image correct usageSometimes — check for CLS hacksOften broken
Last commitn/aCheck GitHubOften 2023 or earlier
EjectableTriviallyHard — opinions baked inHard

The taxonomy app is worth studying as a reference, but I would not scaffold new client work from it — it was built to demonstrate shadcn component patterns, not to be a generic starting point, and its dependency surface is wide.

If you want a community starter, the ones worth considering in 2026 are the ones where:

  • The repo has commits in the last 60 days.
  • package.json shows next at 15.x, tailwindcss at 4.x.
  • There is no tailwind.config.ts or tailwind.config.js at the root — the v4 config lives in CSS.
  • "strict": true is set in tsconfig.json.
  • The README acknowledges App Router, not just Pages Router patterns.

If any of those fail, move on. Boilerplate debt compounds faster than application debt because it's in your foundation.

The shadcn/ui question

Shadcn/ui is a component distribution, not a starter — it adds components into your source tree rather than installing a package. That distinction matters because you own the code. If you want Radix primitives styled with Tailwind, the right move is:

  1. Scaffold with create-next-app as above.
  2. Run npx shadcn@latest init to add the component scaffolding.
  3. Add only the components you actually need.

Do not grab a "shadcn starter" repo that pre-installs all 40+ components. You will carry that weight even if you use three of them.

Red flags in any starter

  • A next.config.js that disables reactStrictMode — usually done to hide double-render bugs rather than fix them.
  • images.domains in next config instead of images.remotePatterns — deprecated in Next.js 14, removed behaviour in 15.
  • A custom <Image> wrapper that passes layout="fill" (v12-era API).
  • @apply used everywhere in CSS — fine in v3, still works in v4, but often signals the project was written before v4's utility-in-CSS approach was available.
  • A postinstall script that patches node_modules directly.
  • Any dependency pinned with "next": "13.x" or similar hard ceiling.

Practical recommendation

For a production Next.js project that needs to last 18–24 months without a painful migration:

  1. Use create-next-app with the flags above.
  2. Wire Tailwind v4 manually — it's four lines.
  3. If you need UI components, add shadcn selectively via its CLI, not a pre-bundled starter.
  4. Commit a package.json engines field locking to Node 22.x so your CI and your client's server stay in sync.

Community starters have their place — especially for portfolio sites where setup speed matters and longevity less so. But for anything where a client will be maintaining or extending the codebase in 12 months, the manual path is the only one I'd hand off with confidence.