This is a personal website. External PRs are welcome for bug fixes, broken links, accessibility issues, and typos. For anything larger, open an issue first so we can discuss whether it fits.
- Node 22 (matches CI — check with
node -v) - npm (bundled with Node)
- For worker development: Wrangler CLI
git clone https://github.com/adrianwedd/adrianwedd.com.git
cd adrianwedd.com
npm ci
npm run dev # dev server at localhost:4321The site builds without the private src/data/base-cv.json (CV data is synced
from a private repo at deploy time; local dev falls back to defaults).
Run the full local check suite:
npm run check # astro type check + lint + content validation
npm run build # full production build including Pagefind indexing
npm run check:links # internal-link checker on the built outputIf you touched worker code:
cd worker && npm test && npx wrangler deploy --dry-run
cd worker-csp && npm test && npx tsc --noEmit- URLs are permanent. Never rename a published content file — the filename
determines the URL. If a URL truly must change, add a redirect in
astro.config.mjs. - Descriptions ≤ 160 characters — enforced by
scripts/validate-content.jsand the CI gate. - Local images use
<Picture>fromastro:assets, never raw<img>. CI enforces this. - Every
.webpheroImage needs a.jpgtwin at the same path — OG scrapers can't handle WebP. CI enforces this too. audioUrlmust be a full CDN URL (cdn.adrianwedd.com/…), never a local path. Audio is served from Cloudflare R2.
Conventional commits: type(scope): message. Common types: feat, fix,
content, docs, chore, ci.
See .github/PULL_REQUEST_TEMPLATE.md — it's pre-filled when you open a PR.