Conversation
Update page.liquid .
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com>
* Add Karadag 2026 urban wind simulation publication - Added the BibTeX entry for `KARADAG2026107614` to `_bibliography/papers.bib`. - Associated the publication with the `cfdgan-compressed.gif` preview image. - Added the `bibtex_show` field to the new entry. - Added `2026` to `years_papers` in `_pages/research/children/publications.md` so the newly added publication is rendered on the website. Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com> * Add specific karadag image to publication Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com> * Change publication preview image to abstract screenshot Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com> * Update karadag_abstract.png --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com>
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com>
Replaced the hardcoded source link in `_projects/PhD-SinaRahimi.md` with a Liquid remote_include block that fetches and displays the actual GitHub README.md content. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com>
Public instance github-readme-stats.vercel.app returns 503 DEPLOYMENT_PAUSED, breaking all repo card images on /code/. Point at the author's working deployment alias instead. Co-authored-by: Patrick Kastner <1919773+kastnerp@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* Add new display categories in theses.md Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com> * Add new display categories in theses.md Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com> * Integrate new projects and update bibtex Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com> * Integrate new projects and update bibtex Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com> * Update bibtex fields and add macadThesis24 Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com> * Remove macadThesis24 Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com> --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: kastnerp <1919773+kastnerp@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* Added support for helping agents (#3379)
Since a lot of our users don't have a coding background and given
recently development with AI agents, I decided to try to add support for
specialized agents in our repository. They were created following
[agents.md](https://agents.md/) "specifications" and are currently 2:
- `customize-agent` - to help new users with access to GitHub Copilot
customize their site
- `docs-agent` - to help us keep the documentation always updated with
the latest changes in our code
I don't really know how useful they'll actually be, but I think most of
our users might actually benefit from the `customize-agent`, so it is
worth a shot.
<img width="852" height="1043" alt="image"
src="https://github.com/user-attachments/assets/e8390f1a-cec3-42a8-b01e-26d658ea78e8"
/>
Edit: also added a link to a [Code Wiki to our
repository](https://codewiki.google/github.com/alshedivat/al-folio) and
[DeepWiki](https://deepwiki.com/alshedivat/al-folio). This allows any
user to chat online with AIs (Gemini and Devin) about our repository.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Auto update markdown TOC
* Fix bib / code layout bug (#3387)
Resolve #3370
Resolve #3380
Based on the
[comment](https://github.com/alshedivat/al-folio/issues/3370#issuecomment-3565962058)
of @MarkusThill, I created a bugfix that solved the issue on my website.
Hope that fixes it in general; thus the PR :) However, I'm not an expert
for scss .. so handle with care :)
* Fix: bibliography month persists to subsequent entries without month (#3391)
Fixes #3386 (the part about the wrong months; the other part (layouting
of bibtex) is fixed in #3387)
## Summary
- Fixes incorrect month shown for bibliography entries that do not
specify a `month` in BibTeX.
- Ensures `month`/`year` do not persist between entries in
`_layouts/bib.liquid`.
## Root Cause
- In Liquid, captured variables persist across iterations if not
reinitialized.
- `entrymonth` and `entryyear` were only set when
`entry.month`/`entry.year` existed, causing values from a previous entry
to leak into the next one when those fields were missing.
## Changes
- Reinitialize date-related variables per entry before conditional
captures:
## Behavior
- Before: Entries without a `month` could display the previous entry's
month.
- After: Entries without a `month` display only the `year`; entries with
a `month` display the correct month and year.
<img width="1956" height="918" alt="image"
src="https://github.com/user-attachments/assets/7a9682e7-55ab-43b7-8f82-f638d14ce08e"
/>
* Fixed 1 px first load issue (#3416)
Fix #3164
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Added support for default categories and tags for external posts (#3417)
Based on discussion #3393.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Add link to personal GitHub page on academics section in README (#3400)
* Add auto-orient flag to Imagemagick config (#3409)
Currently, images generated by Imagemagick do not respect the
orientation of the source image. By adding the auto-orient flag, the
images are the correct orientation.
Before
<img width="920" height="562" alt="image"
src="https://github.com/user-attachments/assets/73f59d7f-b6c5-468a-9023-0f0457a53a3c"
/>
After
<img width="947" height="621" alt="image"
src="https://github.com/user-attachments/assets/2f24de99-2e84-4052-8d0f-945acdad81e4"
/>
* Update deps (#3418)
Closes #3402
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Auto update markdown TOC
* Added new line to README badges
* Changed maintainers urls to https
* Updated prettier (#3420)
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Fix typo in Bootstrap small column class usage (#3421)
This PR fixes a recurring typo in multiple Liquid templates where the
Bootstrap class `cl-sm` is used instead of `col-sm`.
Because of this typo, the `col-sm` styling was not being applied. All
instances have been corrected.
* Update Google Scholar citations
* Make external service URLs configurable for repository page (#3422)
## Description
This PR makes the URLs for external services used on the repository page
configurable in `_config.yml`. This allows users to self-host these
services for better reliability, privacy, and customization.
## Changes
- Added `external_services` configuration section in `_config.yml` with:
- `github_readme_stats_url` (default:
`https://github-readme-stats.vercel.app`)
- `github_profile_trophy_url` (default:
`https://github-profile-trophy.vercel.app`)
- Updated repository template files to use configurable URLs:
- `_includes/repository/repo_user.liquid`
- `_includes/repository/repo.liquid`
- `_includes/repository/repo_trophies.liquid`
- Added documentation in `CUSTOMIZE.md` explaining:
- Why self-hosting is recommended (default services may have
availability issues)
- How to configure custom service URLs
- Links to the service repositories for deployment instructions
## Resolves
Resolves #3388 - This makes it possible to configure self-hosted
versions of these services, giving users full control over the external
services used for displaying GitHub statistics and trophies.
## Testing
- Verified that default configuration still works with original service
URLs
- Confirmed that URLs are properly interpolated in all template files
- Documentation clearly explains the configuration options
* Auto update markdown TOC
* Remove link to sam-bieberich.github.io (#3425)
Removed a link to sam-bieberich.github.io from the README.
* Add link to personal GitHub page on academics section in README (#3424)
* Add j1yoo.github.io to User community (#3427)
Hi! I'd like to add my academic website to the User community section.
**Website:** https://j1yoo.github.io/
This PR adds a single star link to the Academics row in the User
community table.
Thank you for creating and maintaining this beautiful theme!
Co-authored-by: Jaewon Yoo <jwyoo4@gmail.com>
* add filtered BibTeX keywords (#3403)
add `dimensions, eprint` and `pmid` to the filtered keywords
* Add HAL button (#3404)
Adds a HAL button in the same spirit as the arXiv button.
- add HAL button to `_layouts/bib.liquid`
- add `hal` to the filtered keywords in `_config.yml`
- add `hal` to the documentation in `CUSTOMIZE.md`
* Improved collections section in CUSTOMIZE guide (#3431)
Improved section based on comments from #2369.
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Add zhoji.github.io to User community in README.md (#3433)
Adding my personal website for the al-folio community :) Thanks for
creating such a cool template!
* Changed code to use plugin to handle 3rd party libraries downloads (#3435)
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Changed to use cache bust plugin (#3436)
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Update deps (#3437)
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Auto update markdown TOC
* Changed to use jekyll-socials plugin (#3439)
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Updated deps and deploy version (#3440)
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Auto update markdown TOC
* Fixed dates in book-shelf (#3446)
Fixes #3443.
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Updated deps to fix issue with jekyll-socials (#3447)
Fixes #3445
Signed-off-by: George Araújo <george.gcac@gmail.com>
* ⚡ Optimize Google Scholar Citations Regex Definition (#3449)
💡 **What:** Moved the regex definition `/Cited by (\d+[,\d]*)/` from the
method scope to a class-level constant `CITED_BY_REGEX`.
🎯 **Why:** To improve code cleanliness and avoid potential re-definition
of the regex object in every method call (or loop), adhering to best
practices.
📊 **Measured Improvement:**
* **Baseline:** The regex was defined as a literal inside the `render`
method, which is called for each tag usage.
* **Optimization:** The regex is now defined once as a constant.
* **Note:** Performance benchmarks were not possible in the current
environment due to missing Ruby runtime. However, this is a standard
Ruby optimization that improves maintainability and theoretically avoids
object allocation overhead in older Ruby versions or complex scenarios.
Modern Ruby optimizes literals well, but the constant approach is
cleaner and DRYer.
---
*PR created automatically by Jules for task
[10688912524063334698](https://jules.google.com/task/10688912524063334698)
started by @alshedivat*
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
* Refactor: Use Liquid filter to find home page title (#3448)
Refactored the script in _scripts/search.liquid.js to use a more
efficient Liquid 'where' filter to find the home page title. This
replaces an inefficient for loop that iterated through all site pages.
---
*PR created automatically by Jules for task
[5748098109809984605](https://jules.google.com/task/5748098109809984605)
started by @alshedivat*
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
* Revert "Refactor: Use Liquid filter to find home page title" (#3451)
Reverts alshedivat/al-folio#3448
* Updated jekyll-archives-v2 (#3460)
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Auto update markdown TOC
* Add course schedule feature to teaching page (#2258) (#3147)
Implements the course schedule feature requested in issue
#[2258](https://github.com/alshedivat/al-folio/issues/2258).
This PR adds a new course schedule feature to the al-folio theme,
allowing academics to easily create and display structured course
information.
**Changes:**
- Added a `courses` collection to organize and display academic courses
- Created course layout and display templates with responsive design
- Implemented organization by year and term with automatic sorting
- Added support for weekly schedule with topics and course materials
- Simplified documentation with a README for course creation
This feature makes it easier for academics to showcase their teaching
materials with a consistent, organized display of course schedules,
helping users create professional teaching pages without custom
implementation.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: George Araújo <george.gcac@gmail.com>
* Auto update markdown TOC
* Add calendar iframe and togglAdd calendar iframe and toggle buttone button (#3144)
### Description
This PR adds a Google Calendar integration feature as described in issue
#872. Users can embed their own calendar using an iframe configured via
`_config.yml`, and the calendar is toggleable through a responsive
button. This component is styled to visually blend into the theme and
supports responsive display across desktop and mobile.
### Changes
- Added `calendar.liquid` in `_includes`
- Modified `about.md` to include the toggleable calendar block
- Introduced `calendar` config section in `_config.yml`
- Appended calendar-related styles in `_sass/_base.scss`
### Configuration
To enable this feature, add the following to `_config.yml`:
```yaml
calendar:
enabled: true
calendar_id: your_calendar_id@group.calendar.google.com
timezone: UTC
style: "border:0; width:100%; height:600px;"
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: dodo <349507644@qq.com>
Co-authored-by: George <31376482+george-gca@users.noreply.github.com>
Co-authored-by: George Araújo <george.gcac@gmail.com>
* Update Google Scholar citations
* Updated jekyll-socials to latest version (#3464)
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Add smsnoBin77 link to README (#3473)
Add a new link to the README for smsnoBin77.
* Unify jsonresume and RenderCV CVs solutions (#3462)
Fixes #2787 as an alternative to #2969. It was getting too cumbersome to
have 2 different data sources for CV and also a lot of different layout
files, so I decided to unify them all.
Main changes:
- synchronized the information inside RenderCV (`_data/cv.yml`) and
JSONResume (`assets/json/resume.json`)
- unified layout files for CV information
- added the option to set the "data source" in the CV page
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* chore: render the latest CV
* Rendercv missing commits (#3475)
Signed-off-by: George Araújo <george.gcac@gmail.com>
* chore: render the latest CV
* Update Google Scholar citations
* Update SASS syntax in base (non-font) files (#3281)
Partially fixes issue #3256 by updating SASS syntax in main SCSS files.
To fully address the issue, FontAwesome should be updated to `v7.x` and
Tabler to `v3.30` or higher (see Tabler fix
[here](https://github.com/tabler/tabler-icons/pull/1256)), where the
SCSS has been fixed.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: George Araújo <george.gcac@gmail.com>
* Auto update markdown TOC
* Improve readme, add site-wide CSP (#3485)
This pull request significantly expands and clarifies the documentation
for the al-folio Jekyll theme, focusing on improved file structure
explanations, enhanced quick reference guides, and the addition of a
comprehensive analytics setup guide. The changes make it easier for
users and contributors to understand the project organization, available
features, and configuration options, especially regarding CV formats,
teaching pages, and analytics integration.
**Key documentation and structure improvements:**
*Expanded file and collection structure:*
- The file structure documentation in
`.github/agents/customize.agent.md` and `.github/agents/docs.agent.md`
now details all major directories, including new and existing
collections such as `_books/`, `_teachings/`, `_scripts/`, `_plugins/`,
and expanded `assets/` subdirectories. It also covers new configuration
and utility files, making it easier for users to locate and understand
the purpose of each file or folder.
[[1]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L24-R66)
[[2]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L17-R58)
*Documentation and quick reference enhancements:*
- The quick reference table in `.github/agents/customize.agent.md` has
been updated to include new actions like adding teaching pages, setting
up analytics, improving SEO, and ensuring accessibility, with more
precise documentation links.
- The documentation map now lists all major guides (e.g.,
`QUICKSTART.md`, `INSTALL.md`, `TROUBLESHOOTING.md`, `ACCESSIBILITY.md`,
`ANALYTICS.md`, `SEO.md`), providing a clearer overview of available
resources.
[[1]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L58-R110)
[[2]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L17-R58)
**Feature and configuration documentation updates:**
*CV/resume format guidance:*
- The CV documentation now clarifies that users can maintain both
RenderCV and JSONResume formats simultaneously, with clear instructions
on switching between them and deleting unused files if desired.
[[1]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L139-R185)
[[2]](diffhunk://#diff-52f2a9488bfe4177d1f1d01120859dad0b3e2d087283ded68f72d47b4f183391L291-R291)
*Teaching pages and new collections:*
- Adds documentation for the new `_teachings/` collection, including
required frontmatter and support for course materials, as well as
updates to enable/disable teaching and books pages via `_config.yml`.
[[1]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L180-R252)
[[2]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L24-R66)
*Analytics integration:*
- Introduces a new `ANALYTICS.md` guide with detailed setup instructions
for Google Analytics, privacy-friendly alternatives (Plausible, Pirsch,
Openpanel, GoAccess), GDPR considerations, and a comparison table to
help users choose the right analytics provider.
- The configuration documentation now references analytics setup and
related configuration options.
[[1]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L180-R252)
[[2]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L479-R550)
These updates collectively make the documentation more comprehensive,
actionable, and user-friendly for both new and advanced users.
**References:**
[[1]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L24-R66)
[[2]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L58-R110)
[[3]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L139-R185)
[[4]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L180-R252)
[[5]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L479-R550)
[[6]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L17-R58)
[[7]](diffhunk://#diff-0967e840631a541bb95e057e1c6d4884274cf56d5a217d7fee2eb7223b6b4c0dR1-R268)
[[8]](diffhunk://#diff-52f2a9488bfe4177d1f1d01120859dad0b3e2d087283ded68f72d47b4f183391L291-R291)
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Auto update markdown TOC
* Added copilot instructions, AGENTS.md, improved README files (#3486)
This pull request introduces several documentation improvements and adds
comprehensive Copilot and agent instruction files to the al-folio
repository. The most significant changes are the addition of
repository-wide and path-specific Copilot instructions, updates to agent
documentation to reference these instructions, and improvements to the
documentation structure and clarity regarding file purposes and
workflows.
**Copilot and Agent Instruction Enhancements:**
- Added a new `.github/copilot-instructions.md` file providing detailed,
repository-wide setup, build, CI/CD, troubleshooting, and file format
guidance for Copilot coding agents.
- Introduced `.github/instructions/bibtex-bibliography.instructions.md`
with specific instructions for editing and validating BibTeX files,
including custom keywords, formatting rules, and integration with
Jekyll-Scholar.
- Updated agent documentation files (`customize.agent.md`,
`docs.agent.md`) to reference the new Copilot instruction files and
explain their purpose and usage for both repository-wide and
path-specific scenarios.
[[1]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L57-R65)
[[2]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L107-R122)
[[3]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L49-R51)
[[4]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L106-R137)
**Documentation Structure and Clarity Improvements:**
- Clarified and reorganized the documentation file list in agent files,
removing references to deprecated or merged files (e.g.,
`MAINTENANCE.md`, `ACCESSIBILITY.md`) and updating descriptions to
reflect current usage.
[[1]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L57-R65)
[[2]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L21-R21)
[[3]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L106-R137)
- Enhanced documentation on the purpose and application of each
documentation file, and added detailed explanations of Copilot
instruction files and their role in project development.
**Workflow and Validation Updates:**
- Updated references and descriptions for GitHub Actions workflows in
agent documentation to include the Copilot environment setup and clarify
pre-commit and CI/CD requirements.
[[1]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L57-R65)
[[2]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L49-R51)
- Corrected references for accessibility guidance, now directing users
to `TROUBLESHOOTING.md` instead of the removed `ACCESSIBILITY.md`.
These changes collectively improve the onboarding experience for both
human contributors and AI agents, ensuring consistent adherence to
project conventions and reducing errors.
**References:**
[[1]](diffhunk://#diff-227c2c26cb2ee0ce0f46a320fc48fbcbdf21801a57f59161b1d0861e8aad55f5R1-R253)
[[2]](diffhunk://#diff-6fd2827fb8d9c2dd6dc973572201853487ecbbd1120b00425d4f1c21dfdcf35fR1-R174)
[[3]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L57-R65)
[[4]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L107-R122)
[[5]](diffhunk://#diff-15864f2655921f50a97689076e3b8feba0da320463750845be6a76eb2e30bfe4L550-R562)
[[6]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L21-R21)
[[7]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L49-R51)
[[8]](diffhunk://#diff-961a46180ce568ce43c20bf7129dc5e4926a9aa4e0d7bc19926ca5ee3ff95cd0L106-R137)
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Auto update markdown TOC
* docs: correct email configuration location in QUICKSTART.md (#3489)
Fixes #3488
Updates `QUICKSTART.md` to correctly point to `_data/socials.yml` for
email configuration, as the `email` field is not present in
`_config.yml`.
* fix(devcontainer): remove broken yarn apt source to fix build (#3490)
This change introduces a Dockerfile to the devcontainer configuration
that removes the broken Yarn repository from `/etc/apt/sources.list.d/`.
This prevents `apt-get update` from failing due to an expired or missing
GPG key for the Yarn repository.
Fixes #3487
* Improve AGENTS.md structure
Removed duplicate quick links for coding agents and customization.
* fix: CV rendering failure without Volunteer field (#3479)
Fixes #3478
* fix tikzjax (#3477)
Fixes #3216 – TikZJax not working.
1. Changing SHA simply doesn't work, `window.tikzjax` is undefined and
it doesn't render anything.
2. I switched to the JS distributed by
[benrbray/tikzjax](https://github.com/benrbray/tikzjax/tree/develop),
added under `assets.js` to prevent future issues.
3. Documents now require to start with `\begin{document}`, should be a
simple fix.
<img width="789" height="341" alt="Screenshot 2026-01-24 at 1 10 39 PM"
src="https://github.com/user-attachments/assets/8272471d-df94-4118-a726-00ed09dcf1e8"
/>
<img width="780" height="380" alt="Screenshot 2026-01-24 at 1 06 13 PM"
src="https://github.com/user-attachments/assets/11284661-de15-4d57-a1d9-4959f562f826"
/>
* Fix #2598, shift to last_modified_at instead of last_updated. (#3493)
Use `last_modified_at` rather than `last_updated`. So that the
jekyll-sitemap plugin automatically looks for the standard
`last_modified_at` front matter field to generate the `<lastmod>` tag in
your `sitemap.xml`.
It fixes [#2598](https://github.com/alshedivat/al-folio/issues/2598)
Also, it preserves backward compatibility, as the updated metadata logic
prioritizes the `page.last_modified_at`, and defaults to
`page.last_updated`.
* Making Gemini and Claude configuration files point to AGENTS.md (#3494)
This pull request updates project documentation to clarify and
standardize the development workflow, Git practices, and troubleshooting
resources. The main changes include adding a dedicated Git workflow
guide and reorganizing the `AGENTS.md` file for better clarity and
usability.
**Documentation and Workflow Improvements:**
* Added a new `.github/GIT_WORKFLOW.md` file detailing commit message
conventions, types, and best practices for staging and ignoring files.
* Reorganized and clarified the pre-commit checklist and local
development instructions in `AGENTS.md`, emphasizing Docker usage and
proper code formatting.
* Updated the section on configuration and troubleshooting in
`AGENTS.md` to better direct users to relevant resources and removed
redundant or outdated instructions.
[[1]](diffhunk://#diff-a54ff182c7e8acf56acfd6e4b9c3ff41e2c41a31c9b211b2deb9df75d9a478f9L57-R58)
[[2]](diffhunk://#diff-a54ff182c7e8acf56acfd6e4b9c3ff41e2c41a31c9b211b2deb9df75d9a478f9L100-R74)
**Configuration and Context Updates:**
* Added a `.gemini/settings.json` file to define context files for
Gemini agent operations, ensuring relevant documentation is available
for automation tools.
* Created `CLAUDE.md` file pointing to `AGENTS.md`.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Enhance documentation for GitHub Copilot agents
Added CLAUDE.md file for AI assistant integration and updated Copilot agents description.
* Fix Gemini settings
* Added information about creating custom metadata for collections
* Update Google Scholar citations
* Add GDPR-compliant cookie consent with analytics blocking (#3492)
Implements cookie consent using vanilla-cookieconsent v3 to comply with
GDPR requirements. Analytics scripts are blocked until user consent is
obtained.
## Changes
**Library Integration**
- Added `vanilla-cookieconsent@3.1.0` to `_config.yml` third-party
libraries with SRI hashes
- Created `_scripts/cookie-consent-setup.js` with consent modal and
settings configuration
- Added CSS/JS includes in `_includes/head.liquid` and
`_includes/scripts.liquid`
**Analytics Blocking**
- Modified analytics scripts in `scripts.liquid` and
`distill_scripts.liquid` to use conditional `type="text/plain"
data-category="analytics"` when consent is disabled
- Blocks Google Analytics, Cronitor, Pirsch, and OpenPanel until consent
granted
- Library automatically converts blocked scripts to executable on user
acceptance
**Configuration**
- Added `enable_cookie_consent` flag (default: `false`)
- Cookie categories: `necessary` (always on), `analytics` (optional)
- 182-day cookie expiration, auto-clear on rejection
## Implementation
```liquid
{% if site.enable_cookie_consent %}
<script type="text/plain" data-category="analytics" async src="...gtag.js"></script>
{% else %}
<script async src="...gtag.js"></script>
{% endif %}
```
Enable in `_config.yml`:
```yaml
enable_cookie_consent: true
```
## Screenshots
**Consent Modal**

**Settings Modal**

> [!WARNING]
>
> <details>
> <summary>Firewall rules blocked me from connecting to one or more
addresses (expand for details)</summary>
>
> #### I tried to connect to the following addresses, but was blocked by
firewall rules:
>
> - `cdn.jsdelivr.net`
> - Triggering command: `/usr/bin/curl curl -s REDACTED` (dns block)
> - `cookieconsent.orestbida.com`
> - Triggering command:
`/home/REDACTED/work/_temp/ghcca-node/node/bin/node
/home/REDACTED/work/_temp/ghcca-node/node/bin/node --enable-source-maps
/home/REDACTED/work/_temp/copilot-developer-action-main/dist/index.js`
(dns block)
> - `medium.com`
> - Triggering command: `/usr/local/bin/ruby ruby
/usr/local/bundle/bin/bundle exec jekyll serve --watch --port=8080
--host=0.0.0.0 --livereload --verbose --trace --force_polling s
6_64-linux /etc/locale.gen by/backward -binutils_2.44-3grep .deb eb
/systemd-sysctl` (dns block)
> - `publish.twitter.com`
> - Triggering command: `/usr/local/bin/ruby ruby
/usr/local/bundle/bin/bundle exec jekyll serve --watch --port=8080
--host=0.0.0.0 --livereload --verbose --trace --force_polling lude��
lude/ruby-4.0.0//run/containerd/io.containerd.runtime.v2.task/moby/a4760212ce4eda97e32b6dfa4d3ea/usr/sbin/iptables
r/runc-log.json f8_range lude r-strong E r/wc7in709a54d7hshow` (dns
block)
>
> If you need me to access, download, or install something from one of
these locations, you can either:
>
> - Configure [Actions setup
steps](https://gh.io/copilot/actions-setup-steps) to set up my
environment, which run before the firewall is enabled
> - Add the appropriate URLs or hosts to the custom allowlist in this
repository's [Copilot coding agent
settings](https://github.com/alshedivat/al-folio/settings/copilot/coding_agent)
(admins only)
>
> </details>
<!-- START COPILOT ORIGINAL PROMPT -->
<details>
<summary>Original prompt</summary>
>
> ----
>
> *This section details on the original issue you should resolve*
>
> <issue_title>GDPR compliant cookie consent dialog</issue_title>
> <issue_description>Hi,
>
> since I am from Europe and want my site to be accessed by EU citizens
I need to ask users if they are ok with the use of cookies. Adding a
dialogue by default that that asks the user before any cookies /
localStorage are used would be nice.
>
> I have integrated the dialog from
[https://www.cookieconsent.com/](https://www.cookieconsent.com/) on [my
website](http://hschwane.github.io) and am happy to file a PR if you are
interested. However It is not shown directly at the top, but below the
menu bar for some reason. Not sure how to fix that.
> </issue_description>
>
> <agent_instructions>Implement this using cookie consent dialog from
https://github.com/orestbida/cookieconsent. The documentation is
available at
https://cookieconsent.orestbida.com/essential/getting-started.html.</agent_instructions>
>
> ## Comments on the Issue (you are @copilot in this section)
>
> <comments>
> <comment_new><author>@alshedivat</author><body>
> @hschwane, thanks for pointing this out. It's would be great if you
could send a PR.
>
> To answer your question about positioning, the menu bar has the
absolute position at the top of the page and keeps moving with
scrolling. You can change that behavior in `_config.yml` by setting
`navbar_fixed: false` (see [line
27](https://github.com/alshedivat/al-folio/blob/master/_config.yml#L27)).
If you send a PR with basic functionality, I can help with adjusting the
styles a bit. Thanks!</body></comment_new>
> <comment_new><author>@alshedivat</author><body>
> Just catching up on this discussion.
>
> @hschwane, thanks for providing an implementation based on
`ihavecookies`! I looked through alshedivat/al-folio#223. It seems like
to be able to correctly (un)block different types of cookies (all of
which are third-party cookies) requires adding quite a bit of extra
JavaScript (including adding it directly to posts or pages in some
cases, e.g., when posts embed youtube videos or other external content).
This approach will put some extra burden on contributors and maintainers
of al-folio down the line.
>
> By the way, the dialog from https://www.cookieconsent.com/ is similar
in that sense as it requires to manually add ALL scripts that use
cookies. So, if someone contributes a new feature to al-folio that uses
cookies, the contributor would have to go and update the cookie consent
dialog as well (or edit quite a bit of JS if `ihavecookies` is used).
>
> Thinking about this more, I currently see only three options:
> 1. If we want to have cookie consent as a core part of al-folio (which
can be easily enabled or disabled), it needs to be a service that
automatically identifies and blocks cookies, without putting an extra
burden on the contributors or maintainers. The hosted version of [Cookie
Consent by Osano](https://www.osano.com/features/consent-management) is
an example.
> 2. Another option is to provide a very minimalistic cookie consent
dialog which simply says that the website uses cookies, without an
option to opt-in or opt-out (e.g., see the open-source edition of
[Osano](https://www.osano.com/cookieconsent/download/)).
> 3. Finally, not have cookie consent as part of al-folio, and make the
user responsible for figuring out whether they need a consent dialog and
which service to use.
>
> Let me know what you think.</body></comment_new>
> <comment_new><author>@alshedivat</author><body>
> the best way to add GDPR compliant cookie consent is using
https://github.com/orestbida/cookieconsent</body></comment_new>
> </comments>
>
</details>
> **Custom agent used: customization_agent**
> Expert customization assistant for the al-folio Jekyll academic
website template
<!-- START COPILOT CODING AGENT SUFFIX -->
- Fixes alshedivat/al-folio#199
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/alshedivat/al-folio/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: george-gca <31376482+george-gca@users.noreply.github.com>
Co-authored-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Auto update markdown TOC
* Improve explanation of create from this template (#3499)
This pull request improves the documentation to clarify the recommended
way to create a new site using the al-folio template, emphasizing the
use of the "Use this template" button instead of forking. It explains
the differences between the two approaches, highlights common pitfalls
with forking, and provides guidance for users who have already forked
the repository.
Documentation improvements regarding repository creation:
* Added a prominent section in `README.md` explaining why "Use this
template" is preferred over forking, including step-by-step instructions
and advice for users who have already forked.
* Updated `QUICKSTART.md` to strongly recommend using the "Use this
template" button, clarified the steps for creating a new repository, and
included tips for users who have already forked by mistake.
* Added a new section in `INSTALL.md` detailing the differences between
using the template and forking, common pitfalls, and best practices for
contributing.
Signed-off-by: George Araújo <george.gcac@gmail.com>
* Auto update markdown TOC
* Update Google Scholar citations
* Added new research blog in README.md (#3522)
* Update Google Scholar citations
* Add link to personal page (laura wagner) in README (#3552)
Adding my personal academic website to the academics list
* Add Fukushima Lab to User community (Labs) (#3559)
This PR adds Fukushima Lab to the **User community** section in
`README.md` under **Labs**. Thank you for maintaining such a great and
inspiring website template.
Added link:
- https://kenji-fukushima-lab.github.io/
Co-authored-by: Kenji Fukushima <kf@MacBookPro.elecom>
* Update Google Scholar citations
* Update Google Scholar citations
* Update Google Scholar citations
* Update Google Scholar citations
* add vud.org to community list (#3575)
Add vud.org to community list.
* Added website of B. Choi (Update README.md) (#3569)
Hello, please add my academic website to the community page. Thank you
for maintaining this project.
* [Update] add workshop to README.md (#3585)
Add new workshop to README.md
* Update Google Scholar citations
* Update Google Scholar citations
* Update Google Scholar citations
* Update Google Scholar citations
* Add pranavraj575 website to README
* Add deden.id website to README
Please let my website be on the growing list! I'm Deden Habibi Ali
Alfathimy, a researcher in outer space politics, with personal website
https://deden.id using al-folio.
* Upgrade al-folio to v1.0 (#2968)
## Overview
This PR delivers the `v1.0` architecture and runtime upgrade for
`al-folio`.
`al-folio` moves from a monolithic theme repo to a **thin starter +
plugin ecosystem** model, while preserving visual identity and core
behavior.
## What this PR changes
### 1) Starter becomes orchestration-only
`al-folio` is now responsible for:
- starter wiring (`Gemfile`, `_config.yml`)
- sample/demo content
- user-facing docs
- visual regression and cross-plugin integration tests
Component/runtime ownership is moved to dedicated gems.
### 2) Runtime and feature ownership split into plugins
`al_folio_core` now provides shared runtime/layout primitives and
contracts, and delegates feature modules to owning gems.
Key plugin ownership in v1:
- `al_folio_core`: core theme runtime/contracts
- `al_folio_distill`: Distill layouts/runtime
- `al_folio_cv`: CV rendering
- `al_search`: search runtime and modal behavior
- `al_icons`: icon runtime (Font Awesome, Academicons, Scholar Icons)
- `al_cookie`: cookie-consent runtime
- `al_img_tools`: image/gallery/lightbox tooling
- `al_math`: math/TikZ runtime integration
- additional `al-*` plugins for
analytics/charts/citations/comments/newsletter/external posts/upgrade
tooling
### 3) Styling/runtime modernization
- Tailwind-first v1 runtime is established.
- Legacy Bootstrap behavior is isolated behind optional
`al_folio_bootstrap_compat` for migration windows.
- jQuery-dependent runtime paths are removed/replaced in plugin-owned
implementations.
### 4) Test ownership policy is enforced
- `al-folio` keeps only starter-level integration and visual integrity
checks.
- Component correctness tests are owned by the corresponding plugin
repos.
This mirrors runtime ownership and reduces duplication/drift.
### 5) Upgrade and migration workflow
`al_folio_upgrade` is integrated for audit/apply/report migration flows,
including:
- config contract checks
- ownership drift detection
- local override drift audit/diff/acknowledgement workflow
- legacy marker detection
- plugin wiring validation
### 6) Documentation and contributor model for v1
Docs are updated to reflect modular v1 behavior and contribution
routing.
New governance additions include:
- plugin ownership/boundary guidance (`docs/BOUNDARIES.md`)
- plugin naming convention (theme-coupled vs reusable plugin tracks)
- featured-vs-bundled plugin distinction
- plugin catalog source + page (`_data/featured_plugins.yml`,
`_pages/plugins.md`)
- plugin feature proposal issue template
- PR template updates for ownership routing
- agent-facing setup and migration skills
## Compatibility and migration notes
- Plugin integration in starter is via `Gemfile` + `_config.yml`.
- `al-folio` starter intentionally does not use a gemspec in v1.
- Transitional Bootstrap compatibility remains available via
`al_folio_bootstrap_compat`.
- Existing front-matter contracts are preserved where possible; runtime
implementations are now plugin-owned.
- Customized sites can track local override drift with `bundle exec
al-folio upgrade overrides audit` and `.al-folio-overrides.yml`.
## Validation strategy in this PR
- visual parity checks against the v0.16.3 baseline
- starter integration suites (comments, plugin toggles, distill, compat,
upgrade CLI)
- style contract checks and repository linting
## Scope intent
This is the foundational v1 architecture PR.
Post-merge feature work should generally target owning plugin repos
first, with `al-folio` limited to starter wiring, docs, examples, and
integration/visual validation.
_Written by Codex on behalf of @alshedivat._
* Fix broken navbar: stop double-minifying Tailwind CSS in production (#3634)
## Summary
Fixes the broken navigation bar on the live demo
(https://alshedivat.github.io/al-folio/) introduced by the v1.0 upgrade
(#2968), plus two related production/deploy-only issues found while
auditing for the same class of bug.
## Root cause of the navbar break
The v1.0 upgrade made the site **Tailwind-first**. The deploy builds
with `JEKYLL_ENV=production`, which activates **jekyll-minifier**. Its
CSS compressor (`cssminify2`) mangles Tailwind v4 spacing tokens
**inside `calc()`**:
```
calc(var(--spacing)*0) -> calc(var( - - spacing)*0) // invalid
```
`cssminify2` treats the `--` inside `calc(var(--…))` as minus operators
and inserts spaces, producing an invalid custom-property name. This
silently breaks **every** spacing/positioning utility — most visibly
`.fixed-top`, so the fixed navbar is no longer pinned (`top/left/right`
drop out) and renders incorrectly. On the live site this affects 33
`var(--spacing)` references in `tailwind.css`.
It only manifests in **production**: a local `bundle exec jekyll serve`
is development mode (minifier off), and the `visual-regression` workflow
also serves in dev mode — so neither caught it.
### Why this fix
`tailwind.css` is already minified by al_folio_core's Tailwind build,
and `main.css` is compiled by Sass with `style: compressed`.
Re-minifying them with `cssminify2` adds nothing (it actually makes
`tailwind.css` ~315 bytes **larger**) and only introduces this
corruption. So we disable redundant CSS minification, mirroring the
existing `compress_javascript: false` (terser handles JS).
Verified end-to-end:
- The gem source `tailwind.css` has 82 intact `var(--spacing)`;
`cssminify2` corrupts all 82.
- jekyll-minifier (`lib/jekyll-minifier.rb:1061`): `return
output_file(path, content) unless config.compress_css?` — with
`compress_css: false`, `.css` files are written verbatim.
- A real `JEKYLL_ENV=production` build now emits `tailwind.css` with 82
intact `var(--spacing)`, 0 corrupted, and
`.fixed-top{...;position:fixed}` intact.
- PurgeCSS (the next deploy stage) preserves `calc(var(--spacing)*0)`
unchanged.
## Changes
1. **`_config.yml` — `jekyll-minifier.compress_css: false`** (the navbar
fix).
2. **`test/integration_css_minify.sh` + `unit-tests.yml`** — a
regression test that builds in **production mode** (the mode that
exposes this bug class) and asserts no `var( - - )` corruption, intact
`var(--spacing)`, a valid `.fixed-top`, and a non-empty `main.css`.
Passes with the fix; fails without it (83 corruptions). Closes the CI
blind spot that let this ship.
3. **`_config.yml` — drop dead `jekyll-minifier` exclude**
`assets/js/search/*.js`. That is a v0 path; in v1 the search runtime
ships under `assets/al_search/js/...`, so the glob matched nothing.
4. **`purgecss.config.js` — safelist `medium-zoom-overlay` /
`medium-zoom-image--opened`.** These classes are injected at runtime, so
they never appear in the static HTML PurgeCSS scans; their `z-index:999`
overlay rule was being purged on the deployed site, letting the
scroll-progress bar / ToC bleed through a zoomed image. Verified: the
rule survives purge with the safelist and is dropped without it.
## Broader audit — plugin fixes (released + pinned here)
I audited for the same bug class (regressions invisible to dev-mode
builds / leftovers from the v1 jQuery removal). The confirmed
plugin-owned issues were each fixed in their own repo, merged after
green CI, released to RubyGems, and pinned in this PR's `Gemfile`:
- **al_folio_core 1.0.10**
([#18](https://github.com/al-org-dev/al-folio-core/pull/18)) —
`main.css` cache-bust was permanently the empty-string MD5
(`bust_css_cache` globbed a non-existent `assets/_sass`) → stale CSS
after deploys; `bib.liquid` "N more authors" used `$(this)` → threw and
never expanded; `figure.liquid` `onerror` used `$()` → dead broken-image
fallback.
- **al_charts 1.0.1**
([#7](https://github.com/al-org-dev/al-charts/pull/7)) —
`chartjs-setup.js` was jQuery → `chartjs` charts threw `$ is not
defined` and never rendered.
- **al_folio_distill 1.0.2**
([#2](https://github.com/al-org-dev/al-folio-distill/pull/2)) —
`overrides.js` top-level `$(window).on("load")` → distill
footnote/citation theming never applied + console error.
Verified end-to-end with a production build after the pin bumps:
`main.css` now cache-busts to a real hash (`9278fad1…`, not
`d41d8cd9…`), zero jQuery `$(` in the built HTML, and the Tailwind
spacing utilities / `.fixed-top` navbar are intact.
Also noted (not fixed here): the `visual-regression` workflow only
renders in dev mode, so it can't catch production-only CSS regressions —
`test/integration_css_minify.sh` is the immediate guard; a production
screenshot leg would be a fuller backstop.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs: expand CLAUDE.md with the v1 plugin-ecosystem architecture (#3635)
## Summary
Expands `CLAUDE.md` from a bare `@AGENTS.md` import into a useful entry
point for coding agents, while **keeping** that import so `AGENTS.md`'s
ownership boundaries, validated command set, and PR-routing rules still
flow in (and stay the short, ecosystem-neutral shared file).
The added content is the cross-repo "big picture" that no single file in
this repo currently documents — gathered by reading the starter
internals plus all 16 `al-*` / `al_folio_*` plugin gems:
- **al_folio_core hub + delegation map** — a `wrapper → tag → gem` table
for every bundled plugin, so a runtime change can be routed to the
owning repo in one lookup.
- **Sibling-repos-on-disk** layout and how to point the `Gemfile` at a
local gem checkout (`path:`) to test a gem fix against the site.
- **Cross-repo invariants** — two-layer feature gating (config flag
*and* front matter), `AssetsGenerator` build-time asset injection, the
`Gemfile` ↔ `_config.yml` plugin-list sync, the v1 config contract
(enforced by core's `:after_init` and `al-folio upgrade audit`),
`.al-folio-overrides.yml` drift tracking, and the time-boxed
bootstrap-compat path.
- **Daily dev loop** that `AGENTS.md` omits (`jekyll serve`, single
integration test, snapshot refresh, upgrade subcommands).
- The v1 Docker `/tmp/_site` rationale and the `style_contract.js`
boundary that fails CI if runtime/build files leak into the starter.
Every specific claim (gem versions, tag names, config keys) is grounded
in the actual repos. Prettier-clean.
> Split out from the navbar-fix PR (#3634) per request; this PR is
docs-only and independent.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Fix links (#3628)
## Summary
In the "User community" README section several links didn't work
anymore. I updated them where I was able to find a new link from the
same person, and removed the ones where I didn't find a new link.
## Ownership Routing
- [x] I confirmed this PR targets the correct repo based on
`docs/BOUNDARIES.md`.
- [x] This PR only changes starter-owned scope (`al-folio`) **or** I am
porting a routed change and linked the owning repo issue/PR.
## Plugin Ecosystem (if applicable)
- [x] Not applicable
- [ ] This PR proposes a plugin for **featured-only** listing.
- [ ] This PR proposes a plugin for **bundled** starter inclusion.
## Starter Wiring Changes
- [x] Not applicable
- [ ] Updated `Gemfile` dependency wiring.
- [ ] Updated `_config.yml` plugin activation/config.
- [ ] Updated `_data/featured_plugins.yml` metadata.
## Validation
- [x] `npm ci`
- [ ] `bundle exec jekyll build`
- [x] `npm run lint:prettier`
- [x] `npm run lint:style-contract`
- [ ] Integration tests (`test/integration_*.sh`) as needed
- [ ] Visual tests (`npm run test:visual`) as needed
* Fix visual regressions: broken repo stat cards and unstyled af-popover/tooltip (#3636)
## What's broken on the demo site
A full-page screenshot audit of every page on
https://alshedivat.github.io/al-folio/ surfaced two user-visible bugs
introduced or exposed by the v1 upgrade.
### Bug 1 — Repositories page: all stat cards show broken alt-text
(HIGH)
Both external services are currently unavailable:
- `github-readme-stats.vercel.app` → HTTP 503 `DEPLOYMENT_PAUSED`
- `github-profile-trophy.vercel.app` → HTTP 402
Every `<img>` on the repositories page fails to load, rendering as a
list of broken-image alt-text strings. The templates had no `onerror`
fallback.
**Fix (in al_folio_core):**
`onerror="this.closest('.repo').style.display='none'"` on every
stat-card image in `repo.liquid`, `repo_user.liquid`, and
`repo_trophies.liquid`. When a service is unavailable the entire card
hides gracefully; when it comes back up cards render normally.
### Bug 2 — `.af-popover` / `.af-tooltip` completely unstyled (MEDIUM)
`tooltips-setup.js` (active by default, since bootstrap-compat is
disabled) creates `.af-popover` and `.af-tooltip` elements as its
vanilla fallback — for example when hovering the author-info circle icon
(ⓘ) on the publications page. These class names had **no CSS rules at
all** in `al_folio_core`: no `position`, no styling, no `z-index`. The
tooltip/popover appeared as invisible, unpositioned text nodes appended
to `document.body`.
(The theme's `_utilities.scss` only defined `.popover` — Bootstrap's
class — which is irrelevant without bootstrap-compat loaded.)
**Fix (in al_folio_core):** Added `position: absolute`, `z-index:
1070/1080`, and theme-color styling to both classes. The purgecss
safelist in al-folio already protects both names so they survive the
deploy pipeline.
## Changes
- `Gemfile` / `Gemfile.lock`: bump `al_folio_core` 1.0.10 → 1.0.11 ([PR
#19](https://github.com/al-org-dev/al-folio-core/pull/19), now merged
and released)
## Scope
All other pages screenshotted look correct. No other CSS/layout
regressions were found beyond these two. The screenshot audit also
confirmed:
- The `var(--spacing)` Tailwind fix from #3634 is working correctly in
production.
- `main.css` cache-bust hash (`9278fad1…`) is stable and non-empty.
- All blog posts, CV, teaching, people, projects, books pages render as
expected.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Add a link to my lab website in user community section (#3645)
Add a link to my lab website in the user community of README.
## Summary
Many thanks to the authors and contributors of this repo. I'm glad to
add my lab's website in the user community section of README.
## Ownership Routing
- [x] I confirmed this PR targets the correct repo based on
`docs/BOUNDARIES.md`.
- [ ] This PR only changes starter-owned scope (`al-folio`) **or** I am
porting a routed change and linked the owning repo issue/PR.
Owning repo (if not starter): <!-- e.g., al-org-dev/al-folio-core -->
Related issue/PR: <!-- link -->
## Plugin Ecosystem (if applicable)
- [x] Not applicable
- [ ] This PR proposes a plugin for **featured-only** listing.
- [ ] This PR proposes a plugin for **bundled** starter inclusion.
If plugin-related, provide:
- Plugin repo URL:
- Gem name:
- Jekyll plugin id:
- Compatibility (`al_folio_min`/`al_folio_max`):
- Demo page/post path:
- Maintainer contact:
## Starter Wiring Changes
- [x] Not applicable
- [ ] Updated `Gemfile` dependency wiring.
- [ ] Updated `_config.yml` plugin activation/config.
- [ ] Updated `_data/featured_plugins.yml` metadata.
## Validation
- [ ] `npm ci`
- [ ] `bundle exec jekyll build`
- [ ] `npm run lint:prettier`
- [ ] `npm run lint:style-contract`
- [ ] Integration tests (`test/integration_*.sh`) as needed
- [ ] Visual tests (`npm run test:visual`) as needed
## Notes
Compatibility, migration implications, and follow-ups:
* Update Google Scholar citations
* Update Google Scholar citations
* Update Google Scholar citations
* Update Google Scholar citations
* Update Google Scholar citations
* Update Google Scholar citations
* Bump nokogiri from 1.19.3 to 1.19.4 (#3653)
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.19.3
to 1.19.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/sparklemotion/nokogiri/releases">nokogiri's
releases</a>.</em></p>
<blockquote>
<h2>v1.19.4 / 2026-06-18</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] (Low) Fixed a possible invalid memory read when
<code>XML::Node#initialize_copy_with_args</code> is called with an
argument that is not a <code>Node</code>. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-g9g8-vgvw-g3vf">GHSA-g9g8-vgvw-g3vf</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free when an
<code>XML::XPathContext</code> is used after its source document has
been garbage collected. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-p67v-3w7g-wjg7">GHSA-p67v-3w7g-wjg7</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free during XInclude
processing via <code>Node#do_xinclude</code>. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-wfpw-mmfh-qq69">GHSA-wfpw-mmfh-qq69</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free when
<code>Document#root=</code> is assigned a non-element node. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-wjv4-x9w8-wm3h">GHSA-wjv4-x9w8-wm3h</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free when setting an
attribute value via <code>XML::Attr#value=</code> or
<code>#content=</code>. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-phwj-rprq-35pp">GHSA-phwj-rprq-35pp</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a null pointer dereference when methods are
called on uninitialized wrapper objects (e.g. via
<code>allocate</code>); these now raise instead of crashing the process.
See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-9cv2-cfxc-v4v2">GHSA-9cv2-cfxc-v4v2</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free when
<code>Document#encoding=</code> raises an exception. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-5v8h-3h3q-446p">GHSA-5v8h-3h3q-446p</a>
for more information.</li>
<li>[CRuby] (Medium) Fixed an out-of-bounds read in
<code>XML::NodeSet#[]</code> (alias <code>#slice</code>) when given a
large negative index. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-5prr-v3j2-97mh">GHSA-5prr-v3j2-97mh</a>
for more information.</li>
<li>[JRuby] (Low) <code>XML::Schema</code> now enforces the
<code>NONET</code> parse option, which Nokogiri enables by default. It
was not enforced on JRuby, so a schema parsed with default options could
still fetch external resources over the network, potentially enabling
SSRF or XXE attacks and bypassing the mitigation for CVE-2020-26247. See
<a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-8678-w3jw-xfc2">GHSA-8678-w3jw-xfc2</a>
for more information.</li>
</ul>
<!-- raw HTML omitted -->
<pre><code>1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
nokogiri-1.19.4-aarch64-linux-gnu.gem
35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
nokogiri-1.19.4-aarch64-linux-musl.gem
a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca
nokogiri-1.19.4-arm-linux-gnu.gem
588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb
nokogiri-1.19.4-arm-linux-musl.gem
a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527
nokogiri-1.19.4-arm64-darwin.gem
ce04b9e268c9626852231a48b49128ed52034f1ccb39484a6da3875491cd709e
nokogiri-1.19.4-java.gem
051da97b8eccfdb5444fed40246a35e10d7298b9efe759b4cd25455ea04c587e
nokogiri-1.19.4-x64-mingw-ucrt.gem
7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551
nokogiri-1.19.4-x86_64-darwin.gem
379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a
nokogiri-1.19.4-x86_64-linux-gnu.gem
17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b
nokogiri-1.19.4-x86_64-linux-musl.gem
50c951611c92bca05c51411aef45f1cbc50f2821c4802758c5c6d34696533ab5
nokogiri-1.19.4.gem
</code></pre>
<!-- raw HTML omitted -->
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md">nokogiri's
changelog</a>.</em></p>
<blockquote>
<h2>v1.19.4 / 2026-06-18</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] (Low) Fixed a possible invalid memory read when
<code>XML::Node#initialize_copy_with_args</code> is called with an
argument that is not a <code>Node</code>. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-g9g8-vgvw-g3vf">GHSA-g9g8-vgvw-g3vf</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free when an
<code>XML::XPathContext</code> is used after its source document has
been garbage collected. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-p67v-3w7g-wjg7">GHSA-p67v-3w7g-wjg7</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free during XInclude
processing via <code>Node#do_xinclude</code>. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-wfpw-mmfh-qq69">GHSA-wfpw-mmfh-qq69</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free when
<code>Document#root=</code> is assigned a non-element node. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-wjv4-x9w8-wm3h">GHSA-wjv4-x9w8-wm3h</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free when setting an
attribute value via <code>XML::Attr#value=</code> or
<code>#content=</code>. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-phwj-rprq-35pp">GHSA-phwj-rprq-35pp</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a null pointer dereference when methods are
called on uninitialized wrapper objects (e.g. via
<code>allocate</code>); these now raise instead of crashing the process.
See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-9cv2-cfxc-v4v2">GHSA-9cv2-cfxc-v4v2</a>
for more information.</li>
<li>[CRuby] (Low) Fixed a possible use-after-free when
<code>Document#encoding=</code> raises an exception. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-5v8h-3h3q-446p">GHSA-5v8h-3h3q-446p</a>
for more information.</li>
<li>[CRuby] (Medium) Fixed an out-of-bounds read in
<code>XML::NodeSet#[]</code> (alias <code>#slice</code>) when given a
large negative index. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-5prr-v3j2-97mh">GHSA-5prr-v3j2-97mh</a>
for more information.</li>
<li>[JRuby] (Low) <code>XML::Schema</code> now enforces the
<code>NONET</code> parse option, which Nokogiri enables by default. It
was not enforced on JRuby, so a schema parsed with default options could
still fetch external resources over the network, potentially enabling
SSRF or XXE attacks and bypassing the mitigation for CVE-2020-26247. See
<a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-8678-w3jw-xfc2">GHSA-8678-w3jw-xfc2</a>
for more information.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/8cfb9daae9ee4a0837508eab43c40fbc8c4138c9"><code>8cfb9da</code></a>
version bump to v1.19.4</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/a856d1e46bda04ef47a0bd2b9eefe86df1eb0bb2"><code>a856d1e</code></a>
fix: JRuby NONET bypass in XML::Schema (v1.19.x) (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3639">#3639</a>)</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/6a0aa1e7042ea58e10db713d4984c692a8db1a30"><code>6a0aa1e</code></a>
fix(CRuby): use-after-free in Document#encoding= when setter raises
(v1.19.x)...</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/f658a54ab2df58a3525967c339edce9649c197d4"><code>f658a54</code></a>
fix: JRuby NONET bypass in XML::Schema</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/39d26fea52cda8ac15313561824fd0bc018818aa"><code>39d26fe</code></a>
fix(CRuby): use-after-free in Document#encoding= when setter raises</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/04a09ddd67a4b573eb5c634655c2fb857e0436ad"><code>04a09dd</code></a>
fix(CRuby): out-of-bounds read in NodeSet#[] with large negative index
(v1.19...</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/7799fbd325f9f5e10fcccc77daaa903949a9d545"><code>7799fbd</code></a>
fix: avoid NPE on uninitialized XML::Node structs (v1.19.x) (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3645">#3645</a>)</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/ef19e1329c39f885e980b301f33fb233f3431d14"><code>ef19e13</code></a>
fix(CRuby): avoid UAF in XML::Attr#value= (v1.19.x) (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3644">#3644</a>)</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/5524fa97868ae26dfd74d700aba256b117262267"><code>5524fa9</code></a>
fix: <code>Document#root=</code> rejects non-element nodes (v1.19.x) (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3643">#3643</a>)</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/9891ad1092a265ae1cef220c377ebbabc9fde622"><code>9891ad1</code></a>
fix(CRuby): use-after-free in XPathContext document lifetime (v1.19.x)
(<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3641">#3641</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/sparklemotion/nokogiri/compare/v1.19.3...v1.19.4">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/alshedivat/al-folio/network/alerts).
</details>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump concurrent-ruby from 1.3.6 to 1.3.7 (#3654)
Bumps
[concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby)
from 1.3.6 to 1.3.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ruby-concurrency/concurrent-ruby/releases">concurrent-ruby's
releases</a>.</em></p>
<blockquote>
<h2>v1.3.7</h2>
<!-- raw HTML omitted -->
<p>There are 3 security fixes in this release, so updating is
recommended.
These security vulnerabilities are not very likely to be hit in practice
and have a corresponding <code>Low</code> severity score.</p>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<ul>
<li><a
href="https://github.com/ruby-concurrency/concurrent-ruby/security/advisories/GHSA-h8w8-99g7-qmvj">CVE-2026-54904</a>
<code>AtomicReference#update</code> livelocks when the stored value is
<code>Float::NAN</code>. Fix by <a
href="https://github.com/joshuay03"><code>@joshuay03</code></a> and <a
href="https://github.com/eregon"><code>@eregon</code></a></li>
<li><a
href="https://github.com/ruby-concurrency/concurrent-ruby/security/advisories/GHSA-wv3x-4vxv-whpp">CVE-2026-54905</a>
<code>ReentrantReadWriteLock</code> read-count overflow grants a write
lock without exclusivity. Fix by <a
href="https://github.com/joshuay03"><code>@joshuay03</code></a></li>
<li><a
href="https://github.com/ruby-concurrency/concurrent-ruby/security/advisories/GHSA-6wx8-w4f5-wwcr">CVE-2026-54906</a>
<code>ReadWriteLock</code> allows wrong-thread write release and stray
read-release counter corruption. Fix by <a
href="https://github.com/joshuay03"><code>@joshuay03</code></a></li>
<li>concurrent-ruby-ext: fix build on Darwin 32-bit by <a
href="https://github.com/barracuda156"><code>@barra…
Two visual regressions from the v1 migration, same root cause: pre-v1 al-folio
loaded bootstrap.min.css and mdb.min.css from a CDN. v1 dropped both for
al_folio_core's Tailwind layer, which reimplements many of the same class names —
some with different semantics.
Home page logo
The hero logo comes from the org profile README via `{% remote_include %}` in
_pages/about.md, as <img src="assets/img/cd/...svg" class="img-fluid theme-aware-logo">.
That `src` is relative to the *other* repo and 404s here; the image is only ever
visible because `.theme-aware-logo { content: url(...) }` swaps in a local
wordmark. Since the class lives in a remote file, grepping this repo finds
nothing, which is why the earlier pass mistook it for dead CSS and dropped it
with _sass/_themes.scss. Restored for dark, light and system themes. The
obsolete `#light-toggle-*` rules from that block stay gone — v1 renders the
tri-state toggle itself.
Team page rendered as boxed cards
_includes/team_member.liquid is written against Bootstrap 4 + MDB:
.h-100 Tailwind reads as 100 spacing units (25rem), not `height: 100%`
.card al_folio_core adds a background and drop shadow
.card-body gem padding (1.25rem) outranks the element's `.p-2`
.card-title inherits gem heading sizing (32px) rather than h5's 20px
Scoped to a new `.team-member` hook, pinned to the pre-migration computed
values. These utility names appear nowhere else in the repo.
Also restored site-wide, matching the values Bootstrap 4 served, because neither
al_folio_core nor al_folio_bootstrap_compat ships them: `.text-muted` (51 uses),
`.bg-transparent`, `.border-0`, and the `.row-cols-*` family (the team grid needs
row-cols-lg-5 for its 5-across layout).
Not enabling al_folio_bootstrap_compat: its utilities are Tailwind-scale, so it
would define `.h-100` as 25rem and make this worse, and its `.bg-transparent`
lacks the `!important` needed to beat `.card`.
Verified against the live site with matching computed styles: card background
transparent, no shadow, card-title 20px/400, card-body 8px padding, columns
flex 0 0 20%, text-muted #6c757d, and the logo resolving to the white wordmark
in dark/system and black in light.
Co-authored-by: Patrick Kastner <1919773+kastnerp@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Its source README is two lines (heading + one sentence) and the page template skips the first two lines via offset:2, so the page rendered with no body at all — just the title, an identical description, and the boilerplate Source link. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The page had no figure: the two embedded videos are GitHub user-attachment URLs that do not load off-site, and img: pointed at sampleFig2.png, which is only a card thumbnail and never rendered on the page itself. Uses the system architecture flow chart from the project repo's figures/ directory, converted from PDF to WebP (1600px, 98 KB) and committed to assets/img/theses/ alongside the other local thesis figures. It is now both the card thumbnail and the lead figure on the page. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kept for impact:
kastner2023gan 122 citations, Building and Environment
Kastner2021eddy3d 91 citations, Building and Environment (the lab's toolkit)
Kept for recency:
rahimi2025coupled 2025, Building and Environment
kastner2024towards 2024, Energy and Buildings
Added:
KARADAG2026107614 2026, Sustainable Cities and Society — newest work, and a
review, so it should accrue citations quickly
Dropped: dogan2025bottom and rahimi2025incorporating (each overlaps a retained
paper on UBEM and urban microclimate respectively) and DeSimone2021 (2 citations,
a COVID-era conference paper). This keeps the five topically distinct: ML wind
surrogates, simulation tooling, coupled microclimate physics, UBEM, and the
review.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
✅ Deploy Preview for sustainableurbansystems ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
main carried two publication commits that dev never had (the physics-informed GAN paper and #45). Both conflicts were in files dev had also touched: _bibliography/papers.bib — both sides edited the KARADAG2026107614 entry. Took main's `year = {2026}` (braced, consistent with every other field) and kept dev's `selected = {true}` and `google_scholar_id`, which main's copy predates. Field indentation normalised to the rest of the entry. _data/citations.yml — bot output from the Google Scholar workflow. Kept dev's: it is a month newer (2026-07-29 vs 2026-06-22), carries higher counts for the papers present on both sides (122 vs 113, 83 vs 81), and has an extra paper. The workflow regenerates this file anyway. main's `_layouts/about.liquid` change (dropping the "latest posts" heading) was already present in dev and merged as a no-op. Selected publications are unaffected: still the same five, and the two papers arriving from main come in unselected. Verified with a Docker build — clean, and all five render on the home page. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both workflows arrived with the v1.1 merge and test the al-folio starter template, not a site built from it. Both fail here by design and were blocking #52. unit-tests.yml ("Integration tests") runs `npm run lint:style-contract`, and test/style_contract.js rejects any repo that owns `_includes`, `_layouts` or `_sass`. That rule exists to keep the alshedivat/al-folio template free of files the gems now own. docs/BOUNDARIES.md is explicit that it does not apply downstream: "Local site overrides are still valid in your own site... This does not apply to the alshedivat/al-folio starter repo itself, which must not contain those directories — npm run lint:style-contract enforces that boundary." Our eight overrides are deliberate and recorded in .al-folio-overrides.yml, so this check can only ever fail. visual-regression.yml diffs the rendered site against a worktree of upstream tag v0.16.3, which does not exist in this fork (`fatal: invalid reference: v0.16.3`), and serves the baseline with `--baseurl /al-folio`, upstream's own path. It compares theme versions, which is not meaningful for a content site. Kept upgrade-check.yml — `al-folio upgrade audit` is genuinely useful here and passes. test/ stays in the tree but is excluded from the build. Also inherited and inapplicable, but left alone since they are not failing: release.yml (publishes al-folio's gems) and star-history.yml (regenerates the chart in upstream's README). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
Describe what changed and why.
Ownership Routing
docs/BOUNDARIES.md.al-folio) or I am porting a routed change and linked the owning repo issue/PR.Owning repo (if not starter):
Related issue/PR:
Plugin Ecosystem (if applicable)
If plugin-related, provide:
al_folio_min/al_folio_max):Starter Wiring Changes
Gemfiledependency wiring._config.ymlplugin activation/config._data/featured_plugins.ymlmetadata.Validation
npm cibundle exec jekyll buildnpm run lint:prettiernpm run lint:style-contracttest/integration_*.sh) as needednpm run test:visual) as neededNotes
Compatibility, migration implications, and follow-ups: