When you type create nextjs app into your terminal, you're doing more than just scaffolding a new project. You're tapping into a mature, production-grade framework that some of the world's biggest tech companies rely on every day. It's your starting point for building fast, SEO-friendly web apps that are also a genuine pleasure to develop.
Why Is Everyone Using Next.js?

Before we jump into the setup commands, it’s worth taking a moment to understand why Next.js has become the de facto choice for so many developers. This isn't just about hype; the framework delivers concrete advantages that improve everything from site performance to your own productivity.
The growth has been nothing short of explosive. As of 2026, Next.js has seen its npm downloads jump by roughly 60% year-over-year, while enterprise adoption is up an estimated 300% since 2023. The 2024 State of JavaScript report backs this up, with about 68% of developers saying they actively use it. These aren't just vanity metrics; they signal a strong industry consensus. You can dig deeper into how Next.js is dominating the front-end world over at NuCamp.
Performance and SEO From the Get-Go
The real magic of Next.js lies in its powerful rendering strategies, which are surprisingly easy to implement. These are the very features that give you a huge leg up on performance and search engine visibility right out of the box.
- Server-Side Rendering (SSR): Next.js can generate the HTML for a page on the server with every request. This means users get content faster, and search engine crawlers see a fully-rendered page, which is a massive win for SEO.
- Static Site Generation (SSG): For content that doesn't change often—like a blog post or a marketing page—Next.js can pre-render the pages at build time. The result is blazing-fast sites served directly from a CDN.
- Incremental Static Regeneration (ISR): This is the hybrid hero. It lets you update static pages after the site has been built, so you can have the speed of static with the freshness of dynamic content, all without a full redeployment.
This flexibility is a game-changer. You no longer have to make a hard choice between a static site and a dynamic app. You can simply choose the best rendering method for each page, optimizing for both speed and data freshness where it counts.
Think about an e-commerce site: product pages can be static (SSG) for speed, the user's shopping cart can be server-rendered (SSR) for real-time data, and the homepage can use ISR to periodically pull in new promotions.
This built-in versatility is precisely why companies like TikTok, Nike, and Twitch trust Next.js for their massive, high-traffic platforms. When you create a Next.js app, you're starting with a foundation that's already built for scale. That gives you a serious head start.
Using the Create Next App CLI for Your First Project
Honestly, the fastest and most foolproof way to get a Next.js app off the ground is with the official command-line tool, create-next-app. Think of it as your personal setup wizard, making sure you start with a modern, solid foundation without any guesswork.
To kick things off, just pop open your terminal and run this one command. It grabs the latest version and starts an interactive setup for you.
npx create-next-app@latest
This command doesn't just dump a bunch of files on your machine. Instead, it asks you a series of simple questions, letting you tailor the project to exactly what you need. Let’s break down what these prompts mean so you can answer them with confidence.
Navigating the Interactive Prompts
After you give your project a name, the CLI will walk you through a few important decisions. Don't stress too much—none of these are set in stone and you can always change them later. But getting them right from the get-go will save you a ton of time.
Thankfully, the setup process has gotten much simpler. The latest create-next-app tool defaults to including TypeScript, the App Router, Tailwind CSS, and ESLint. This stack reflects what most developers are using today, so you're mainly just confirming these smart defaults.
Here’s a quick-reference table to help you decide on each option.
CLI Configuration Choices Explained
| Configuration Prompt | What It Means | Recommended For |
|---|---|---|
| Use TypeScript? | Adds static type-checking to your JavaScript. | Everyone. This is a non-negotiable for modern web development. It catches bugs early and makes your code much easier to manage. |
| Use ESLint? | Integrates a code linter to enforce quality and style rules. | Everyone. It keeps your code clean and consistent, which is a lifesaver, especially on team projects. |
| Use Tailwind CSS? | Sets up the popular utility-first CSS framework. | Most projects. If you want to build custom UIs quickly without writing a lot of CSS from scratch, this is the way to go. |
Use src/ directory? | Puts your app code inside a src/ folder. | Most developers. It’s a common convention that keeps your project root tidy by separating app code from config files. |
| Use App Router? | Implements the new file-based routing system. | All new projects. This is the future of Next.js, enabling powerful features like Server Components and nested layouts. |
For a deeper dive into installation options and troubleshooting, feel free to check out our detailed guide on how to install Next.js.
My Two Cents: For almost any new project I'm starting in 2026, I just say "Yes" to all the defaults. This setup—TypeScript, Tailwind CSS, ESLint, the App Router, and the
src/directory—is the industry standard for a reason. It gives you a powerful, scalable, and maintainable starting point.
Understanding the Generated Project Structure
Once the installer finishes its magic, you’ll have a new project folder waiting for you. This isn't just a random assortment of files; it's a thoughtfully organized structure built for scalability.
Here's what you'll find inside and why it matters:
src/app/: This is the heart of your application. It’s where all your routes, pages, and components live. The routing is based on the file system, so creating apage.tsxfile in a new folder automatically creates a new public route.public/: This folder is for static assets that don’t need to be processed, like images, fonts, or yourfavicon.ico. Files here are served directly from the root of your site.next.config.mjs: This is the main configuration file for your Next.js project. You'll come here to tweak build settings, set up redirects, configure image optimization, and more.package.json: Your project's manifest. It lists all the third-party packages your app depends on (like React, Next.js, etc.) and defines helpful scripts likenpm run dev.tailwind.config.ts: The configuration file for Tailwind CSS. You'll edit this file to customize your design system, adding your own colors, fonts, or spacing.tsconfig.json: The TypeScript configuration file. It tells the TypeScript compiler how to handle your project's files and what rules to follow.
And that's it! Your development environment is ready to go. Just navigate into your new project directory (cd my-app) and run npm run dev to spin up the local server. You now have a brand-new Next.js app running and waiting for you to build something amazing.
Choosing Your Path: App Router vs. Pages Router
When you first spin up a new Next.js project, you'll immediately hit a fork in the road: the App Router or the Pages Router. This isn't just a minor preference; it's a foundational decision that dictates how your application is structured, how it fetches data, and frankly, how you'll think about building components.
The App Router is the new default and what the Vercel team recommends for all new projects. It’s built on a server-first foundation using React Server Components (RSCs). The big win here is that you can render more on the server, which means less JavaScript shipped to your users, leading to a faster, snappier experience.
On the other hand, you have the classic Pages Router. This is the system that Next.js used for years. It's battle-tested, mature, and follows a client-centric model that will feel instantly familiar if you've spent a lot of time with traditional React single-page applications (SPAs).
The Modern Default: The App Router
The App Router's killer feature is its deep integration with React Server Components and its support for nested layouts. This lets you build complex UIs where shared elements like sidebars and headers don't need to re-render on every page navigation. It's a huge performance gain.
Data fetching also feels more intuitive because it's co-located directly inside your components. You can just async/await your data right where you need it.
For instance, here’s how you’d fetch and display a blog post with the App Router:
// src/app/blog/[slug]/page.tsx
// This is a React Server Component by default
async function getPost(slug: string) {
const res = await fetch(https://api.example.com/posts/${slug});
return res.json();
}
export default async function BlogPostPage({ params }) {
const post = await getPost(params.slug);
return (
{post.title}
);
}
See how clean that is? The data fetching logic lives right inside the component file. This simplicity is a core benefit of RSCs. We dive much deeper into this model, and you can learn more about the Next.js App Router in our dedicated article.
When to Consider the Pages Router
So, with the App Router being the new standard, is the Pages Router obsolete? Not quite. It still has its place.
I find the Pages Router is a solid choice in a couple of specific situations:
- Migrating a project: If you're bringing an existing client-side React app into the Next.js world, the Pages Router often provides a much gentler on-ramp.
- Team experience: For teams that are new to server-centric patterns, the file-based routing and familiar data-fetching methods (
getServerSideProps,getStaticProps) can feel less intimidating.
Here’s that same blog post component, but built with the Pages Router. Notice the difference in how data gets to the component.
// src/pages/blog/[slug].tsx
export default function BlogPostPage({ post }) {
// Post data is passed as props from getServerSideProps
return (
{post.title}
);
}
// Data is fetched separately and passed into the component
export async function getServerSideProps(context) {
const { slug } = context.params;
const res = await fetch(https://api.example.com/posts/${slug});
const post = await res.json();
return { props: { post } };
}
The data fetching is explicitly separated into getServerSideProps, which runs on the server and passes its results to the page component as props.
My advice? For any brand-new project, start with the App Router. You'll be aligned with the future of both React and Next.js, unlocking better performance from day one. Only fall back to the Pages Router if you have a very specific reason, like an easier migration path for a legacy codebase.
This decision tree gives you a quick visual guide for some of the key choices you'll make when setting up a new app, from the router to tooling like TypeScript and Tailwind CSS.

As the flowchart shows, this router choice is one of the first and most impactful decisions you'll make, setting the entire architectural pattern for your project.
Building a Next.js App From Scratch Manually
While the create-next-app command is a fantastic shortcut, true mastery comes from understanding what it does behind the scenes. Manually setting up a Next.js project from an empty directory demystifies the framework, giving you the confidence to customize every part of your build process. This hands-on approach is a superpower for any serious developer.
Instead of running a single command, you become the orchestrator. This process reveals that a Next.js app, at its core, is a Node.js project with a few key dependencies. You gain a deeper appreciation for the simple yet powerful architecture that create-next-app abstracts away.
Initializing Your Project and Dependencies
Alright, let's get our hands dirty. The first thing you'll need to do is create a new folder for your project and navigate into it with your terminal. From there, we'll initialize a package.json file, which is the heart of any Node project, tracking its scripts and dependencies.
npm init -y
The -y flag just tells npm to use the default settings, which is perfect for our purposes. Now, we need to install the three core packages that make a Next.js app tick: react, react-dom, and next.
npm install react react-dom next
These three packages are the foundation of your application.
- React is the UI library for building components.
- React DOM is the glue that lets React interact with the browser's DOM.
- Next is the framework itself, handling everything from routing and server-side rendering to build optimizations.
With those dependencies installed, it's time to tell your project how to run. Open up the package.json file and add these scripts. They're the commands you'll use to start the development server, create a production build, and run the production app.
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
Creating Your First Page
Now for the fun part: making something appear on the screen. If you're using the App Router (the modern standard), create a new directory named app. Inside that app directory, create a new file called page.tsx (or page.js if you prefer plain JavaScript).
This manual approach gives you total control, which is essential for complex projects or just for satisfying your own curiosity. When you build a Next.js app, you're joining a massive ecosystem. In 2025, an estimated 17,921 companies worldwide—including giants like TikTok, Uber, and Nike—rely on Next.js for their high-traffic applications. To get a better feel for the market, you can explore detailed software development statistics on Keyhole Software.
Key Takeaway: Manually building a Next.js app isn't about making your life harder. It’s about peeling back the layers of abstraction to understand how the pieces fit together, making you a more knowledgeable and capable developer.
Finally, let's add some basic React code to your app/page.tsx file to get something rendered.
export default function HomePage() {
return
Welcome to My Manual Next.js App!
;}
To see your work in action, run npm run dev in your terminal. Just like that, your bare-bones Next.js application is up and running. You've successfully built it from the ground up, no CLI magic required.
Deploying Your Next.js App to Vercel and Beyond

You've built your app, and it runs great on your local machine. Now for the exciting part: getting it live for the world to see. Taking a local project into production is a huge milestone, and with Next.js, it's surprisingly straightforward.
While you have plenty of hosting options, the most direct path is deploying to Vercel, the platform created by the same team behind Next.js. The synergy between the framework and the hosting platform is undeniable—it’s built for a zero-configuration experience that just works.
The Zero-Configuration Vercel Workflow
The best way to get started is by connecting your Vercel account directly to your Git provider (like GitHub, GitLab, or Bitbucket). This simple step creates a powerful CI/CD (Continuous Integration/Continuous Deployment) pipeline without you having to write a single line of YAML.
From my experience, the setup is incredibly fast. You just sign up for Vercel, ideally with your GitHub account, and point it to your new Next.js repository. Vercel automatically detects the framework, configures all the build settings, and all you have to do is hit "Deploy."
Here’s where the real magic happens. Once linked, every git push to your main branch automatically triggers a new production deployment. Pushing to any other branch? Vercel spins up a unique preview URL for it. This is a game-changer for collaboration, letting you and your team test new features in a live-like environment before merging them.
This tight integration is a big reason why enterprise adoption has soared since 2023. With giants like McDonald's, Porsche, and Netflix trusting Next.js for massive-scale sites, you know you're building on a battle-tested foundation. You can read more about the framework's enterprise success at ArticSledge.
Exploring Other Deployment Options
Of course, Vercel isn't your only option. Many developers successfully run their Next.js apps on other platforms, giving them flexibility or fitting into existing infrastructure. The process just involves a few more manual steps.
- Netlify: A fantastic alternative with a very similar Git-based workflow. It also auto-detects Next.js projects and provides a first-class CI/CD experience. If you're a Netlify user, we have a complete guide on how to deploy Next.js sites to Netlify.
- Traditional Node.js Server: For ultimate control, you can host your app on any server that runs Node.js. Run
npm run buildto create a production-ready.nextfolder. Then, usenpm run startto launch the server, typically managed with a process manager like PM2 to ensure it stays online.
A Quick Tip on Secrets: No matter where you deploy, you'll need to manage environment variables securely. Platforms like Vercel and Netlify give you a simple dashboard for your API keys and other secrets. If you're self-hosting on a Node.js server, stick to the standard
.envfile approach.
Lingering Questions About Building Next.js Apps
Whenever you start a new Next.js project, a few common questions almost always pop up. It's totally normal to wonder about things like security, how to handle state, or the best way to manage styling. Let's tackle some of the most frequent queries I hear from developers to get you started on the right foot.
First, let's talk security. With all the server-side power Next.js gives you, it's smart to be cautious. While the framework itself is built to be secure, vulnerabilities can pop up in the underlying tech. A recent example was a critical flaw (CVE-2025-55182) found in the React Server Components protocol, directly affecting apps that use the App Router.
Your best line of defense is simple: keep your dependencies fresh. Get into the habit of regularly running npm install next@latest react@latest react-dom@latest to pull in the latest security patches.
Can I Still Use Redux or Zustand?
Yes, you absolutely can! This is a big point of confusion for many developers moving to the App Router. There's a common misconception that server-centric features make client-side state managers like Redux or Zustand obsolete. That couldn't be further from the truth.
While Server Components are great for fetching and rendering data on the server, you'll always have state that belongs purely to the client. Think about things like:
- UI state, like whether a modal is open or a dropdown is active.
- Complex user input from multi-step forms.
- A user's shopping cart.
- Real-time updates coming in from a WebSocket connection.
For all these client-side interactions, a state management library is often the best tool for the job. The only trick is that you have to use them inside Client Components by adding the "use client" directive at the very top of your file.
My Two Cents: Don't get stuck on "server state vs. client state." A better way to think about it is data that needs to persist across requests (server) versus interactive state that lives only in the browser (client). They’re designed to work together, not replace each other.
How Do I Handle CSS and Styling?
Next.js is incredibly flexible when it comes to styling. The installer might push you toward Tailwind CSS, and while it’s a fantastic choice, you are by no means locked in. You have a ton of great options, and you can even mix and match them within the same project.
Global CSS: For site-wide styles, just import a stylesheet (like
global.css) directly into your rootlayout.tsxfile. This is perfect for setting base fonts, colors, and resets.CSS Modules: If you want styles that are scoped to a specific component, this is the way to go. Name your file
[component].module.css, and Next.js will automatically generate unique class names to prevent any conflicts. It’s a lifesaver.CSS-in-JS: Libraries like Styled Components or Emotion work great. You’ll just need a little extra setup to create a registry that extracts and sends the styles correctly from the server during the initial render.
Honestly, the best approach comes down to your team's preference and the project's scale. I find that CSS Modules offer a fantastic middle ground—you get to write plain CSS but with the safety of local scope, making it a solid default for most apps.
At Next.js & React.js Revolution, we’re all about helping you master the modern web. From deep dives into server components to practical deployment guides, you'll find everything you need to build with confidence. Explore more of our resources at https://nextjsreactjs.com.






















Add Comment