Grant Anderson

sneppard.dev

This site — a static Astro portfolio deployed on Cloudflare Pages, rebuilt from a hosted site builder to a git-driven, zero-JS-by-default stack.

Date
Stack
  • Astro
  • Cloudflare Pages
  • TypeScript
  • CSS
  • Static Site
A vertical line of commit squares feeding an arrow into a build box, which emits an arrow to a page frame with a header bar and purple sidebar column.

The site you’re reading. Built with Astro, deployed as static assets on Cloudflare Pages, and rebuilt on every push to main.

Why rebuild it

The first version ran on a hosted site builder. It worked, but it was a closed platform — no repository, no build step, no way to version the thing or deploy it from a commit. For a portfolio whose entire point is demonstrating how I build software, that was the wrong artifact. The site itself should be inspectable.

Astro fit because it ships zero JavaScript by default. A portfolio is almost entirely static content, and shipping a framework runtime to render text is cost without benefit. Interactivity is opt-in per component, which here amounts to a theme toggle.

Notes from the migration

Two things cost real time and are worth recording.

DNS and TLS aren’t the same problem. Getting records to resolve, getting a certificate issued, and getting the origin to serve the right content are three separate failure modes that present almost identically in a browser. Isolating them — checking the platform-provided subdomain before touching the custom domain — turns an opaque failure into an obvious one.

Adapters aren’t free. Cloudflare’s auto-configuration installed an SSR adapter that relocated the build output into a nested directory, so the deploy succeeded while the site returned 404. For a fully static build, no adapter was needed at all. Removing it fixed the problem and shortened the dependency tree.

Stack

Astro with content collections and a typed schema for these project entries, plain CSS with custom properties for theming, @astrojs/sitemap for generation, and Cloudflare Pages for git-driven builds and preview deployments.