# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview Notion-As-Blog: a Next.js 16 (App Router) blog that uses Notion as a CMS. Posts are written in Notion and rendered as a full-featured blog with categories, tags, series, multi-author support, and search. ## Commands ```bash npm run dev # Start dev server npm run build # Production build npm run start # Start production server npm run lint # Run ESLint npm run cleancache # Delete .next/ cache ``` No test runner is configured. Playwright is installed as a devDependency but has no scripts. ## Architecture **Stack:** Next.js 16, React 19, TypeScript 5 (strict), Tailwind CSS 4, shadcn/ui **Rendering:** ISR with 30-minute revalidation. Pages use `generateStaticParams` for static pre-rendering. All page components are React Server Components; `"use client"` is only used for interactive leaf components (ThemeToggle, SearchInput, FeaturedSlideshow, etc.). **Path alias:** `@/*` maps to `src/*`. ### Configuration: `src/config/` - **`brand.ts`** — Single source of truth for site configuration: name, colors, categories, fonts, Notion settings, cache TTLs, plugin toggles (Giscus, newsletter, GA). Category names must exactly match the Notion DB `category` select field values. - **`copy.ts`** — All user-facing UI text. Import `copy` directly (not via `brand.copy`). To localize, translate strings here. - **`env.ts`** — Centralized `process.env` access. Never read `process.env` directly elsewhere; use `env.*` instead. ### Theme System `buildTheme()` in `brand.ts` generates shadcn CSS tokens from 5 base HSL values. The CSS is injected as an inline `