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@themeblock). - Its dependency list is short and each dependency has an active maintainer.
- It uses
next/imagewith explicitwidth,height, orfill— not wrapped in a custom component that papers over CLS. - TypeScript is strict from day one, not added as an afterthought with
@ts-ignorepatches 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-aliasThen 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 postcssAdd 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:
create-next-appis the official scaffold — it will track App Router, Turbopack, and RSC conventions as they move.- You control every dependency. Nothing sneaks in that you don't know about.
- 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.
| Criterion | create-next-app + manual | Actively maintained starter | Abandoned starter (>12 months stale) |
|---|---|---|---|
| App Router native | ✓ | Usually ✓ | Often Pages Router |
| Tailwind v4 config | ✓ (you set it) | Varies — check the config file | Typically v3, sometimes v2 |
| TypeScript strict mode | ✓ | Varies | Rarely |
| Dependency count | ~6 prod deps | 15–40+ | 15–40+, often outdated |
| next/image correct usage | ✓ | Sometimes — check for CLS hacks | Often broken |
| Last commit | n/a | Check GitHub | Often 2023 or earlier |
| Ejectable | Trivially | Hard — opinions baked in | Hard |
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.jsonshowsnextat 15.x,tailwindcssat 4.x.- There is no
tailwind.config.tsortailwind.config.jsat the root — the v4 config lives in CSS. "strict": trueis set intsconfig.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:
- Scaffold with
create-next-appas above. - Run
npx shadcn@latest initto add the component scaffolding. - 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.jsthat disablesreactStrictMode— usually done to hide double-render bugs rather than fix them. images.domainsin next config instead ofimages.remotePatterns— deprecated in Next.js 14, removed behaviour in 15.- A custom
<Image>wrapper that passeslayout="fill"(v12-era API). @applyused 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
postinstallscript that patchesnode_modulesdirectly. - 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:
- Use
create-next-appwith the flags above. - Wire Tailwind v4 manually — it's four lines.
- If you need UI components, add shadcn selectively via its CLI, not a pre-bundled starter.
- Commit a
package.jsonenginesfield 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.