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.

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.