Fork this repo and make it your own personal site. You can have it running in 30 minutes.
Using an AI assistant? This guide works great with Claude, Cursor, Copilot, etc. Just point your AI to this file and ask it to help you customize the site.
npm install then npm run devWork through these steps in order for the smoothest experience.
| What to change | File | Notes |
|---|---|---|
| Site URL | package.json → homepage |
Your domain or GitHub Pages URL |
| Social links | src/data/contact.ts |
Add/remove platforms as needed |
| Portrait photos | public/images/me-light.jpg, me-dark.jpg |
Square images, ~256×256px |
| Hero content | src/components/Template/Hero.tsx |
Your name, tagline |
| Footer | src/components/Template/Footer.tsx |
Links, copyright |
| What to change | File |
|---|---|
| Bio, intro, everything | src/data/about.ts |
| What to change | File |
|---|---|
| Work experience | src/data/resume/work.ts |
| Education | src/data/resume/degrees.ts |
| Skills & categories | src/data/resume/skills.ts |
| Courses (optional) | src/data/resume/courses.ts |
| What to change | File |
|---|---|
| Project entries | src/data/projects.ts |
| Project images | public/images/projects/ |
The site includes a blog at /writing with RSS feed. You can use it, customize it, or remove it entirely.
To add posts, create Markdown files in content/writing/. The filename becomes the URL slug (e.g., my-post.md → /writing/my-post).
---
title: 'Your Post Title'
date: '2026-01-15'
description: 'A brief description for previews and SEO.'
---
Your content here...
To disable the blog entirely:
rm -rf app/writing app/feed.xml content/writing
Then remove the “Writing” link from src/data/routes.ts.
| What to change | File |
|---|---|
| Colors (light/dark) | app/tailwind.css → CSS custom properties |
| Favicon | public/images/favicon/ |
| Site metadata/SEO | app/layout.tsx |
Search the codebase for “Michael” or “mldangelo” to find any remaining references to change.
grep -r "Michael" src/
grep -r "mldangelo" .
homepage in package.json with your URLpublic/CNAME (e.g., yoursite.com)main—it deploys automaticallypublic/CNAME:
echo "yourdomain.com" > public/CNAME
Run npm run build and upload the out/ directory to any static host (Vercel, Netlify, S3, etc.).
Delete its folder from app/ and remove the link from src/data/routes.ts.
rm -rf app/stats # removes the /stats page
In src/data/contact.ts, import from Font Awesome and add to the array:
import { faYoutube } from '@fortawesome/free-brands-svg-icons/faYoutube';
// Add to data array:
{ link: 'https://youtube.com/@you', label: 'YouTube', icon: faYoutube },
Edit app/tailwind.css. Find :root (light mode) and [data-theme="dark"] (dark mode) sections and modify the --color-* variables.
.env.local from the example: cp .env.example .env.localNEXT_PUBLIC_GA_TRACKING_ID=G-XXXXXXX| Problem | Solution |
|---|---|
| Port 3000 in use | npm run dev -- -p 3001 |
| Styles not updating | Hard refresh: Cmd+Shift+R (Mac) or Ctrl+Shift+R (Windows) |
| Images not appearing | Use /images/... not public/images/... in code |
| Build failing | Run npm run type-check to find errors |
| CSS 404 or wrong path | Check homepage in package.json matches your deploy URL |
| Git line endings (Windows) | git config core.autocrlf input |
If you find bugs or unclear instructions, please submit a PR—contributions help everyone.