Skip to content

Rebuild the site on Astro, replacing al-folio - #6

Open
dfuchss wants to merge 1 commit into
mainfrom
feature/astro
Open

dfuchss wants to merge 1 commit into
mainfrom
feature/astro

Conversation

@dfuchss

@dfuchss dfuchss commented Sep 14, 2026

Copy link
Copy Markdown
Member

Same content, same URLs, different machinery.

ardoco.de ran on a pre-v1, vendored-theme al-folio fork. Upstream has since moved to a
gem-based v1, so the fork sat on a branch nobody maintains any more: 27 gems, 14 workflows and 20 MB
of build-time-downloaded vendor libraries, to serve about 25 MB of actual content. fuchss.org hit
the same wall last week and wrote it up; this
ports that approach to ARDoCo, with its own design.

before after
dependencies 27 gems 11 npm packages
workflows 14 1
tracked files 329 112
homepage requests 27 1
homepage weight 2.1 MB 32 KB
total CSS 222 KB 13.6 KB (entire site)
build ~30 s (est.) 1.5 s for 31 pages

Data errors now stop the build

Content lives in six Zod-validated collections — publications (16, parsed from papers.bib at
build time), conferences (16: 11 paper pages + 5 redirect stubs), approaches (8), people (6),
authors, venues.

The joins that Jekyll resolved as string lookups are Astro reference()s now, so a conference
naming an approach that does not exist, a BibTeX abbr with no venue entry, or an
html = {/c/<slug>} pointing at a missing page fails the build instead of rendering blank.

That surfaced two latent bugs immediately:

  • abbr = {SE} had no venues.yml entry, so those badges rendered grey and unlabelled.
  • The children[] array in _pages/conferences.md silently drove both the navbar order and the
    front-page publication order, so the two could drift. Each conference entry now carries its own
    navOrder.

URLs are unchanged

Checked against the live gh-pages branch during the migration; every published path still
resolves.

  • build.format: 'preserve' emits both shapes from one config: /approaches/<slug>/ as a directory
    and /c/<slug> as a flat .html, exactly as Jekyll did.
  • The five legacy stubs (se24, se25, se26-exarch, se26-lissa, taas26) still redirect to the
    papers that superseded them.
  • All 32 PDFs and images are served byte-for-byte from public/ and pinned by SHA-256.
  • public/CNAME is now committed. It previously survived only because Jekyll's keep_files
    preserved it on the branch; a full-replace deploy of a new tree would have dropped the custom
    domain and left the site reachable only at ardoco.github.io.

/_pages/conferences/ — an accidental Jekyll address, published because that page had no
permalink: — is retired in favour of a real /conferences/ index.

Bibliography fixes

  • Four GI "Software Engineering" papers were typed @article with the publishing society in a
    journal field. They are proceedings: retyped @inproceedings, bogus field dropped, LNI series
    named on the two carrying a P-nnn volume.
  • Non-breaking spaces hidden inside two titles. Invisible in an editor, but they broke word
    wrapping, were copied into anyone's .bib via the BibTeX button, and stopped the publications
    filter matching a typed space.
  • A month = {04}, two raw ü where the rest of the file uses LaTeX escapes, and a duplicate ISSN.

Crossref still reports print-vs-electronic ISSN differences and shortened venue names — both are
correct as they stand, and the GI/ACM 2026 DOIs are simply not Crossref-registered.

Also new

  • A real /conferences/ index; the 11 paper pages were dropdown-only before.
  • Highwire citation_* tags and ScholarlyArticle JSON-LD on every paper page — the old site
    emitted neither (serve_og_meta and serve_schema_org were both false).
  • Email addresses appear nowhere in the served bytes, raw or entity-encoded, while still reading
    as hey (at) kit (dot) edu without JS. The old jekyll-email-protect output survived one
    unescape call.
  • Dark only. No theme toggle; the audit fails if one reappears.

Review

npm install
npm run dev      # http://localhost:4321
npm run build
npm run verify   # 43 checks

npm run verify asserts: the 32 assets are byte-identical, CNAME and .nojekyll are emitted, all
568 internal links and 191 fragments resolve, WCAG contrast holds, all 50 images carry intrinsic
dimensions, no text runs into a link, no address leaks, www.youtube.com (the two screencasts) is
still the only third-party origin, and the two NEVER CHANGE THIS LINE B/E comments that
mcse.kastel.kit.edu scrapes are present verbatim with their three paragraphs intact.

Worth a look by hand: /c/icsa25 (the richest page), /c/taas26 (should bounce to icsa25),
/people/#dominik-fuchß (anchor reached from a publication author link), and /approaches/lissa/
(reverse-joined publications).

Notes

  • Merging deploys. The workflow runs prettier --check, astro check, build and verify,
    then publishes dist/ to gh-pages.
  • astro check reports 2 hints in src/pages/c/[slug].astro, claiming two used imports are unused.
    That is a checker limitation with the early return in Astro frontmatter; exit code is 0 and the
    built stubs prove the branch runs. Documented in the file.
  • The screencasts embed YouTube directly, as before, so those two pages load a third-party origin.
    It is an explicit allow-list entry in the audit, so a second one cannot appear unnoticed.
  • The "~30 s" old build time is an estimate — the Jekyll build was never run locally.

Follow-ups (not in this PR)

  • 11.7 MB of the repo is four .pptx decks that duplicate their own PDFs.
  • icsa26-archguard.svg (1.1 MB) and aire25-aire.svg (711 KB) are oversized; optimising them
    changes bytes at pinned URLs, so it is a deliberate separate decision.
  • AIRE 2025 and REFSQ 2025 render without a venue badge — those bib entries carry no abbr, which
    was true before this PR too.

@netlify

netlify Bot commented Sep 14, 2026

Copy link
Copy Markdown

Deploy Preview for adorable-belekoy-acde02 ready!

Name Link
🔨 Latest commit 4a8c992
🔍 Latest deploy log https://app.netlify.com/projects/adorable-belekoy-acde02/deploys/6aa8166a159c6a0008a708a5
😎 Deploy Preview https://deploy-preview-6--adorable-belekoy-acde02.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

ardoco.de ran on a pre-v1, vendored-theme al-folio fork. Upstream has since
moved to a gem-based v1, so the fork sat on a dead branch: 27 gems and 14
workflows, and 20 MB of downloaded vendor libraries, to serve 25 MB of content.
fuchss.org hit the same wall last week and its author put the general case
well — "every design decision I cared about lived inside theme internals".

Same content, same URLs, different machinery.

                          before      after
  dependencies            27 gems     11 npm packages
  workflows               14          1
  tracked files           329         112
  homepage requests       27          1
  homepage weight         2.1 MB      32 KB
  build                   ~30 s       1.5 s (31 pages)

Content moves into six Zod-validated collections. The joins that Jekyll
resolved as string lookups are now Astro references, so a conference naming an
approach that does not exist, a BibTeX abbr with no venue entry, or an
html = {/c/<slug>} pointing at a missing page all stop the build instead of
rendering blank. That immediately surfaced two latent bugs: abbr = {SE} had no
venues.yml entry, so those badges rendered grey and unlabelled, and the
children[] array in _pages/conferences.md silently drove both the navbar order
and the front-page publication order. Each conference entry now carries its own
navOrder.

The URL surface is unchanged and was checked against gh-pages during the
migration: build.format: 'preserve' emits both /approaches/<slug>/ and the flat
/c/<slug>, the five legacy /c/se* stubs still redirect, and the PDFs and images
are served byte-for-byte from public/ and pinned by SHA-256. public/CNAME is
now committed — it previously survived only because Jekyll's keep_files
preserved it on the branch, and a full-replace deploy of a new tree would have
dropped the custom domain.

Also fixed along the way: four GI proceedings papers typed as @Article with the
publishing society in a journal field, and non-breaking spaces hidden inside
two titles that broke word wrapping and the publications filter.

New: a real /conferences/ index, Highwire citation_* tags and ScholarlyArticle
JSON-LD on every paper page (the old site emitted neither), and email addresses
that appear nowhere in the served bytes. npm run verify asserts all of it,
including the two NEVER CHANGE THIS LINE comments that mcse.kastel.kit.edu
scrapes.

The site is dark only.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant