Infrastructure

A static site, checked on the Mac and uploaded to Cloudflare. Follow a change through it.

Delivery flow

git push → GitHub mainNot connected. Pushes keep history; they don’t deploy.

Stage 1 of 8

Source change

Facts live as JSON and Markdown in src/content; components only render them. A change is one edit in one place.

src/content/**/*.{json,md}
The actual path a change takes from this repository to your browser.

Architecture

Build time · on the Mac

src/contentJSON + Markdown facts
src/componentsAstro + small scripts
Astrostatic build
dist/HTML · CSS · JS · PDF · JSON

Run time

Cloudflare Pagesedge · HTTPS · redirects
Browsertheme · search · terminal · diagrams
No serverno database · no API
Everything is generated ahead of time; the edge only serves files.

Stack

  • Astro 7 · static output
  • TypeScript
  • Content collections
  • Archivo + JetBrains Mono, self-hosted
  • Vanilla JS per component
  • Playwright + axe tests
  • Cloudflare Pages

Implementation details

Content model
  • Profile, experience, projects, technologies and credentials live in src/content, validated by schemas in src/content.config.ts. A malformed entry fails the build.
  • The same content generates the pages, /search.json, the terminal's dataset and both CVs.
Testing
  • npm run build runs astro check (types and content schemas) before building.
  • npm test builds, serves dist/ locally and runs a Playwright suite: internal links and anchors, console errors, overflow at 360px and tablet widths, axe WCAG A/AA in both themes, theme, search, filters, constellation, terminal, mobile menu, reduced motion, CV PDF text, and a guard against confidential names in public files.
  • There is no CI service; the suite runs locally before each upload.
Performance and accessibility
  • Content is plain HTML first; animations enhance it and never hide it.
  • The hero canvas pauses off-screen and draws one still frame under reduced motion. Demonstrations have pause controls and don't autoplay under reduced motion.
  • An inline script sets the theme before paint from the stored choice or the system preference.
  • Skip link, landmarks, visible focus, keyboard access throughout, and ⌘K / Ctrl K search.
Preview versus production
  • Previews deploy to the preview branch with PUBLIC_NOINDEX=true, plus an X-Robots-Tag: noindex header and a Disallow robots.txt added to the upload.
  • A production deploy is a separate, deliberate upload without those additions.
  • Old /work/* links redirect to /portfolio/* via public/_redirects.

Search the portfolio

Try:

↑ ↓ to move · Enter to open · Esc to close