Changelog
All notable changes to jorgeroac are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2026-05-24 — v0.9.0: General bug fixes and polish (ISS: #81)
Added
Letterboxd and Stanford profile footer icons (ISS: #82)
Two new social icons added to the site-wide footer: Letterboxd (fa-brands fa-letterboxd) and Stanford FSI profile (fa-solid fa-building-columns), bringing the footer icon count to eight. Each has a per-nth-child brand-color hover glow. The Letterboxd entry on the CV about page was also updated from a generic film icon to the proper brand icon with tricolor text matching Letterboxd’s orange/green/blue palette.
Files: _quarto.yml, styles.css, cv/index.qmd
CV PDF download button and updated CV (ISS: #82)
A “Download CV” button added as the first about-link on the Who I Am page, pointing to /cv/JorgeRoaCV.pdf and opening in a new browser tab. The extended English CV PDF was updated with a new Tutorials & Technical Writing section (6 entries, years 2022–2025), a page break before Skills, and removed breaks before Peer-Reviewed Publications and Awards.
Files: cv/index.qmd, cv/JorgeRoaCV.pdf
jorgeroac.com and Stanford CEA Chile 2025 portfolio entries (ISS: #82)
Two new entries added to the portfolio page. jorgeroac.com itself is now item 01 (Personal · Website) and Stanford CEA Chile 2025 is item 02 (Teaching · Course); previous items renumbered 03–06. Both include Playwright-captured screenshots and role/year metadata.
Files: portfolio/index.qmd, portfolio/assets/jorgeroac-site.png, portfolio/assets/stanford-cea-chile-2025.png
Fixed
Footer width, z-index, and external link targets (ISS: #82)
Three footer bugs fixed: (1) the starfield canvas bled through the footer on the CV page — fixed with position: relative; z-index: 1 on .nav-footer; (2) footer content spread edge-to-edge on ultrawide viewports — fixed with padding: max(24px, calc((100% - 1400px) / 2)) !important; (3) footer icon links did not open in new tabs — fixed with a JS handler in navbar_animation.html targeting all non-mailto/non-hash footer links.
Files: styles.css, _includes/navbar_animation.html
PNG favicon and apple-touch-icon (ISS: #82)
Site favicon updated from SVG-only (not indexed by Google) to a 192×192 PNG, with an additional apple-touch-icon link tag. Both link tags injected via preconnect.html; _quarto.yml favicon updated to the PNG.
Files: _includes/preconnect.html, _quarto.yml, images/jr-logo-192.png
CV entries and school tribute (ISS: #82)
Fixed broken Hertie DSL logo (case mismatch dsl.png → DSL.png) and corrected role to “Student Research Assistant”. Added Centro Escolar del Lago (Cuautitlán Izcalli, Mexico, 2000–2016) as a tribute education entry with logo and “Proud Benedictine” footnote.
Files: cv/index.qmd, cv/cv_styles.css, cv/images/cel_logo.png
Changed
Travel gallery card caption redesign (ISS: #82)
Gallery card captions redesigned from a horizontal flex row to a vertical column: flag centered above country name (38px flag, centered text), overlaid on a gradient fade at the card bottom. Improves readability and visual hierarchy across all travel destination cards.
Files: travel/travel_styles.css
2026-05-23 — v0.8.0: Mobile & responsive hardening (ISS: #71)
Fixed
Closeread scroll-story on mobile (ISS: #72, #75)
The scrollytelling tutorials jumped back to the section top while scrolling on phones. The cause was the mobile address bar firing resize and shifting dvh on every scroll. Fixed by keeping the scroll animation but stabilizing the pinned figure at 100svh (instead of 100dvh) and guarding scrollama’s resize listener to fire only on a genuine width change. (#72 first deactivated the story on mobile; #75 reworked it to keep the animation.)
Files: _extensions/qmd-lab/closeread/closeread.js, tutorials/items/*/cr_story.css
Mobile footer and home full-bleed frame (ISS: #72)
The mobile footer was cluttered with mis-aligned social icons; it now shows a centered copyright-only line. The narrow-viewport content gutter was insetting the home page’s full-bleed background canvas, leaving a visible side “frame”; the full-bleed custom layout is now exempted from that gutter.
Files: styles.css
CV profile photo on mobile (ISS: #71)
The CV headshot rendered tiny and left-aligned on phones, capped by Quarto’s higher-specificity max-width: 42% template rule. A matching-specificity override now lifts the cap, sizes the photo prominently, and centers it.
Files: cv/cv_styles.css
Navbar menu flash on mobile (ISS: #71)
The mobile navbar menu items replayed a staggered fade-in every time the menu was toggled open, reading as a flash. They now appear instantly.
Files: styles.css
Site-wide scroll-reload on mobile entry pages (ISS: #71)
The cinematic-hero positioning scripts and the home background canvas re-ran on every mobile address-bar toggle (a height-only resize while scrolling), re-laying-out the page — a flash, content jump, and scroll reset that read as a spontaneous reload. Each resize handler now bails on height-only resizes and re-positions only on a real width change.
Files: tutorials/_tutorial_detail.js, publications/papers/pub_detail.js, media/_media_detail.js, assets/js/beziercurve.js
2026-05-23 — v0.7.0: Closeread scrollytelling tutorials, SEO/apex alignment, and UI fixes (ISS: #65)
Added
Scrollytelling tutorials with cinematic-hero + closeread template (ISS: #66, #67, #68)
Three data-science tutorials rebuilt with the locked cinematic-hero + closeread scroll-story template: difference-arrays-cumsum (#66), how-we-met-quanteda (#68), and deep-learning bias & fairness (#67). Each gets a full-bleed painting hero, a dark theme, a widen-to-TOC responsive layout, and scroll-driven sticky-figure narratives — including an interactive ggiraph benchmark plot (diff-arrays) and a ProPublica false-positive-rate disparity chart (bias). Vendors the closeread Quarto extension.
Files: _extensions/qmd-lab/closeread/, tutorials/items/difference-arrays-cumsum/index.qmd, tutorials/items/how-we-met-quanteda/index.qmd, tutorials/items/dl-bias-fairness/index.qmd, tutorials/items/*/cr_story.css
Apex canonical host and per-paper Scholar metadata (ISS: #66)
Entire site aligned to the apex canonical host https://jorgeroac.com (site-url, sitemap, canonicals, OG/Twitter, JSON-LD @id/sameAs). Google Scholar citation_* metadata scoped to the 12 scholarly papers with clean author lists, and complete fig-alt/image-alt added across tutorials and publications. Maximizes search presence and accessibility.
Files: _quarto.yml, README.md, _includes/schema_home.html, _includes/schema_profile.html, _includes/ogurl.html, publications/papers/**/index.qmd
Travel gallery, AI-stack stats, and live software badges (ISS: #66)
New Travel photo gallery with a navbar entry propagated across all built pages. Build-time GitHub stats added to the AI Stack page (token stays local, build-time only) and live ggpop repository badges added to the software page.
Files: _quarto.yml, scripts/fetch_ais_stats.sh
Magazine layout extended across publications (ISS: #66)
Magazine story-row layout applied to research entries, other-publications, and the Lancet entry, with a figure lightbox and an adaptive wide-figure layout. Thin publication entries enriched with summaries and content.
Files: styles.css, publications/papers/**/index.qmd
Fixed
CV and portfolio layout regressions (ISS: #66)
CV responsive layout, content width cap, footer scaling on wide screens, and section entrance animations corrected. Portfolio header matched to the other tabs with a card entrance animation.
Files: cv/index.qmd, cv/cv_styles.css, styles.css
Quanteda tutorial hero and layout (ISS: #66, #68)
The bright hero image was tamed to the dark mood, the nested-section layout widened to match the scroll-stories, a first-part layout regression fixed, and the workshop-slides embed sized to fill the column.
Files: tutorials/items/how-we-met-quanteda/cr_story.css, tutorials/items/how-we-met-quanteda/index.qmd
Dark-theme callouts and missing hero images (ISS: #66)
Note/tip/important callouts restyled for the dark background so they no longer wash out, and hero background images restored on several publication pages.
Files: styles.css, publications/papers/**/index.qmd
Security: quanteda path leak and slides iframe (ISS: #66)
Removed a local filesystem path leak from the quanteda tutorial output and sandboxed the embedded workshop-slides iframe.
Files: tutorials/items/how-we-met-quanteda/index.qmd
Changed
Tutorial prose voice and agent-file ignore rules (ISS: #66)
Tutorial prose rewritten to a direct, declarative voice. .gitignore updated to ignore Quarto listing-data artifacts and the machine-local CLAUDE.md/AGENTS.md agent-guidance symlinks.
Files: tutorials/items/difference-arrays-cumsum/index.qmd, .gitignore
2026-05-20 — v0.6.0: Magazine media layout, CV polish, and research tab content (ISS: #58)
Added
Add magazine layout for media entries (ISS: #62)
Full magazine-style layout applied to all 13 media detail pages: shared pub_detail.css layout engine with cinematic hero, alternating story rows, scroll parallax, hover lift, and photo credits. Real article content replaces placeholder paragraphs — direct quotes, named third-party analysts, year-by-year chronologies, and electoral violence data. Four redundant press entries removed from the listing.
Files: publications/papers/pub_detail.css, publications/papers/pub_detail.js, media/items/**/index.qmd, media/index.qmd, styles.css, scripts/optimize-image.sh
Finish research tab content and polish (ISS: #60)
Cinematic hero images wired to six additional publication entries (corte-calles, datos-abiertos-vacunacion, hpylori-poster-smdm, searches-to-sneezes, indicador-covid-ags, geografia-violencia). Article summaries added to six pub entries. Site-wide SEO meta descriptions and schema.org markup updated across all pages. ORCID footer spacing fixed.
Files: publications/papers/**/index.qmd, _includes/schema_home.html, _includes/schema_profile.html, _quarto.yml
Propagate cinematic hero to remaining publication pages (ISS: #53)
Cinematic painting hero extended to hpylori-force-infection and remaining forthcoming/media publication detail pages, completing the full propagation pass started in v0.5.0. No-cover fallback path finalized.
Files: publications/papers/forthcoming/hpylori-force-infection/index.qmd, publications/papers/pub_detail.css
Fixed
Finish CV section content and polish (ISS: #59)
TA, awards, leadership, and talks sections redesigned with consistent typography and layout. CV full-width layout corrected for certifications columns and skills label visibility.
Files: cv/index.qmd, cv/cv_styles.css
2026-05-17 — v0.4.0: AI Stack page, site-wide SEO, cinematic tutorial heros (ISS: #39)
Added
Add AI Stack cinematic bento page (ISS: #40)
New top-level AI Stack page with a cinematic bento-grid layout showcasing the agent ecosystem and tooling. Standard header style and full mobile responsiveness. Follows the same design language as the rest of the site.
Files: ai-stack/index.qmd, ai-stack/ai-stack_styles.css
Migrate CV page content (ISS: #40)
Major content migration into the CV page covering education, research experience, publications, talks, and academic background. Starfield background preserved.
Files: cv/index.qmd, cv/cv_styles.css
Add JSON-LD structured data infrastructure (ISS: #42)
Site-wide structured data: BreadcrumbList on every detail page, Person + WebSite schema on the homepage, ScholarlyArticle JSON-LD on individual peer-reviewed papers, CollectionPage schema on portfolio. Per-page schema partials live in _includes/schema_*.html.
Files: 16 schema partials in _includes/, _quarto.yml
Add SEO descriptions, canonical URLs, and OG metadata site-wide (ISS: #42)
Every page gets a unique meta description, canonical URL, and per-page open-graph + twitter-card YAML blocks so social shares show the right title, description, and cover image. og:type set to article on paper routes, og:url injected dynamically.
Files: every detail index.qmd, _includes/ogurl.html
Add custom domain, robots.txt with AI bot allow-list, llms.txt (ISS: #42)
Site now lives at jorgeroac.com (CNAME). robots.txt allows GPTBot, ClaudeBot, PerplexityBot, and Google-Extended. llms.txt published for LLM context discovery. Branded social preview image at /assets/og-preview.png used as the default OG image when per-page imagery isn’t set.
Files: CNAME, robots.txt, llms.txt, assets/og-preview.png
Add cinematic tutorial heros across 5 tutorials (ISS: #44)
Locked cinematic-hero design for every tutorial detail page: navbar-flush positioning measured at runtime, full-bleed painting backgrounds, radial vignette over a focal point, bottom dissolve into the actual body color, decluttered top-left slot, larger authors text. Lives in a single shared _tutorial_detail.css / _tutorial_detail.js pair — no per-page overrides. Each painting carries a warm-gold attribution caption (artist · museum · description).
Files: tutorials/_tutorial_detail.css, tutorials/_tutorial_detail.js, five tutorial index.qmd files
Add Article-family schema to tutorials and 7 missing publications (ISS: #44)
Five TechArticle partials for tutorials plus seven more for publications previously missing schema (3 media op-eds, 1 data-journalism piece, 2 policy briefs, 1 conference poster) using the right Schema.org subtype per content kind (OpinionNewsArticle, NewsArticle, Report, ScholarlyArticle). Brings every long-form content page to parity with peer-reviewed papers in structured-data coverage.
Files: 12 new _includes/schema_*.html partials, 12 detail qmds
Add Pandoc lazy-image filter and Google Fonts preconnect (ISS: #44)
Lua filter that stamps loading="lazy" and decoding="async" on every Pandoc Image node site-wide. Plus <link rel="preconnect"> hints for fonts.googleapis.com and fonts.gstatic.com (the latter with crossorigin). Shaves typical Quicksand font-load latency by 100–300ms on first paint and defers below-the-fold image loads.
Files: _filters/lazy-images.lua, _includes/preconnect.html, _quarto.yml
Changed
Unify page layouts, fonts, and entrance animations across sections (ISS: #40)
Tutorials grid expanded to 5 columns. Software, media, and AI Stack pages migrated to a unified Quicksand font and matched layout. Standard header style applied to publications subtabs and AI Stack. swIn entrance animations added to software and tutorials. Tutorials page layout matched to software page. Removed Exports & Imports from portfolio.
Files: tutorials/, software/, media/, ai-stack/, publications/
Sweep alt text onto 88 inline tutorial figures (ISS: #44)
Stata-to-R (71 inline imgs) and multithreading (17 inline imgs) get descriptive alt text on every figure via Quarto’s fig-alt= attribute syntax — meaningful descriptions for screen readers and crawlers without adding visible <figcaption> clutter.
Files: tutorials/items/stata-to-r/index.qmd, tutorials/items/multithreading/index.qmd
Add twitter:creator attribution and ignore knitr build artifacts (ISS: #44)
twitter:creator and twitter:site set to @JorgeRoaC so Twitter share cards include byline attribution. Anchored .gitignore patterns silence per-document index_cache/ and index_files/ sidecars that knitr emits under tutorials/items/*/ and publications/papers/*/*/; _site/.../index_files/ copies stay tracked.
Files: _quarto.yml, .gitignore
Add Google Analytics 4 instrumentation
Wires the GA4 Measurement ID G-D5LFDPZ2RG for the jorgeroac analytics stream into the website.google-analytics field in _quarto.yml. Quarto auto-injects the gtag.js snippet (script tag plus inline config call) into the <head> of every page at render time — no per-page edits or custom JS partials required. Session, pageview, and behavior tracking will start collecting from request #1 the moment DNS flips from Squarespace to GitHub Pages.
Files: _quarto.yml
Fixed (post-release deployment)
Rename build output to docs/ for GitHub Pages compatibility
GitHub Pages’ “Deploy from a branch” mode only allows /(root) or /docs as the publishing folder — Quarto’s default _site/ was not selectable from the Pages UI, blocking the custom-domain hookup. Added output-dir: docs to _quarto.yml and relocated the entire built site tree from _site/ to docs/ (263 files moved cleanly with all paths preserved). Also cleaned up an orphaned _site/ directory that survived an earlier rename due to a git reset HEAD clobbering the staged deletions.
Files: _quarto.yml, docs/ (new build directory), _site/ (removed)
Add .nojekyll to fix Jekyll-filtered tutorial hero CSS
GitHub Pages applies Jekyll by default, which silently filters out any file or folder whose name starts with _ (Jekyll convention). This 404’d docs/tutorials/_tutorial_detail.css and _tutorial_detail.js in production, breaking the cinematic painting hero on every tutorial detail page — the markup was correct but the styling was missing because the shared CSS was being filtered. Added an empty .nojekyll marker at the docs/ root (and a safety copy at project root) to disable Jekyll processing entirely. Standard fix for any non-Jekyll site deployed via GitHub Pages.
Files: docs/.nojekyll, .nojekyll
Add llms.txt to Quarto resources for LLM context discovery
llms.txt (the LLM-context-discovery file at the apex URL) is not on Quarto’s auto-copy list (unlike CNAME and robots.txt) and was returning 404 on the live site after the docs/ rename. Added resources: [llms.txt] to _quarto.yml so future renders copy it into the build output. https://jorgeroac.com/llms.txt now serves 200 with the full Jorge Roa context document.
Files: _quarto.yml, docs/llms.txt
2026-05-16 — v0.3.0: Mobile-friendly site, Media + Publications + Portfolio redesign (ISS: #33)
Added
Add mobile-friendly styling sitewide (ISS: #34)
Sitewide responsive overhaul: mobile navbar with smooth dropdown, CV starfield that scrolls with the page, and global mobile spacing and typography fixes so every section reads correctly on phones. Sets a single mobile baseline that all later sections inherit.
Files: styles.css, cv/cv_styles.css, _quarto.yml
Add Portfolio section (ISS: #36)
New top-level Portfolio section showcasing five live websites: Hertie Coding Club, DARTH Workgroup, ggpop documentation, HpGenerator Shiny app, and Exports & Imports Shiny app. Each entry is a single clickable anchor card with a browser-chrome thumbnail, real screenshot, role/year metadata, and alternating left/right layout. Built on a scoped stylesheet (.pf-* prefix) using Quicksand to match the rest of the site.
Files: portfolio/index.qmd, portfolio/portfolio_styles.css, portfolio/assets/hertie-coding-club.png, portfolio/assets/darth-workgroup.png, portfolio/assets/ggpop-docs.png, portfolio/assets/hp-generator.png, portfolio/assets/exports-imports.png
Add PRODUCT.md and DESIGN.md (ISS: #36)
PRODUCT.md documents the site’s scope, sections, audience, and success criteria. DESIGN.md captures the design system — color tokens, typography, spacing, and component patterns — now used consistently across Media, Publications, Tutorials, and Portfolio. The README.md was also refactored to cross-reference these docs above the vendored qreacto upstream README.
Files: PRODUCT.md, DESIGN.md, README.md
Changed
Redesign Media tab and add 6 new entries (ISS: #36)
Full Media tab refresh: card layout, filter UX, header animation, mobile adapt, copy clarify, micro-interactions, font-load and LCP optimizations, hardened filter edge cases, empty-state onboarding, tile color tokens by medium type, and a final a11y/perf pass. Six new entries added across press, radio, TV, and talk media.
Files: media/index.qmd, media/media_styles.css, media/items/press/2021-laprensa-honduras-148-carteles/, media/items/press/2022-emeequis-fiscalia-sombras/, media/items/press/2022-emeequis-fuera-del-radar/, media/items/radio/2022-heraldo-alatorre/, media/items/talk/2021-malverde-seminario-religioso/, media/items/tv/2021-meganoticias-crimen-electoral/
Polish Publications page across nine passes (ISS: #36)
Publications page goes through a complete refresh: polish, mobile adapt, copy clarify, delight micro-interactions, animated section headings, render perf, edge-case hardening, empty-state onboarding, colorize peer-reviewed section, and a final a11y audit fix. Sub-pages restyled with transparent borders and no top-shine; peer-reviewed laid out in a single column, forthcoming in two columns, other publications in two columns.
Files: publications/index.qmd, publications/publications_style.css, publications/peer-reviewed/index.qmd, publications/forthcoming/index.qmd, publications/other/index.qmd, plus eight paper-level index.qmd files under publications/peer-reviewed/
Redesign Tutorials page with 3-col grid (ISS: #36)
Tutorials page rebuilt as a compact 3-column caption-below grid. tutorials/index.qmd consolidates the three separate track listings into a single all-tutorials listing and switches to page-layout: full with embedded JS for staggered fade-in reveal and tag-cascade hover. tutorials/tutorials_styles.css is a complete rewrite (net -700 lines) replacing the old track-based numbered-rail design; hard-resets every descendant margin/padding/border to defeat Quarto defaults, with 14px rounded corners on 5:4 thumbnails.
Files: tutorials/index.qmd, tutorials/tutorials_styles.css
Reveal CV starfield against pure black (ISS: #36)
Makes the CV page background transparent so the inline-script starfield canvas paints through, and sets html { background: #000 } so the canvas reveals cleanly against pure black. Fixes the “gray CV background” issue that masked the intended visual effect.
Files: cv/cv_styles.css
Tighten home hero and restyle Research subtabs (ISS: #36)
Drops the heading-context subtitle below “Software Developer” on the home page to tighten the hero. Restyles the Research subtab listings (peer-reviewed, forthcoming, other) with consistent borders, spacing, and column counts. Also drops the “other publications” listing from three to two columns for better balance on wide screens.
Files: index.qmd, publications/index.qmd, publications/other/index.qmd, publications/publications_style.css
2026-05-09 — v0.2.0: Media, Tutorials, and Software sections (ISS: #25)
Added
Add Media and Interviews navbar tab (ISS: #26)
Added a Media & Interviews tab to surface press coverage and interview appearances under a dedicated section of the site, with its own landing page wired into the top-level navbar.
Files: media/index.qmd, _quarto.yml
Build Tutorials section as curriculum-style ToC (ISS: #28)
Built a full Tutorials section as a curriculum-style table of contents with a native sticky right TOC, Solarized Dark code styling, and shared per-tutorial detail template. Shipped Track 02 (Bias in AI), Track 03 (PDF-to-text, Stata-to-R, Multithreading on Apple Silicon), and brought the quanteda tutorial to parity. Polished landing titles, thumbnails, CTA links, and pruned stale image assets.
Files: tutorials/index.qmd, tutorials/_tutorial_detail.css, tutorials/_tutorial_detail.js, tutorials/items/multithreading/, tutorials/items/pdf-to-text/, tutorials/items/stata-to-r/, tutorials/items/bias-in-ai/, tutorials/items/quanteda/, _quarto.yml
Add Software tab (ISS: #30)
Added a Software tab with a ggpop entry expanded from the README into a full detail page, scoped the navbar scroll-progress indicator to tutorial pages only, simplified the Media landing top of page, and unified all code-chunk styling (Solarized Dark + #| filename: labels + code-fold: show toggle) into a single source in styles.css wired across tutorials.
Files: software/index.qmd, software/items/ggpop/index.qmd, software/items/ggpop/assets/logo.png, software/software_styles.css, styles.css, _quarto.yml