Skip to main content
Version: App Router (1.5+)

Quick Setup

If you're new to Next.js App Router, we recommend reviewing Next.js App Router docs.

System Requirements

  • Node.js 18 or later
  • NPM >= 7
  • WordPress >= 5.9 (prior versions might work but haven't been tested)
  • Next.js 15+ (HeadstartWP only supports App Router with Next.js 15+)

Installation

The easiest way to get started with HeadstartWP and App Router is by using create-next-app with the official App Router starter project.

npx create-next-app --use-npm -e https://github.com/10up/headstartwp/tree/trunk/projects/wp-nextjs-app

Then run npm run dev and open http://localhost:3000 in your browser.

Project Structure

The starter project follows Next.js App Router conventions:

src/
├── app/
│ ├── layout.tsx # Root layout
│ ├── page.tsx # Home page
│ ├── not-found.tsx # 404 page
│ ├── (single)/ # Route group for posts/pages
│ │ └── [...path]/
│ │ └── page.tsx # Dynamic catch-all route
│ ├── blog/
│ │ └── page.tsx # Blog archive
│ ├── category/
│ │ └── [slug]/
│ │ └── page.tsx # Category archive
│ └── globals.css
├── components/
│ ├── Blocks.tsx # Gutenberg blocks renderer
│ └── ...
└── middleware.ts # middleware

Environment Variables

By default, the starter project will point to js1.10up.com. Either change the NEXT_PUBLIC_HEADLESS_WP_URL variable or create a .env.local file to override the default env variables.

If you're developing locally and using HTTPS with WordPress and you don't have valid certs, you will need to add NODE_TLS_REJECT_UNAUTHORIZED=0 as an env variable

NEXT_PUBLIC_HEADLESS_WP_URL=https://wordpress.test
NODE_TLS_REJECT_UNAUTHORIZED=0

Key Differences from Pages Router

  • File-based routing: Routes are defined in the app/ directory
  • Server Components: Components are server-rendered by default
  • Layouts: Shared UI between routes using layout.tsx
  • Loading & Error states: Special loading.tsx and error.tsx files
  • Async components: Direct data fetching in Server Components

Something Missing?

If something is missing in the documentation or if you found some part confusing, please file an issue for the documentation repository with your suggestions for improvement.