Personal bento-style portfolio built with Next.js App Router.
- Next.js 15 + React 19 + TypeScript
- Tailwind v4
- GSAP, Lenis, Matter.js, react-globe.gl
- next-cloudinary + yet-another-react-lightbox
- PostHog analytics
pnpm install
cp .env.example .env.local
pnpm dev- GitHub stats
- WakaTime stats
- Spotify now playing/top tracks
- Cloudinary photos
- Push this repo to GitHub (HTTPS works fine if SSH keys are painful).
- In Vercel: Add New → Project → import
chillcoder/portfolio(or your fork). - Settings → Environment Variables: paste values from
.env.examplefor Production (and Preview if you want previews wired). - Settings → Domains: add
lucas-obrien.comandwww.lucas-obrien.com, then add the DNS records Vercel shows at your registrar (or point nameservers to Vercel). - Redeploy after env vars change.
Open https://lucas-obrien.com/api/spotify-callback in the browser (with app credentials set). Complete Spotify login so the refresh token is stored (Redis or SPOTIFY_LIVE_REFRESH_TOKEN).
Create folder portfolio/photos in the Media Library and upload images. The Photos tile lists that prefix.
Set NEXT_PUBLIC_POSTHOG_KEY, NEXT_PUBLIC_POSTHOG_HOST (e.g. https://us.i.posthog.com), and POSTHOG_SERVER_KEY. The app proxies ingestion through /ingest/* (see next.config.ts).
In Vercel: Storage → Marketplace → Upstash Redis and connect. Used for rotating Spotify refresh tokens.