My personal site. One page, plain HTML and CSS with a small bit of JavaScript for the nav highlighting. No backend, no build step, no dependencies. Served by nginx.
It shares the design system with my Simple Tools site, so the two read as one brand.
Any static file server will do. From the repo root:
python -m http.server 8000
Then open http://localhost:8000.
Paths are root-absolute (/styles.css, /assets/...), so serve from the repo root rather than opening index.html off disk.
To test with the real nginx config and its security headers:
docker build -t portfolio .
docker run --rm -p 8081:80 portfolio
Runs through docker compose with a Cloudflare tunnel in front. Put the tunnel token in a .env file next to the compose file:
TUNNEL_TOKEN=your-token-here
Then:
docker compose up -d --build
Map a hostname to the tunnel in the Cloudflare Zero Trust dashboard.
Placeholder text is written in CAPS inside square brackets, so search the project for [ to find everything that still needs replacing:
- The meta description in the head, used by search engines
- The hero paragraph
- Two project cards (the Simple Tools one is done)
- Skill tags marked
[LANGUAGE],[FRAMEWORK],[TOOL],[PLATFORM] - All three experience entries
- The contact heading, blurb, and the email address in the
mailto:link
index.html the whole page
styles.css design system and page styles
assets/nav.js highlights the nav pill for the section in view
assets/images/ logo files
nginx.conf server config, including the CSP
The CSP blocks inline scripts and styles, so keep CSS and JS in their own files.
Each accent colour is a set of CSS variables. The site uses cyan, and adding class="theme-green" (or red, pink, orange, blue, purple, lime) to any element re-themes that part of the page.