AGENTS.md

Personal site & journal for Robin van der Vleuten — robinvdvleuten.nl. Static site built with Eleventy (11ty) v2 + Tailwind CSS v3, served by Caddy on Fly.io.

Commands

bash
npm install # install deps (Node 22 LTS; CI uses `npm ci`)
npm start # dev: clean + eleventy --serve + tailwind --watch (use this)
npm run build # production build → _site/ (clean + build:html + build:css)
npm run build:html # eleventy only
npm run build:css # tailwind only (minified)
npm run clean # rm -rf _site

There is no test suite, linter, or typecheck. "Verifying" a change means running npm start and checking the rendered page, or npm run build and confirming it completes without errors.

Tailwind scans the built HTML in _site/ (see tailwind.config.js content), not the source templates. So CSS only picks up classes after Eleventy has written HTML. npm start runs both watchers in parallel, which handles this — but a one-off build:css against a stale/empty _site will purge classes. Always build:html before (or alongside) build:css.

Architecture

Eleventy reads from the repo root and writes to _site/. Key config in .eleventy.js:

Layout & directory map

Path Purpose
_includes/layouts/ default.html (base: <head>, fonts, OG/Twitter meta, header/footer chrome), post.html, page.html, about.html
_includes/header.html, footer.html Shared chrome; header does section-active highlighting off page.url
_data/site.js Site name, url, and environment (from NODE_ENV)
_data/strava.json, _data/webmentions/*.json Generated data — do not hand-edit (see Automation)
_filters/date.js dayjs formatDate filter
post/*.md Journal entries. Filename YYYY-MM-DD-slug.md; date is parsed from the filename
post/post.json Directory data file: applies post tag, layouts/post.html, and permalink: post/{slug}/ to every entry
index.html, journal.html, about.md, contact.md, 404.md Top-level pages
css/index.css Tailwind entry + @font-face declarations + custom prose/post-list styles
feed.njk, sitemap.njk, robots.njk Generated XML/txt outputs
public/ Static assets (favicon, images) copied verbatim
scripts/ Node scripts run by GitHub Actions, not the build
infra/ Terraform (DNS, Fly app) — gitignored from the build via .eleventyignore, edit only when changing infra

Conventions

Adding a journal post

Create post/YYYY-MM-DD-title-slug.md with front matter:

markdown
---
title: Your Title Here
description: One-line summary used for <meta description> and OG/Twitter cards.
---
Body in Markdown. Use ```lang fenced blocks for highlighted code (shiki-twoslash).

Tag, layout, and permalink are inherited from post/post.json — don't repeat them. The date comes from the filename. Posts auto-appear in the journal index, RSS feed, and sitemap.

Deployment & automation

Treat _data/strava.json and _data/webmentions/ as machine-generated — they're overwritten by CI, so don't edit them by hand.

Gotchas