Case 21 Portfolio Sep 2026 – Present

Portfolio ver. 3

The third version of jodriscoll.com: an Astro 7 site on Cloudflare Workers, written for two readers at once, the person deciding whether to hire me and the AI agent screening the application first.

  • Cloudflare Workers
  • Cloudflare
  • CSS
  • Node.js
  • TypeScript
Framework
Astro 7.4
Host
Cloudflare Workers
Pages rendered at build
94
Project pages
76

01

Notes from the build

01 / 05

Written for the screener too

Applications are often read by an AI agent before a person. Every project, role and post is also published as JSON-LD, llms.txt, JSON Resume and a JSON content API, from the same content files the pages use.

02 / 05

One source of truth

Projects are one JSON spec each. The Work page, project pages, resume, feeds and API all read from them, so a fact changes in one place.

03 / 05

Static first

Every page is rendered at build time. The Worker only runs for the contact form and the API, so pages load as plain files from Cloudflare's network.

04 / 05

From Pages to Workers

Ver. 2 built on Cloudflare Pages from Git. Ver. 3 moved to Workers with static assets, which the Astro adapter now targets, and kept the domain, DNS and account where they were.

05 / 05

No client framework

Interactions (filters, the timeline, the contents bar, the contact sheet) are small inline scripts on top of HTML and CSS.

02

What it's written in

  1. TypeScript 100%

Estimated from the stack, not measured from the source. Measured figures replace this once the repository is counted.

03

The stack 15

Site

  • Astro 7.4.0
  • TypeScript
  • CSS hand-written, no framework
  • Shiki 4.6.0 code blocks, light and dark
  • View Transitions cross-document, no client router

Hosting

  • Cloudflare Workers static assets plus a Worker for /api
  • @astrojs/cloudflare 14.4.7
  • Wrangler 4.160.0
  • Resend contact form email

Machine-readable

  • JSON-LD Person, BlogPosting and project nodes
  • llms.txt and llms-full.txt
  • JSON Resume /resume.json
  • Content API /api/content, JSON
  • RSS and sitemap

Runtime

  • Node 24 pinned in .nvmrc and engines

04

How it ships Custom Pipeline Built

The site builds and deploys from my machine with Wrangler. Pushing to GitHub doesn't deploy; a release is a build and one deploy command.

  1. 01 Build

    astro build renders 94 routes to static HTML: every page, project, post, the feeds and the machine-readable files.

  2. 02 Assets

    The rendered pages, styles, fonts and screenshots upload to Workers static assets. Unchanged files are skipped.

  3. 03 Worker

    The /api routes (contact form, events and the content API) run on the Worker with nodejs_compat.

  4. 04 Secrets

    The Resend keys are Worker secrets, set with wrangler secret bulk. They never enter the repository.

  5. 05 Domain

    jodriscoll.com is a custom domain on the Worker. DNS stays on the Cloudflare zone it has used for years.

I'm listening if you're talking

A bug, a new build, a data question, a site that needs to be faster or a full rebuild. Tell me what's going on.

Let's see how to collaborate.