← The setup

This site

Portfolio

The site you're on: a static build served from my own hardware, with a 3D diagram of the setup behind it, and no framework runtime in the browser.

The home page.
The home page.

Deployment

Four steps from commit to visitor.

  1. Write

    Source

    Astro 5, TypeScript

    Git, pushed to main

  2. Compile

    Build

    Docker multi-stage

    Node 22 builds static HTML

  3. Host

    Serve

    nginx:alpine, no Node at runtime

    Cloudflare Origin Certificate

  4. Protect

    Edge

    Cloudflare proxy

    Origin accepts Cloudflare only

Why static

Nothing to run means nothing to break in.

Every page is built to plain HTML ahead of time, so the container that serves it holds files and nginx and nothing else: no application runtime, no database, no login. The 3D library is only downloaded when someone opens the setup diagram.

The origin only accepts connections from Cloudflare's published address ranges, so scans aimed directly at the server's address are rejected before they reach the site. Content-hashed assets are cached for a year; the pages themselves are not.

Visitors who prefer reduced motion get the typed titles and button effects switched off, and screen readers get each title in full rather than letter by letter.

Tech specs

Site

Framework
Astro 5, static output
Pages
Home, Setup, Stream, Podcast, Portfolio, Summit Spring, Coldwater, ETA, Capstone
Styling
Hand-written CSS, scoped per component
Type
Inter, plus a 44 KB typeface baked for the 3D text

3D scene

Library
three.js, loaded on /setup only
Size
155 KB gzipped
Models
Procedural geometry; no model files
Interaction
Orbit, raycast picking, camera fly-to

Delivery

Image
Multi-stage Docker; nginx:alpine serves /dist
Transport
TLS 1.2 and 1.3, HSTS
Caching
Hashed assets cached for one year
Deploy
git pull, then docker compose up --build

Scope

Role
Sole developer and operator
Host
One home server, alongside the Stream and Podcast stacks
Runtime JS
Small inline scripts; a framework runtime is not shipped