Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/github-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ jobs:
test -f site/favicon.png
grep -q 'application/ld+json' site/index.html
grep -q 'og:image' site/index.html
grep -q 'id="static-profile"' site/index.html
if grep -q 'Unpacking\.\.\.' site/index.html; then echo "index.html still serves the bare loader"; exit 1; fi
- uses: actions/upload-pages-artifact@v3
if: github.event_name != 'pull_request'
with:
Expand Down
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,18 @@ Dual-audience portfolio for humans and LLM agents (see `pxl-registry` S5 L6):
| `llms.txt` | repo root → `site/llms.txt` | https://aabiro.github.io/llms.txt |
| Agent manifest | `.well-known/agent.json` | https://aabiro.github.io/.well-known/agent.json |
| JSON-LD | `scripts/inject_seo.py` | Person + CreativeWork `@graph` |
| No-JavaScript copy | `scripts/inject_static_profile.py` | `<main id="static-profile">` in `index.html` |
| Resume source | `RESUME.md` | built to `assets/Aaryn_Biro_Resume.pdf` in CI |

The Claude Design export renders only with JavaScript, so on its own a crawler,
link previewer, recruiter tool or agent fetching the page sees an empty loader.
`scripts/inject_static_profile.py` reads the page's own copy and component data
(experience, work, capabilities, stack, contact) out of the bundled template and
writes it into `index.html` as plain HTML. Browsers with JavaScript still swap in
the designed page as before. Re-exporting `page/page.html` keeps the static copy
in sync automatically; the build fails if it can no longer find the experience
or work data.

`scripts/build_site.sh` copies agent files into `site/` alongside the HTML page.
`scripts/build_resume_pdf.sh` regenerates the PDF from `RESUME.md` when pandoc is available.

Expand Down
13 changes: 8 additions & 5 deletions scripts/build_site.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,22 @@
# Assemble the static deploy directory (site/) that GitHub Pages serves.
#
# The page itself is the Claude Design export (page/page.html); this injects the
# portfolio's SEO / agent <head> into it and gathers the supporting assets
# (favicon, icons, manifest, robots, sitemap, OG image, llms.txt,
# .well-known/agent.json, resume PDF) alongside it. The resume is expected to
# already be built by scripts/build_resume_pdf.sh.
# portfolio's SEO / agent <head> and a static copy of its content into it, and
# gathers the supporting assets (favicon, icons, manifest, robots, sitemap, OG
# image, llms.txt, .well-known/agent.json, resume PDF) alongside it. The resume
# is expected to already be built by scripts/build_resume_pdf.sh.
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
SITE="$ROOT/site"

rm -rf "$SITE"
mkdir -p "$SITE" "$SITE/.well-known" "$SITE/assets"

# 1. The page, with SEO / agent metadata injected into its <head>.
# 1. The page, with SEO / agent metadata injected into its <head>, plus a static
# copy of its content for crawlers, link previewers and agents that do not
# run JavaScript.
python3 "$ROOT/scripts/inject_seo.py" "$ROOT/page/page.html" "$SITE/index.html"
python3 "$ROOT/scripts/inject_static_profile.py" "$SITE/index.html"

# 2. Favicon + PWA icons + manifest.
cp "$ROOT/web/favicon.png" "$SITE/favicon.png"
Expand Down
Loading
Loading