pwragent.ai — Agent Guidance

Marketing site for https://pwragent.ai. Jekyll, built and deployed by GitHub Actions to GitHub Pages. Source-of-truth files and the full deploy runbook live in README.md.

Working in this repo

Accessibility

The site must be fully accessible — usable with screen readers, keyboard-only navigation, and reasonable color-contrast thresholds. Concretely: every interactive element has a visible :focus-visible ring, every <img> has an alt attribute (empty for decorative), the page has a single <h1>, semantic landmarks (<header>, <nav>, <main>, <footer>) wrap their content, and a skip-to-main-content link is the first focusable element. The CSS respects prefers-reduced-motion.

When adding new UI, run the same audit that produced this baseline:

# In a browser pointed at http://localhost:4000/, paste this into the console:
const s = document.createElement("script");
s.src = "https://cdnjs.cloudflare.com/ajax/libs/axe-core/4.10.0/axe.min.js";
s.onload = async () => console.log(JSON.stringify(await axe.run(), null, 2));
document.head.appendChild(s);

Or via agent-browser:

agent-browser open http://localhost:4000/ && \
agent-browser eval --stdin <<'EOF'
(async () => {
  await new Promise((r, j) => { const s = document.createElement("script"); s.src = "https://cdnjs.cloudflare.com/ajax/libs/axe-core/4.10.0/axe.min.js"; s.onload = r; s.onerror = j; document.head.appendChild(s); });
  return JSON.stringify(await axe.run(document, { runOnly: ["wcag2a", "wcag2aa", "wcag21a", "wcag21aa", "best-practice"] }), null, 2);
})()
EOF

Zero violations is the bar — and CI enforces it. The Pages workflow (.github/workflows/pages.yml) runs axe-core against the built site on every push and PR. Any violation fails the build, which blocks the artifact upload, which blocks deploy. To debug a CI failure locally, build the site (docker build / docker run per the README) and run the manual recipe above against http://localhost:4000/.

Deploy

The Pages workflow at .github/workflows/pages.yml builds Jekyll on push to main and on PR (PRs validate-only, deploys gated to main). Cloudflare proxies the apex domain to GitHub Pages with Full (Strict) SSL and an ACME cache-bypass rule (full runbook in the README).

Cache invalidation after a content change: Cloudflare dashboard → Caching → Purge → custom URL purge for the affected paths, or wait the ~4h TTL.