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
- Local preview:
docker build -t pwragent-marketing:local . && docker run --rm -it -p 4000:4000 pwragent-marketing:local. TheDockerfilebakes the site in (no bind-mount needed for colima / Docker Desktop restricted configs). - Site content is in
index.md. Layout is_layouts/default.html. Styles areassets/css/site.css. Brand assets areassets/logo.png,assets/favicon-*.png, andassets/social/*.png(X profile pic, X banner, GitHub social preview). Regen recipes for the social assets are documented in the README’s “Brand assets” section. - Voice and visual identity match the docs site (
pwrdrvr/PwrAgent→docs-site/). When updating the brand mark, palette tokens, or hero copy, change both repos.
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.