A minimal Next.js 15 web starter project with authentication, PostgreSQL, and Tailwind CSS.
- Framework: Next.js 15.3.0 + React 19 + TypeScript 5
- Styling: Tailwind CSS 4 + shadcn/ui components
- Database: PostgreSQL + Drizzle ORM
- Authentication: better-auth (email/password)
- Dev Tools: mise, Docker Compose, pnpm
curl https://mise.run | shcd web-starter
# Install tools (Node.js, Flyway)
mise install
# Install dependencies
pnpm install# Copy the example local config
cp mise.local.toml.example mise.local.toml
# Edit mise.local.toml and set BETTER_AUTH_SECRET
# Generate a secret with: openssl rand -base64 32# Start everything (database + migrations + dev server)
mise startThis will:
- Start PostgreSQL via Docker Compose
- Run database migrations
- Generate Drizzle types
- Open the dev server at http://localhost:3000
mise auth:create-user -- --email user@example.com --password yourpassword| Command | Description |
|---|---|
mise start |
Start dev environment |
mise start:clean |
Clean DB and start fresh |
mise dev |
Start Next.js dev server only |
mise build |
Build for production |
mise lint |
Run ESLint and TypeScript checks |
mise db:up |
Start PostgreSQL container |
mise db:down |
Stop PostgreSQL container |
mise db:migrate |
Run database migrations |
mise db:studio |
Open Drizzle Studio |
mise auth:create-user |
Create a new user |
web-starter/
├── src/
│ ├── app/ # Next.js App Router pages
│ ├── components/ # React components
│ │ └── ui/ # shadcn/ui components
│ ├── contexts/ # React contexts
│ └── lib/ # Utilities and services
│ ├── auth/ # Auth helpers
│ ├── services/ # Business logic
│ └── types/ # TypeScript types
├── database/
│ └── migrations/ # Flyway SQL migrations
└── scripts/ # Development scripts
mise shadcn-add button
mise shadcn-add card
# etc.MIT