Skip to content

Colophon: how this site is built

An Astro static site, a navy-and-brass design system, and a single CDK stack you can deploy from your laptop. Here's the whole recipe.

Astro AWS CDK

I rebuilt this site the same way I’d build infrastructure for a client: a readable stack, no black boxes, and a deploy I can run from my own laptop. Since a few people have asked, here’s the whole recipe.

The site itself

The front end is Astro. For a personal site that’s mostly content with a blog attached, it’s hard to beat. Articles are plain Markdown files in a typed content collection — I drop a file in src/content/blog, fill in the frontmatter, and it’s a styled, syntax-highlighted post. Astro ships zero JavaScript by default, so pages load fast and score well, which is the entire point of a site meant to be found.

Styling is Tailwind CSS v4, driven by a small set of design tokens — a deep navy, a warm paper, and a single brass accent used sparingly. The display face is Fraunces; body and code are IBM Plex Sans and Mono. Fonts are self-hosted rather than pulled from a CDN, which is both faster and a little more private.

The infrastructure

The whole thing is one AWS CDK stack:

const site = new StaticSite(this, "PhilipDamraDev", {
  domainName: "philipdamra.dev",
  source: "../web/dist",
  analytics: "cloudfront-logs", // privacy-friendly, no client script
});

Behind that construct: a private S3 bucket, a CloudFront distribution fronting it via Origin Access Control, an ACM certificate, and a BucketDeployment that uploads the built site and invalidates the cache on every deploy. A small CloudFront function rewrites clean URLs to the static files Astro emits. There’s no CI pipeline — cdk deploy from my laptop does the whole job, which is exactly as much ceremony as a personal site deserves.

Analytics without the surveillance

I wanted to see what’s getting read without loading a tracking script on every visitor. So traffic data comes from CloudFront access logs landing in S3, queryable with a handful of saved Athena queries — top pages, referrers, rough daily uniques. No cookies, no client-side JavaScript, nothing following anyone around the web.

That’s it. The kind of build I like: small enough to hold in your head, and entirely yours.