Next.js

The React Framework for the Web

The React framework for production. Build full-stack web apps with server rendering, file-based routing, and a first-class developer experience.

📘 35 lessons🚀 6 projects🗺️ 3 roadmaps🐞 16 error fixes

Next.js Tools

The ecosystem at a glance — what each tool is for, and when to reach for it.

Tailwind CSS

Styling
Why use it
Style without leaving your component, ship only the CSS you use, and stay consistent with a design-token system.
Alternatives
CSS Modules, styled-components, vanilla-extract, Panda CSS
Best for
Most apps — especially when paired with a component library like shadcn/ui.
Read the docs ↗

Prisma

Database access
Why use it
Autocomplete for your queries, compile-time safety on your data, and painless schema migrations.
Alternatives
Drizzle ORM, Kysely, TypeORM, raw SQL
Best for
Teams that want safety and DX over maximum control of the generated SQL.
Read the docs ↗

NextAuth.js (Auth.js)

Authentication
Why use it
Drop-in social login, secure sessions, and database adapters — without building auth from scratch.
Alternatives
Clerk, Lucia, Supabase Auth, Better Auth
Best for
Apps that want self-hosted, provider-flexible auth at no cost.
Read the docs ↗

Vercel

Hosting & deployment
Why use it
Zero-config deploys, preview URLs per pull request, edge network, and serverless functions.
Alternatives
Netlify, Cloudflare Pages, Railway, a self-hosted Node server
Best for
Shipping Next.js apps with the least possible configuration.
Read the docs ↗

shadcn/ui

UI components
Why use it
You get beautiful, accessible components (built on Radix + Tailwind) as source you can edit — no black-box dependency to fight.
Alternatives
Material UI, Mantine, Chakra UI, Park UI
Best for
Teams using Tailwind who want full control over their component code.
Read the docs ↗

Zod

Validation
Why use it
Validate form input, API payloads, and env vars at runtime, and get the TypeScript types for free from the same schema.
Alternatives
Valibot, Yup, ArkType, io-ts
Best for
Validating anything that crosses a trust boundary in a Server Action or Route Handler.
Read the docs ↗

React Hook Form

Forms
Why use it
Handles complex client-side forms with easy validation (pairs with Zod) and great performance.
Alternatives
Formik, TanStack Form, native Server Actions + useActionState
Best for
Rich, interactive forms with lots of fields and client-side validation.
Read the docs ↗

TanStack Query

Client data fetching
Why use it
When you fetch on the client (dashboards, infinite scroll, polling), it handles caching, retries, and stale data so you don't reinvent it.
Alternatives
SWR, RTK Query, native fetch in Server Components
Best for
Highly interactive client-side data that Server Components can't cover alone.
Read the docs ↗

Zustand

Client state management
Why use it
When you need shared client state (cart, modals, filters) beyond `useState`, Zustand is simpler than Redux and works great with the App Router.
Alternatives
Redux Toolkit, Jotai, Context API, signals
Best for
Shared interactive UI state across components without prop drilling.
Read the docs ↗

Drizzle ORM

Database access
Why use it
If you want queries that read like SQL and a thinner abstraction than Prisma, Drizzle gives you full type safety with minimal magic.
Alternatives
Prisma, Kysely, raw SQL
Best for
Developers who like SQL and want maximum control and edge compatibility.
Read the docs ↗

Stripe

Payments
Why use it
The standard for taking money online — great SDKs, hosted Checkout, and webhooks that pair naturally with Route Handlers.
Alternatives
Lemon Squeezy, Paddle, PayPal
Best for
Any app that needs to charge customers or run subscriptions.
Read the docs ↗