This site and its Playwright test suite
How this portfolio is built: Astro on GitHub Pages, one data set behind the web resume and every PDF, and a build that checks itself on every pull request.
Problem
A personal site has to stay accurate as the resume changes. Keeping a web resume and several PDFs in step by hand invites drift, and a public site that can break silently is a poor advertisement for someone who tests software.
What I built
- An Astro site hosted on GitHub Pages, built from one set of data files: roles, bullets, summaries, skills, education, and resume versions.
- Content collections with strict schemas, so a bad entry fails the build: single-hyphen copy, no phone numbers, bullets that start with a past-tense verb, references that must resolve, and a public flag on every bullet.
- One resume data set renders the web pages, a print layout, and a PDF for each version, printed in the build with Playwright from the same routes.
- A project archive with filters for year, type, and tags that works without JavaScript, driven by one YAML file per project.
- An issue-first workflow: every change starts as an issue, gets its own branch and pull request, and merges after the build check passes, with each merge deploying to the live site.
- A test suite that reads the same YAML files the site is built from, so a test states what a page should contain without a second hand-copied list.
- Pages written in plain HTML and CSS: Astro components with two hand-written stylesheets (screen and print) and no CSS framework, including light and dark themes that follow the system setting.
- Requirements traceability: each requirement is a GitHub issue, every Playwright test is tagged with the requirement it verifies, and CI fails when a requirement has no test or a tag points at a requirement that does not exist. The deploy publishes the resulting matrix on this site.
- Retrieval-grounded drafting of resume bullets, as a developer tool: a local embedding model, a committed index of the approved bullets, a scored eval that drafts with and without the retrieved examples, and a read-only page that shows which bullets are picked for 13 fixed test queries and how close each one is.
- Built with Claude Code under those guardrails.
Stack
- Astro
- TypeScript
- GitHub Pages
- GitHub Actions
- Playwright
- HTML
- CSS
- Claude Code
Outcome
- Live on GitHub Pages, with a full build of the site and its PDFs checked on every pull request.
- Broken data is caught at build time instead of in production: each rule has been broken on purpose to confirm that it fails with a readable message.
- A public Playwright suite checks that every resume version renders from the real data, that each version has one real PDF of a sensible length, and that a crawl from the home page finds no broken link, anchor, or orphaned page.
- The suite also covers the interactive pieces (filters, art, audio, navigation) and runs axe accessibility scans of every page in light, dark, and phone width.
- CI runs the suite on every pull request and it must be green before a merge. A short smoke test then checks the live site after every deploy, weekly, and on demand.