A personal website for a writer, poet, and thinker — built with Next.js 15, TypeScript, and a custom warm design system with light/dark mode.
yourwebsite.com ← Replace this
- Blog — Paginated blog posts with individual detail pages
- Poetry — Grid of poems with full-poem detail pages
- Videos — Embedded YouTube videos with descriptions
- Quotes — Downloadable and shareable quote images
- Dark Mode — Persistent light/dark theme toggle
- Auth — Login and signup via NextAuth.js (credentials + Google OAuth)
- CMS — Content managed through Sanity.io
- SEO — Metadata, Open Graph, and Twitter card support on all pages
| Layer | Tech |
|---|---|
| Framework | Next.js 15 (App Router) |
| Language | TypeScript |
| Styling | Custom CSS with CSS variables |
| Auth | NextAuth.js v5 |
| CMS | Sanity.io |
| Fonts | Yesteryear (Google Fonts) |
| Icons | Lucide React |
git clone https://github.com/yourusername/writing-site.git
cd writing-sitenpm installcp .env.example .env.localFill in your values in .env.local:
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET= # openssl rand -base64 32
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
NEXT_PUBLIC_SANITY_PROJECT_ID=
NEXT_PUBLIC_SANITY_DATASET=production
npm install -g @sanity/cli
sanity init # Follow prompts, use your project ID
sanity deploy # Deploy the studionpm run devwriting-site/
│
|
app/
├── blogs/ # Blog list + [id] detail pages
├── poetry/ # Poetry grid + [slug] detail
├── quotes/ # Quote images grid
├── videos/ # Embedded videos
├── login/ # Auth — login page
├── signup/ # Auth — signup page
├── settings/ # Theme toggle + logout
├── context/ # ThemeContext + AuthProvider
├── api/auth/ # NextAuth route handler
├── layout.tsx # Root layout with SEO metadata
└── page.tsx # About / Home page
|
components/
├── WindowFrame.tsx
└── PageTransition.tsx
|
lib/
└── sanity.ts # Sanity client + image URL helper
|
sanity/schemas/
├── blog.ts
└── poem.ts
Deploy to Vercel in one click:
Add your environment variables in the Vercel dashboard under Settings → Environment Variables.
MIT — feel free to use this as a template for your own site.