A personal portfolio site. Plain static site (HTML, CSS, JS) with no build step, so it deploys anywhere with zero configuration and a custom domain is just a DNS change later.
portfolio/
├── index.html # home: robotics, social impact, violin
├── sotm.html # writeup: shoot-on-the-move targeting system
├── sim.html # writeup: Unity robotics simulator
├── styles.css # styling (shared by all pages)
├── main.js # scroll reveals + footer year
├── images/ # photos and logos
└── README.md
Just open index.html in a browser. Or, for a local server (fonts/canvas behave best this way):
# Python 3
python -m http.server 8000
# then visit http://localhost:8000git init
git add .
git commit -m "Initial portfolio"
git branch -M main
git remote add origin https://github.com/YOUR_USERNAME/portfolio.git
git push -u origin mainAfter this, every git push updates the live site automatically once it's connected to a host.
- Go to vercel.com and sign in with GitHub.
- Add New → Project, import this repo.
- Framework preset: Other. Leave build command and output empty (it's static).
- Deploy. You get a live URL like
your-portfolio.vercel.app.
That URL is fully live and shareable. You can put it in your Common App right away.
When you buy a domain (e.g. davidcui.dev):
- In Vercel: Project → Settings → Domains → Add, type your domain.
- Vercel shows you DNS records to add.
- In your registrar (Namecheap, Cloudflare, etc.), add those records.
- Wait a few minutes. The domain now points at the same deployment.
Nothing in the code changes — the domain is just a new address for the same site.
This also works with no changes:
- Repo Settings → Pages.
- Source: Deploy from a branch, branch
main, folder/ (root). - Save. Site goes live at
YOUR_USERNAME.github.io/portfolio.
A custom domain can be added here too, under the same Pages settings.
- Keep claims checkable. Every number on the site should be one you could back up if someone asked. Prefer describing what you built and what you learned over headline stats.
- Images: anything over ~300 KB should be resized before committing. Square logos use
class="imgfill imgfill--logo"so they aren't cropped; photos use plainimgfill. - New writeup page: copy
sim.html, change the<main class="page">content. It picks up the shared nav, footer, and styles automatically.