Portfolio site for schulzetenberg.com, built with Next.js 16, React 19, TypeScript, Tailwind CSS v4, and deployed to Cloudflare Workers through OpenNext.
- Next.js App Router
- React 19
- TypeScript
- Tailwind CSS v4
- OpenNext for Cloudflare
- Wrangler for preview and deployment
app/: App Router pages, metadata, sitemap, robots rules, and the Instagram API routecomponents/: homepage sections and shared UIlib/: environment helpers and project datapublic/: static assetsdocs/: project notes and redesign plansOLD/: archived code from the previous version of the site
The homepage is assembled from a small set of sections:
- header
- about
- skills
- projects
- footer
- Node.js 20.9 or newer
- npm
-
Install dependencies:
npm install
-
Create a local environment file if you want to override the defaults used in
lib/env.ts:touch .env.local
-
Add any values you need:
INSTAGRAM_API_URL=https://data.schulzetenberg.com/api INSTAGRAM_API_TOKEN=your-token NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
-
Start the dev server:
npm run dev
-
Open http://localhost:3000.
npm run dev: start the local Next.js dev server (Turbopack is the default in Next.js 16)npm run build: create a production buildnpm run start: serve the production build locallynpm run lint: run ESLintnpm run lint:fix: run ESLint with automatic fixesnpm run format: format the repo with Prettiernpm run format:check: check formatting without changing filesnpm run preview: build the Cloudflare worker and run the OpenNext preview flownpm run deploy: build and deploy to Cloudflare Workersnpm run cf-typegen: regeneratecloudflare-env.d.tsfrom Wrangler
The site reads its runtime configuration from lib/env.ts.
INSTAGRAM_API_URL: base URL for the Instagram data serviceINSTAGRAM_API_TOKEN: token sent to the Instagram data serviceNEXT_PUBLIC_GA_ID: Google Analytics measurement ID
If these values are not set, the app currently falls back to defaults defined in code. For production, prefer configuring them explicitly through .env.local and Cloudflare secrets or vars.
This project is set up for Cloudflare Workers using OpenNext.
Basic flow:
-
Build the worker bundle:
npm run preview
-
Deploy it:
npm run deploy
The deployment config lives in wrangler.jsonc and open-next.config.ts.