Daniel Bergholz's personal website — built with Next.js 16 (App Router), TypeScript, and Tailwind CSS v4. It pulls in dynamic content from external APIs: videos and course playlists from the YouTube Data API and articles from Dev.to.
Install dependencies and start the dev server:
npm install
npm run devOpen http://localhost:3000 to view the site.
Copy .env.example to .env and fill in:
YOUTUBE_API_KEY— YouTube Data API keyYOUTUBE_CHANNEL_ID— channel ID for fetching videos and playlistsDEV_TO_API_KEY— Dev.to API key for articles
All three are required. The data-access layer throws on a failed API response (so a broken or empty page is never cached), so the build will error if a key is missing or invalid.
npm run dev— start the development servernpm run build— build for productionnpm run start— run the production buildnpm run format— format with Biomenpm run check— run lint and typechecknpm test— run unit tests (Node's built-in test runner)
- Framework: Next.js 16 (App Router) with Server Components and ISR
- Language: TypeScript
- Styling: Tailwind CSS v4 (Instrument Serif + Poppins via
next/font) - Tooling: Biome for linting and formatting
- Testing: Node.js built-in test runner (
node --test, no extra dependencies)
src/app/— pages and layoutssrc/components/— reusable UI componentssrc/data-access/— API integration layer (YouTube, Dev.to)src/lib/— types, utilities, and the pure feed logic (feed.ts), with co-located*.test.tsunit tests
Working in this repo with an AI coding agent? See
AGENTS.md.
Deployed on Vercel. See the Next.js deployment docs for details.