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
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.
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.
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.
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.
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
- 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.
-
01 Build
astro build renders 94 routes to static HTML: every page, project, post, the feeds and the machine-readable files.
-
02 Assets
The rendered pages, styles, fonts and screenshots upload to Workers static assets. Unchanged files are skipped.
-
03 Worker
The /api routes (contact form, events and the content API) run on the Worker with nodejs_compat.
-
04 Secrets
The Resend keys are Worker secrets, set with wrangler secret bulk. They never enter the repository.
-
05 Domain
jodriscoll.com is a custom domain on the Worker. DNS stays on the Cloudflare zone it has used for years.