Minimal, elegant personal website built with Next.js 16, React 19, and TypeScript.
# Install dependencies
pnpm install
# Start dev server
pnpm dev
# Build for production
pnpm build
# Type check
pnpm type-check
# Format code
pnpm format
# Lint
pnpm lint
# Full quality gate (types + lint + production build)
pnpm quality- Framework: Next.js 16 (App Router)
- React: 19.2
- TypeScript: Strict mode enabled
- Styling: Tailwind CSS 4
- UI: shadcn/ui components
- Content: Sanity CMS
- Newsletter: Resend
app/
(pages)/ # Route files and layouts only
api/ # API route handlers
features/ # Product/domain modules
blog/
components/
server/
workshop/
components/
server/
workshop-newsletter/
server/
shared/ # Cross-feature building blocks
components/
hooks/
integrations/
sanity/
lib/
ui/
See /docs/ARCHITECTURE.md for the full architecture and module rules.
dev- Start development serverbuild- Build for productionstart- Start production serverlint- Run ESLintlint:fix- Fix ESLint errorstype-check- Type check without buildingquality- Run type-check, lint, and production build in sequenceformat- Format all files with Prettierformat:check- Check formattingclean- Remove build artifactsfeature:new- Scaffold a new feature module inapp/features/
Example:
pnpm feature:new case-studiesCopy .env.example to .env.local and fill in your values:
# Sanity CMS
NEXT_PUBLIC_SANITY_PROJECT_ID=
NEXT_PUBLIC_SANITY_DATASET=
SANITY_API_TOKEN=
# Resend (Newsletter)
RESEND_API_KEY=re_your_api_key_here
RESEND_AUDIENCE_ID=Get your Resend API key from resend.com/api-keys and create an audience to get the audience ID.