A minimal Next.js 15 (App Router, TypeScript) site set up for static export to GitHub Pages with Tailwind CSS powered by design tokens and light/dark via data-theme. Uses React 19.
- Next.js 15 App Router (TypeScript), React 19
- Tailwind CSS with CSS variable tokens (
src/styles/tokens.css) - Light/dark via
data-themeattribute with persisted override and subtle crossfade - Static export (
output: 'export'), unoptimized images, custom domaintoolipie.comviapublic/CNAME - ESLint (Next defaults), Dependabot, GitHub Actions deploy to Pages
- Node 20 (see
.nvmrcand"engines"inpackage.json)
# Use Node 20
nvm use
# Install deps
npm install
# Dev server
npm run dev
# Lint / Typecheck
npm run lint
npm run typecheck
# Production build (static export)
npm run build
# Output is written to ./out because next.config.mjs has output: 'export'Note: With output: 'export', npm run build writes static assets to out/.
- Pushing to
maintriggers.github/workflows/gh-pages.ymlwhich:- Installs deps, lints, typechecks, builds, and uploads
./outas the Pages artifact
- Installs deps, lints, typechecks, builds, and uploads
- In GitHub repo settings: Settings → Pages → set Source to “GitHub Actions”
- Custom domain is configured via
public/CNAME→toolipie.com
src/
app/ # App Router
components/ # Shared components (Navbar, Footer, ThemeToggle)
features/ # Feature modules
lib/ # Utilities (client-side)
server/ # Server-only code (if added later)
hooks/ # React hooks
types/ # TypeScript types
styles/ # Tailwind + tokens
graph TD
A[App Router pages in src/app] --> B[Root layout: src/app/layout.tsx]
B --> C[Navbar]
B --> D[Footer]
A --> E[Home page: src/app/page.tsx]
E --> F[HeroTitle]
E --> G[TerminalDemo]
E --> H[Reveal]
subgraph Styling
I[src/styles/tokens.css]
J[src/styles/globals.css]
K[tailwind.config.ts]
end
C --> J
D --> J
F --> J
G --> J
H --> J
J --> K
I --> K
Contributions are welcome.
- Fork and create a feature branch from
main. - Install and run locally:
nvm usenpm installnpm run dev
- Ensure quality:
npm run lintnpm run typechecknpm run build(verifies static export)
- Open a PR describing the change.
- Images are unoptimized for static export compatibility