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>
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 -->
- Fixesalshedivat/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>
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>
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`.
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
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`.
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>
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>
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>
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>
### 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>
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>
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>
💡 **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>
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`
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>
## 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
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.
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"
/>
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>
Adds my personal academic website to the list of community pages in the
README. This helps other collaborators connect and see related work. The
link has been verified and follows the established format. Thank you for
the template it was very useful!
Thank you for the great template! I built a multilingual academic
homepage with it and added my link to the README. 😄
Co-authored-by: George <31376482+george-gca@users.noreply.github.com>
This PR fixes the issue #3252 which makes the `quoteblk` dazzling in
dark mode 🙈✨🥹. This is implemented by defining seperated color values of
`quoteblk`s in dark mode thus does not affect the colors in light mode.
This PR fixes an issue where long MathJax formulas in blog posts
overflowed horizontally and broke the layout.
* Added a small CSS rule to make MathJax formulas horizontally
scrollable instead of overflowing.
* Now, when a formula is wider than the container, users can scroll
horizontally without the page layout getting messed up.
**SCSS changes:**
```scss
mjx-container[jax="CHTML"][display="true"] {
overflow-x: auto;
}
```
**Testing:**
Verified that:
* Long formulas no longer push the layout wider than the viewport.
* Short formulas render as before.
Before:
https://github.com/user-attachments/assets/521b4967-cc1e-4e8b-b2fc-2c59314a8dee
After code fix:
https://github.com/user-attachments/assets/698811ff-d418-43eb-9261-5073105a3d9f
Live demo at: [PI Day -- bellards
formula](https://blog.faraji.info/math/Pi-day.html#bellards-formula-for-pi);
open with responsive design mode or with a mobile device.
Fixes issue #3243
Add CV PDF link to social icons
- Added CV icon to social media links section
- CV appears after LinkedIn icon in the contact section
- Uses academicons CV symbol for consistent academic styling
- Links to `/assets/pdf/CV_Schirren.pdf` and opens in new tab
- Updated `_includes/social.liquid` to handle `cv_pdf` field
- Updated `_data/socials.yml` with CV configuration
- Updated `_scripts/search.liquid.js` with cv search functionality
## Description
Fixes code block overflow issues by adding proper CSS overflow handling
and responsive design: Code blocks overflow and don't scale properly
#3228
## Changes Made to _base.scss
- Added `overflow-x`: auto to enable horizontal scrolling for long code
lines
- Added `white-space: pre` to preserve code formatting while allowing
horizontal scrolling
- Added `word-wrap: normal` to prevent wrapping of long lines
- Added `-webkit-overflow-scrolling: touch` for smooth iOS scrolling
- Added responsive font sizes for different breakpoints (576px, 400px,
and 768px)
- Applied fixes to `pre`, `code`, and `figure.highlight` elements
## Related Issue
Closes #3228
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: George Araújo <george.gcac@gmail.com>
Add some clarification on how to enable mermaid.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: George Araújo <george.gcac@gmail.com>
## Summary
This PR introduces an automated mechanism to update the citation count
for authors' publications.
- Inspired by @BernardoCama’s suggestion in #3150.
- Resolves#3150.
## Key Changes
- Adds an action to update publication citation counts.
- Note: This action creates a commit on the main branch.
- To trigger further GitHub Actions workflows from this commit, a
Personal Access Token (PAT) must be used (the default GitHub Actions
token cannot trigger subsequent workflows).
- Adds and manages citation data in `_data/citations.yml`.
- Adds and adapts `bin/update_scholar_citations.py` to handle citation
updates.
## Usage Examples
### Timeout
<img width="758" height="415" alt="image"
src="https://github.com/user-attachments/assets/0a330d35-b386-4670-8668-62701f2dc68b"
/>
### Success
<img width="1684" height="857" alt="image"
src="https://github.com/user-attachments/assets/44aa0558-e02a-4f00-b8cb-9e0ce16dd53c"
/>
Hello, the repository owner.
al-folio has been extremely amazing and very easy to set up—sincere
thanks to you and the contributors.
I've found one way that works on my end, where I can retain those very
useful page files, while I currently do not have enough content to fill
them in.
I might be wrong, but my site has been updating correctly.
I hope that I could be able to contribute to this customization guide
and provide a solution for those users who want to continuously use this
to display their content as they gain more professional experiences
later.
Thank you.
## Fix ToC Scroll-Spy Highlighting Issue
### Problem
When clicking on a ToC link in the sidebar, the page scrolls to the
correct section, but the ToC highlights the *previous* section instead
of the current one. The correct section only gets highlighted after
scrolling down a few pixels.
### Root Cause
The `scrollspy` in `assets/js/common.js` was initialized without an
offset parameter, so it didn't account for the fixed navigation header
height (~56px).
### Solution
Added `offset: 100` parameter to the scrollspy initialization to
properly detect when a section becomes visible, accounting for the
header and some buffer space.
### Changes
- Modified `assets/js/common.js`: Added offset parameter to scrollspy
configuration
### Testing
- [x] ToC correctly highlights the current section immediately after
clicking
- [x] Headings remain visible (not hidden under header)
- [x] Smooth scrolling works as expected
---------
Co-authored-by: Maruan <alshedivat@users.noreply.github.com>
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.8
to 1.18.9.
<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.18.9 / 2025-07-20</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Applied upstream libxml2 patches to address CVE-2025-6021,
CVE-2025-6170, CVE-2025-49794, CVE-2025-49795, and CVE-2025-49796. See
<a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-353f-x4gh-cqq8">GHSA-353f-x4gh-cqq8</a>
for more information.</li>
</ul>
<!-- raw HTML omitted -->
<pre><code>5bcfdf7aa8d1056a7ad5e52e1adffc64ef53d12d0724fbc6f458a3af1a4b9e32
nokogiri-1.18.9-aarch64-linux-gnu.gem
55e9e6ca46c4ad1715e313f407d8481d15be1e3b65d9f8e52ba1c124d01676a7
nokogiri-1.18.9-aarch64-linux-musl.gem
eea3f1f06463ff6309d3ff5b88033c4948d0da1ab3cc0a3a24f63c4d4a763979
nokogiri-1.18.9-arm64-darwin.gem
fe611ae65880e445a9c0f650d52327db239f3488626df4173c05beafd161d46e
nokogiri-1.18.9-arm-linux-gnu.gem
935605e14c0ba17da18d203922440bf6c0676c602659278d855d4622d756a324
nokogiri-1.18.9-arm-linux-musl.gem
ac5a7d93fd0e3cef388800b037407890882413feccca79eb0272a2715a82fa33
nokogiri-1.18.9.gem
1fe5b7aa4a054eda689a969bb4e03999960a6ea806582d327207d687168bceb5
nokogiri-1.18.9-java.gem
6b4fc1523aa0370c78653e38c94cb50e7f3ab786425de66ba7ad24222c1164a3
nokogiri-1.18.9-x64-mingw-ucrt.gem
e0d2deb03d3d7af8016e8c9df5ff4a7d692159cefb135cbb6a4109f265652348
nokogiri-1.18.9-x86_64-darwin.gem
b52f5defedc53d14f71eeaaf990da66b077e1918a2e13088b6a96d0230f44360
nokogiri-1.18.9-x86_64-linux-gnu.gem
e69359d6240c17e64cc9f43970d54f13bfc7b8cc516b819228f687e953425e69
nokogiri-1.18.9-x86_64-linux-musl.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.18.9 / 2025-07-20</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Applied upstream libxml2 patches to address CVE-2025-6021,
CVE-2025-6170, CVE-2025-49794, CVE-2025-49795, and CVE-2025-49796. See
<a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-353f-x4gh-cqq8">GHSA-353f-x4gh-cqq8</a>
for more information.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1dcd8ce303"><code>1dcd8ce</code></a>
version bump to v1.18.9</li>
<li><a
href="a05d2b44b9"><code>a05d2b4</code></a>
Apply upstream patches to address multiple vulnerabilities (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3526">#3526</a>)</li>
<li><a
href="947a55e87e"><code>947a55e</code></a>
Apply upstream patches to address multiple vulnerabilities</li>
<li>See full diff in <a
href="https://github.com/sparklemotion/nokogiri/compare/v1.18.8...v1.18.9">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
Partially addresses issue #3280.
Currently, the RSS feed icon in the socials section will show whenever
`rss_icon` in `data/_socials.yml` has a value --- **even if that value
is `false`**.
Unlike the other social settings, which are empty by default, for
`rss_icon` the default setting is `true`.
So it makes sense that a user might expect `rss_icon: false` to disable
said icon.
This PR just adds a check if the value is `false` and hides the icon if
so.
This reverts PR #2962. The inline script here is exactly the same as the
`/assets/js/google-analytics-setup.js` sourced on the following line, so
Google Analytics is being triggered twice.
It seems that #2962 originally added this because liquid templating of
the setup script didn't work (#3095). However, this was then properly
fixed in #3117.
Currently, the `site.giscus.theme` option is ignored because
`giscus.liquid` always computes the theme as light/dark based on the
current site theme. This PR allows users to configure separate light and
dark giscus themes in `_config.yml`, which will support dynamic updates
when switching between light, dark, or system themes.
Fixes#3269
## Description
This pull request adds support for Academia.edu profiles to the al-folio
social media integrations. Academia.edu is widely used by academics to
share and discover research,.
The changes are minimal and well-contained:
1. Added configuration options in socials.yml for Academia.edu with
organization and username fields
2. Updated social.liquid to handle the new social integration using the
Academicons font which already includes support for Academia.edu
## Changes
The implementation uses Academicons, which already includes the
Academia.edu icon (`ai-academia`), making this addition a natural fit
for the theme.
Unlike some other social media links that only require a single ID or
URL, Academia.edu profiles include both an organization (subdomain) and
a username in the format:
`https://[organization].academia.edu/[username]`. The implemented
solution supports this pattern by adding two parameters in the
socials.yml file.
## Why this is important
Academia.edu is a popular platform used by millions of researchers
worldwide to share their work. Adding support for it in the al-folio
theme aligns with the theme's academic focus and enhances its utility
for scholarly users. Many academics maintain both personal websites and
Academia.edu profiles, and being able to link between them provides
better visibility for their research.
The Academicons font already includes support for Academia.edu, so
adding this feature is a natural extension that makes use of existing
resources in the theme.
## Testing
The changes have been tested locally with a sample Academia.edu profile,
and the icon displays correctly alongside other social media icons. The
changes are minimal and don't affect any existing functionality.
## Screenshot
<img width="991" alt="image"
src="https://github.com/user-attachments/assets/15468b67-3002-44ce-aa25-22bc10766664"
/>
Hi,
I noticed some weird behavior when I turned dark mode off (some of the
text seemed to disappear, it became white :) )
I traced it to: {% if site.enable_darkmode %} in head.liquid
where some darkmode features are place before the if statement.
When putting it inside the if statement then the weird behavior was
solved; see the pull request here :)
Cheers,
Jan
This PR adds a few stylistic improvements to the distill-style blog
posts:
- Update distill blog post example to showcase sidenotes as an
alternative to styles in PR #3077
- Showcase equations in sidenotes (closes#1242)
- Add `overrides.js` to match footnotes and citation styles with global
theme styling
- Add "related posts" sections if enabled to distill style posts
- Add "giscus" section if enabled to distill style posts
https://github.com/user-attachments/assets/b19a9cd9-779d-4d89-a4fb-eb14fb384480
Hello Al-Folio Team,
I’ve been using the al-folio theme for my academic homepage and truly
appreciate how clean and elegant it is. I’ve just submitted a PR to add
my site (https://mehrdad-noori.github.io/) to the community list. Thank
you for all the hard work you put into this project!
Best regards,
Mehrdad
Thanks a lot for this great theme — I find it really clean and great for
hosting an academic website! I've added my customized academic page
(https://cbuelt.github.io/) to the community examples section, as
suggested. Thanks also for maintaining this project!
Fixes#3168. (Implemented by [jules.google](https://jules.google).)
This commit resolves issues with footnote and citation styling in
Distill posts, particularly ensuring that pop-up contents and the
numbers themselves respect the site's light/dark theme via shadow DOM
style definitions.
Key changes:
1. **`d-hover-box` Internal Styling (template.v2.js):**
The `<style>` tag within the `d-hover-box` component's template
in `assets/js/distillpub/template.v2.js` has been updated.
Styles for `.panel` (the main pop-up container) now define:
- `background-color: var(--global-card-bg-color);`
- `border: 1px solid var(--global-divider-color);`
- `color: var(--global-text-color);` (for default text)
- Links within the panel are styled with
`color: var(--global-theme-color);` and
`color: var(--global-hover-color);` on hover.
This ensures pop-up content is correctly themed from within its
shadow DOM.
2. **Footnote/Citation Number Color (template.v2.js):**
The hardcoded `hsla(206, 90%, 20%, 0.7)` color previously used for
footnote numbers (in `d-footnote` template) and citation numbers
(in `d-cite` template) in `assets/js/distillpub/template.v2.js`
has been replaced with `color: var(--global-theme-color);`.
3. **Cleaned `_sass/_distill.scss`:**
Removed the (now redundant) global CSS overrides for `d-hover-box`
from `_sass/_distill.scss`, as these styles are now correctly
encapsulated within the `d-hover-box` component itself.
These changes ensure that all aspects of Distill footnotes and
citations (numbers, pop-up background, pop-up text, and links within
pop-ups) are styled using theme-aware CSS variables, providing
correct visual appearance and readability in both light and dark modes.
---------
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.5
to 1.18.8.
<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.18.8 / 2025-04-21</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated to <a
href="https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.13.8">v2.13.8</a>
to address CVE-2025-32414 and CVE-2025-32415. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-5w6v-399v-w3cc">GHSA-5w6v-399v-w3cc</a>
for more information.</li>
</ul>
<!-- raw HTML omitted -->
<pre><code>36badd2eb281fca6214a5188e24a34399b15d89730639a068d12931e2adc210e
nokogiri-1.18.8-aarch64-linux-gnu.gem
664e0f9a77a7122a66d6c03abba7641ca610769a4728db55ee1706a0838b78a2
nokogiri-1.18.8-aarch64-linux-musl.gem
483b5b9fb33653f6f05cbe00d09ea315f268f0e707cfc809aa39b62993008212
nokogiri-1.18.8-arm64-darwin.gem
17de01ca3adf9f8e187883ed73c672344d3dbb3c260f88ffa1008e8dc255a28e
nokogiri-1.18.8-arm-linux-gnu.gem
6e6d7e71fc39572bd613a82d528cf54392c3de1ba5ce974f05c832b8187a040b
nokogiri-1.18.8-arm-linux-musl.gem
8c7464875d9ca7f71080c24c0db7bcaa3940e8be3c6fc4bcebccf8b9a0016365
nokogiri-1.18.8.gem
41002596960ff854198a20aaeb34cff0d445406d5ad85ba7ca9c3fd0c8f03de0
nokogiri-1.18.8-java.gem
11ab0f76772c5f2d718fb253fca5b74c6ef7628b72bbf8deba6ab1ffc93344cf
nokogiri-1.18.8-x64-mingw-ucrt.gem
024cdfe7d9ae3466bba6c06f348fb2a8395d9426b66a3c82f1961b907945cc0c
nokogiri-1.18.8-x86_64-darwin.gem
4a747875db873d18a2985ee2c320a6070c4a414ad629da625fbc58d1a20e5ecc
nokogiri-1.18.8-x86_64-linux-gnu.gem
ddd735fba49475a395b9ea793bb6474e3a3125b89960339604d08a5397de1165
nokogiri-1.18.8-x86_64-linux-musl.gem
</code></pre>
<h2>v1.18.7 / 2025-03-31</h2>
<h3>Dependencies</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated to <a
href="https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.13.7">v2.13.7</a>,
which is a bugfix release.</li>
</ul>
<!-- raw HTML omitted -->
<pre><code>57a064ab5440814a69a0e040817bd8154adea68a30d2ff2b3aa515a6a06dbb5f
nokogiri-1.18.7-aarch64-linux-gnu.gem
3e442dc5b69376e84288295fe37cbb890a21ad816a7e571e5e9967b3c1e30cd3
nokogiri-1.18.7-aarch64-linux-musl.gem
083abb2e9ed2646860f6b481a981485a658c6064caafaa81bf1cda1bada2e9d5
nokogiri-1.18.7-arm64-darwin.gem
337d9149deb5ae01022dff7c90f97bed81715fd586aacab0c5809ef933994c5e
nokogiri-1.18.7-arm-linux-gnu.gem
97a26edcc975f780a0822aaf7f7d7427c561067c1c9ee56bd3542960f0c28a6e
nokogiri-1.18.7-arm-linux-musl.gem
6b63ff5defe48f30d1d3b3122f65255ca91df2caf5378c6e0482ce73ff46fb31
nokogiri-1.18.7.gem
2cb83666f35619ec59d24d831bf492e49cfe27b112c222330ee929737f42f2eb
nokogiri-1.18.7-java.gem
681148fbc918aa5d54933d8b48aeb9462ab708d23409797ed750af961107f72b
nokogiri-1.18.7-x64-mingw-ucrt.gem
081d1aa517454ba3415304e2ea51fe411d6a3a809490d0c4aa42799cada417b7
nokogiri-1.18.7-x86_64-darwin.gem
3a0bf946eb2defde13d760f869b61bc8b0c18875afdd3cffa96543cfa3a18005
nokogiri-1.18.7-x86_64-linux-gnu.gem
9d83f8ec1fc37a305fa835d7ee61a4f37899e6ccc6dcb05be6645fa9797605af
nokogiri-1.18.7-x86_64-linux-musl.gem
</code></pre>
<h2>v1.18.6 / 2025-03-24</h2>
<h3>Fixed</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</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.18.8 / 2025-04-21</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated to <a
href="https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.13.8">v2.13.8</a>
to address CVE-2025-32414 and CVE-2025-32415. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-5w6v-399v-w3cc">GHSA-5w6v-399v-w3cc</a>
for more information.</li>
</ul>
<h2>v1.18.7 / 2025-03-31</h2>
<h3>Dependencies</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated to <a
href="https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.13.7">v2.13.7</a>,
which is a bugfix release.</li>
</ul>
<h2>v1.18.6 / 2025-03-24</h2>
<h3>Fixed</h3>
<ul>
<li>[JRuby] In HTML documents, <code>Node#attribute</code> now returns
the correct attribute. This has been broken, and returning
<code>nil</code>, since v1.17.0. (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3487">#3487</a>)
<a
href="https://github.com/flavorjones"><code>@flavorjones</code></a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9187f4af0d"><code>9187f4a</code></a>
version bump to v1.18.8</li>
<li><a
href="1deea041e3"><code>1deea04</code></a>
dep: libxml2 to v2.13.8 (branch <code>v1.18.x</code>) (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3509">#3509</a>)</li>
<li><a
href="6457fe6393"><code>6457fe6</code></a>
dep: libxml2 to v2.13.8</li>
<li><a
href="13e8aa4ef5"><code>13e8aa4</code></a>
version bump to v1.18.7</li>
<li><a
href="605699d271"><code>605699d</code></a>
dep: bump libxml2 to 2.13.7 (v1.18.x backport) (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3495">#3495</a>)</li>
<li><a
href="804e59038c"><code>804e590</code></a>
dep: bump libxml2 to 2.13.7</li>
<li><a
href="52bf15b62d"><code>52bf15b</code></a>
dep(dev): drop Rubocop from JRuby deps</li>
<li><a
href="189769d726"><code>189769d</code></a>
version bump to v1.18.6</li>
<li><a
href="de4982f0cc"><code>de4982f</code></a>
fix(jruby): Node#attribute in HTML documents (v1.18.x) (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3492">#3492</a>)</li>
<li><a
href="7d95b0f10c"><code>7d95b0f</code></a>
fix(jruby): Node#attribute in HTML documents</li>
<li>See full diff in <a
href="https://github.com/sparklemotion/nokogiri/compare/v1.18.5...v1.18.8">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
Hi!
I’m using the al-folio theme for my academic homepage and really
appreciate the work you’ve done — it’s clean, elegant, and super
helpful.
I’ve added my site (https://d-jiao.github.io) to the community list as
suggested. Thank you for maintaining this great project!
Best,
Dian Jiao (d-jiao)
Thank you for this slick theme! I've added my customized page to the
community examples section. My implementation includes a few subtle
tweaks that might inspire others, just as I found inspiration from
existing community examples.
Earlier there was a tag in the `_config.yml` file to exclude the posts
from the search results. I could no longer find that option and hence
modified the `search.liquid.js` file.
It basically checks if the `posts_in_search` tag is true or not.
Again, I saw this version problem with current version of our docker
image. Supposedly, there is some json package problem which I dealt
with.
But here is the overall solution to this problem for whoever is having
it.
---------
Co-authored-by: George <31376482+george-gca@users.noreply.github.com>
Bumps [json](https://github.com/ruby/json) from 2.10.1 to 2.10.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ruby/json/releases">json's
releases</a>.</em></p>
<blockquote>
<h2>v2.10.2</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix a potential crash in the C extension parser.</li>
<li>Raise a ParserError on all incomplete unicode escape sequence. This
was the behavior until <code>2.10.0</code> unadvertently changed
it.</li>
<li>Ensure document snippets that are included in parser errors don't
include truncated multibyte characters.</li>
<li>Ensure parser error snippets are valid UTF-8.</li>
<li>Fix <code>JSON::GeneratorError#detailed_message</code> on Ruby <
3.2</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/ruby/json/compare/v2.10.1...v2.10.2">https://github.com/ruby/json/compare/v2.10.1...v2.10.2</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ruby/json/blob/master/CHANGES.md">json's
changelog</a>.</em></p>
<blockquote>
<h3>2025-03-12 (2.10.2)</h3>
<ul>
<li>Fix a potential crash in the C extension parser.</li>
<li>Raise a ParserError on all incomplete unicode escape sequence. This
was the behavior until <code>2.10.0</code> unadvertently changed
it.</li>
<li>Ensure document snippets that are included in parser errors don't
include truncated multibyte characters.</li>
<li>Ensure parser error snippets are valid UTF-8.</li>
<li>Fix <code>JSON::GeneratorError#detailed_message</code> on Ruby <
3.2</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="350c1fd154"><code>350c1fd</code></a>
Release 2.10.2</li>
<li><a
href="c56db31f80"><code>c56db31</code></a>
Merge commit from fork</li>
<li><a
href="cf242d89a0"><code>cf242d8</code></a>
Fix potential out of bound read in
<code>json_string_unescape</code>.</li>
<li><a
href="57911f1ecf"><code>57911f1</code></a>
Merge pull request <a
href="https://redirect.github.com/ruby/json/issues/762">#762</a> from
byroot/invalid-escape</li>
<li><a
href="7d0637b9e6"><code>7d0637b</code></a>
Raise a ParserError on all incomplete unicode escape sequence.</li>
<li><a
href="c079793b76"><code>c079793</code></a>
Avoid fast-path IO writes when IO has ext enc</li>
<li><a
href="ac30b69c06"><code>ac30b69</code></a>
Merge pull request <a
href="https://redirect.github.com/ruby/json/issues/757">#757</a> from
rahim/fix-generator-error-no-method-error</li>
<li><a
href="2e015ff839"><code>2e015ff</code></a>
Fix JSON::GeneratorError#detailed_message with Ruby < 3.2</li>
<li><a
href="f3e113654f"><code>f3e1136</code></a>
Merge pull request <a
href="https://redirect.github.com/ruby/json/issues/756">#756</a> from
byroot/utf8-snippets</li>
<li><a
href="e144793b72"><code>e144793</code></a>
Ensure parser error snippets are valid UTF-8</li>
<li>Additional commits viewable in <a
href="https://github.com/ruby/json/compare/v2.10.1...v2.10.2">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.1
to 1.18.3.
<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.18.3 / 2025-02-18</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated to <a
href="https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.13.6">v2.13.6</a>
to address CVE-2025-24928 and CVE-2024-56171. See <a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-vvfq-8hwr-qm4m">GHSA-vvfq-8hwr-qm4m</a>
for more information.</li>
</ul>
<!-- raw HTML omitted -->
<pre><code>cab20305133078a8f6b60cf96311b48319175038cc7772e5ec586ff624cb7838
nokogiri-1.18.3-aarch64-linux-gnu.gem
acb256bb3213a180b1ed84a49c06d5d4c6c1da26f33bc9681f1fece4dab09a79
nokogiri-1.18.3-aarch64-linux-musl.gem
ce088965cd424b8e752d82087dcf017069d55791f157098ed1f671d966857610
nokogiri-1.18.3-arm64-darwin.gem
37b73a55e0d1e8a058a24abb16868903e81cb4773049739c532b864f87236b1b
nokogiri-1.18.3-arm-linux-gnu.gem
09407970cd13736cf87e975fae69c13e1178bab0313d07b35580ee4dd3650793
nokogiri-1.18.3-arm-linux-musl.gem
6b9fc3b14fd0cedd21f6cad8cf565123ba7401e56b5d0aec180c23cdca28fd5a
nokogiri-1.18.3.gem
236078c5f80ffc3d49c223fa98933d970543455403f9d672ca0aa5a6178a84fe
nokogiri-1.18.3-java.gem
216be1cb454c4657fc64747e5ae32b2ab4015843183766f238e4f4a62fb1f6be
nokogiri-1.18.3-x64-mingw-ucrt.gem
d729406bb5a7b1bbe7ed3c0922336dd2c46085ed444d6de2a0a4c33950a4edea
nokogiri-1.18.3-x86_64-darwin.gem
3c7ad5cee39855ed9c746065f39b584b9fd2aaff61df02d0f85ba8d671bbe497
nokogiri-1.18.3-x86_64-linux-gnu.gem
8aaecc22c0e5f12dac613e15f9a04059c3ec859d6f98f493cc831bd88fe8e731
nokogiri-1.18.3-x86_64-linux-musl.gem
</code></pre>
<!-- raw HTML omitted -->
<h2>v1.18.2 / 2024-01-19</h2>
<h3>Fixed</h3>
<ul>
<li>When performing a CSS selector query, an XML document's root
namespace declarations should not be applied to wildcard selectors
(<code>"*"</code>). Fixes a bug introduced in v1.17.0. (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3411">#3411</a>)
<a
href="https://github.com/flavorjones"><code>@flavorjones</code></a></li>
</ul>
<!-- raw HTML omitted -->
<pre><code>74e0f9a7487a30a2957f46c5113d58f836436b033c9906e0bc6fee9d8cdafabf
nokogiri-1.18.2-aarch64-linux-gnu.gem
99bcea596a80eaee99f2bae2596275641ea688262c1da32b4e90db6159e86477
nokogiri-1.18.2-aarch64-linux-musl.gem
8288ec7a296e2510ca9bd053c0c5989f11260f8c07bc3e9afbafa536f7077281
nokogiri-1.18.2-arm64-darwin.gem
6fb0246b69f2c589a69254e82bc2a40aa238c4f977fd7903e283341a92935729
nokogiri-1.18.2-arm-linux-gnu.gem
dcdd4d10ed2743f0d8c887825700c3a8506aea1aa415917ac50ccc01597c51a3
nokogiri-1.18.2-arm-linux-musl.gem
93791cfb33186fe077eb9e1b8a6855b5621e328f81f565334572fa398366f8bf
nokogiri-1.18.2.gem
eefdf9f0d6086173d3488cf7a736732ee13fb6674ef15643478c20502a67bf37
nokogiri-1.18.2-java.gem
894514572fa7503ce9210e51a7f8a9a35f34f154d6406cec1ac148c3ce1536a3
nokogiri-1.18.2-x64-mingw-ucrt.gem
7fca165e5ee87e9b6b3f1377180376afc0c8652ed2a3d761f472f0e3d3a1c651
nokogiri-1.18.2-x86_64-darwin.gem
9330ced4a976604865c2a76ce158e2bc608fa83999552e85a32ec06f85f427db
nokogiri-1.18.2-x86_64-linux-gnu.gem
1cd7786ed15c76958d6a8f9a864df6208fecd624c340eb4ed211fbea60328f02
nokogiri-1.18.2-x86_64-linux-musl.gem
</code></pre>
<!-- raw HTML omitted -->
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/sparklemotion/nokogiri/blob/v1.18.3/CHANGELOG.md">nokogiri's
changelog</a>.</em></p>
<blockquote>
<h2>v1.18.3 / 2025-02-18</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated <a
href="https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.13.6">v2.13.6</a>
to address CVE-2025-24928 and CVE-2024-56171. Nokogiri's maintainers
believe these vulnerabilities do not affect users of Nokogiri, but we
advise upgrading at your earliest convenience anyway.</li>
</ul>
<h2>v1.18.2 / 2024-01-19</h2>
<h3>Fixed</h3>
<ul>
<li>When performing a CSS selector query, an XML document's root
namespace declarations should not be applied to wildcard selectors
(<code>"*"</code>). Fixes a bug introduced in v1.17.0. (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3411">#3411</a>)
<a
href="https://github.com/flavorjones"><code>@flavorjones</code></a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="fd3ca2e22d"><code>fd3ca2e</code></a>
version bump to v1.18.3</li>
<li><a
href="a8c526adf1"><code>a8c526a</code></a>
dep: update libxml2 to v2.13.6 (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3437">#3437</a>)</li>
<li><a
href="0847cf8688"><code>0847cf8</code></a>
ci: tired of waiting for gnome mirrors</li>
<li><a
href="11945c82df"><code>11945c8</code></a>
dep: update libxml2 to v2.13.6</li>
<li><a
href="aa54fa5954"><code>aa54fa5</code></a>
version bump to v1.18.2</li>
<li><a
href="0fb5541c95"><code>0fb5541</code></a>
backport: fix(css-selector): default XML namespace should not be applied
to w...</li>
<li><a
href="8ef2e918e7"><code>8ef2e91</code></a>
ci: bump windows test images from "head" to
"3.4"</li>
<li><a
href="c10fd7a02e"><code>c10fd7a</code></a>
dev: so tired of psych not building on various things</li>
<li><a
href="8378749614"><code>8378749</code></a>
fix(css-selector): default XML namespace is not applied to wildcard</li>
<li><a
href="b112e18a48"><code>b112e18</code></a>
prefactor: restructure css-to-xpath tests</li>
<li>See full diff in <a
href="https://github.com/sparklemotion/nokogiri/compare/v1.18.1...v1.18.3">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
The author of github-readme-stats uses the non-standard code "cn" for
simplified Chinese, see
[here](https://github.com/anuraghazra/github-readme-stats?tab=readme-ov-file#available-locales).
While for traditional Chinese the author only provides "zh-tw". The
github-readme-stats functions on repo page will break if the user sets
the site language to ALL variants of Chinese except for zh-tw. This hack
is to make all sub-variants of simplified Chinese fall back to "cn" and
all sub-variants of traditional Chinese fall back to "zh-tw".
This patch fixes the problem and has been tested locally & with GitHub
pages.
As described in https://github.com/alshedivat/al-folio/issues/300,
standard Markdown code highlighting doesn't work in the Distill template
because it is clobbered by the Distill "Prism" syntax highlighting. This
PR will allow d-code tags (distill-specific code tags) to function with
the Distill syntax highlighter, but will default `highlight` and
Markdown code blocks to use the Jekyll/Rouge highlighter.
This PR also removes overrides.js, which is currently broken because
jquery isn't loaded.
Implementation of Google tag ID to correctly getting tracked requires
further modification in addition to the one line script in the
`_includes/scripts.liquid` file as
```
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', '{{ site.google_analytics }}');
</script>
```
I have made the changes and tested it out on my personal webpage to
ensure the tracking in analytics dashboard.
This should fix several issues with indexing external posts, including
#1828.
In short, I found that the issue with indexing was that the index
builder was receiving 'empty' documents. To fix that, I'm setting the
document content to be the post content as retrieved from the rss feed
or the text extracted from the external page.
I've tested with various blog sources and it seems to be working as
expected now.
## Problem Description
When dark mode is enabled, inline math expressions rendered using
`$...$` in distill-style blog posts are displayed in black text. This
makes them difficult to read against the dark background. The issue
occurs because the default styles for MathJax-rendered content do not
account for dark mode and set the text color to black.
## Proposed Solution
This PR updates the MathJax setup to dynamically apply inline styles to
ensure the text color of MathJax-rendered content inherits the parent
container’s color. Specifically:
- Added a custom action in the _MathJax.options.renderActions_ section
to inject a CSS rule that sets _.mjx-container_ to inherit its color
from its parent element.
- Ensures that inline math expressions render correctly in both light
and dark modes without explicitly setting a fixed color.
## Changes Made
Modified the _mathjax-setup.js_ file to include:
- Custom inline styles injected via JavaScript for _.mjx-container_
elements.
- Explicit handling of _inlineMath_ delimiters to ensure consistency in
rendering.
## Testing and Validation
- Tested the fix in both light and dark modes to confirm that inline
math expressions render in the correct color.
- Verified that the changes do not introduce regressions in light mode
or affect block math expressions rendered using `$$...$$`.
## Impact
- Improves readability of inline math expressions in dark mode.
- Provides a consistent user experience for distill-style blog posts
across light and dark themes.
- Resolves#2915
Co-authored-by: Suraj Khamkar <surajk@atlanticpkg.com>
Hi,
I noticed an issue where the CV page fails to link to the correct custom
PDF when the `{% unless site.data.resume %}` block is executed in
`cv.liquid`. To resolve this, I updated the code to align its logic with
the else block to make it consistent.
---------
Co-authored-by: Maruan Al-Shedivat <maruan@genesistherapeutics.ai>
Shell scripts like entry_point.sh caused errors in Docker due to CRLF
line endings on Windows (`exec /tmp/entry_point.sh: no such file or
directory`).
Added `.gitattributes` to enforce LF line endings for *.sh files.
This resolves the issue and ensures consistent behavior across
platforms.
PR #2617 added a noticeable amount of right padding to all table cells.
This might be fine for tables in content (e.g. posts), but creates odd
spaces in the CV page, which is largely made up of tables.
Install `imagemagick` within `Install and Build 🔧` step of Github
actions
Relevant issue:
[#2902](https://github.com/alshedivat/al-folio/issues/2902) `convert`
Command Not Found on Ubuntu 24.04
Reason:
`ubuntu-latest` in Github actions is pointed to `ubuntu-24.04` now, in
which `imagemagick` is no longer pre-installed. See
[this](https://github.com/actions/runner-images/issues/10772).
Modified files (actions) recommended by @george-gca
```
- .github/workflows/deploy.yml
- .github/workflows/broken-links-site.yml
- .github/workflows/axe.yml
```
Fixes#2890
With the recent updates (v0.13.0) the email badge (social) does not
contain the email anymore.
Some link generations in social.liquid used the old schema
Also updated the handling for mastodon to be aligned to the other social
badges.
Closes#930.
We already had classes for this kind of feature, but it was used
specifically for repository information. Just renamed the classes so it
is clear how they can be used.
To use them with markdown, just do it like this:
```markdown
{: .only-light}
{: .only-dark}
```
and with html:
```html
<img
class="only-light"
src="assets/img/prof_pic_color.png"
>
<img
class="only-dark"
src="assets/img/prof_pic.jpg"
>
```
Signed-off-by: George Araújo <george.gcac@gmail.com>
Added support for multiple image galleries, and created a sample post
showing how to enable and use them.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Fix#2876
Weirdly enough, we already escape the title a few lines above the
changed one, but had to escape it again here.
Signed-off-by: George Araújo <george.gcac@gmail.com>
While using the distill template, I noticed it lacked many features
available in the regular post template, such as typograms, echarts, and
other interactive elements. To address this, I **included the necessary
scripts and dependencies for these features in** _distill.liquid_,
referencing them from misc.liquid. Now, the distill template offers the
same interactive functionality as the post template.
Update CUSTOMIZE.md to include steps to deploy al-folio on Netlify.
---------
Co-authored-by: Henry <Henry@home.com>
Co-authored-by: Henry_Lab <henry@lab.com>
Add a .lycheeignore file with LinkedIn to stop the error in the workflow
Link Checker due to response 999, and update to the new version
lycheeverse/lychee-action@v2.1.0.
Bumps [rexml](https://github.com/ruby/rexml) from 3.3.8 to 3.3.9.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ruby/rexml/releases">rexml's
releases</a>.</em></p>
<blockquote>
<h2>REXML 3.3.9 - 2024-10-24</h2>
<h3>Improvements</h3>
<ul>
<li>Improved performance.
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/210">GH-210</a></li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>
<p>Fixed a parse bug for text only invalid XML.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/215">GH-215</a></li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
<li>
<p>Fixed a parse bug that <code>&#0x...;</code> is accepted as a
character
reference.</p>
</li>
</ul>
<h3>Thanks</h3>
<ul>
<li>NAITOH Jun</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ruby/rexml/blob/master/NEWS.md">rexml's
changelog</a>.</em></p>
<blockquote>
<h2>3.3.9 - 2024-10-24 {#version-3-3-9}</h2>
<h3>Improvements</h3>
<ul>
<li>Improved performance.
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/210">GH-210</a></li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>
<p>Fixed a parse bug for text only invalid XML.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/215">GH-215</a></li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
<li>
<p>Fixed a parse bug that <code>&#0x...;</code> is accepted as a
character
reference.</p>
</li>
</ul>
<h3>Thanks</h3>
<ul>
<li>NAITOH Jun</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="38eaa86ac7"><code>38eaa86</code></a>
Add 3.3.9 entry</li>
<li><a
href="ce59f2eb1a"><code>ce59f2e</code></a>
parser: fix a bug that &#0x...; is accepted as a character
reference</li>
<li><a
href="a09646d395"><code>a09646d</code></a>
test: fix indent</li>
<li><a
href="cf0fb9c9ca"><code>cf0fb9c</code></a>
Fix <code>IOSource#readline</code> for <code>@pending_buffer</code> (<a
href="https://redirect.github.com/ruby/rexml/issues/215">#215</a>)</li>
<li><a
href="1d0c362526"><code>1d0c362</code></a>
Optimize <code>IOSource#read_until</code> method (<a
href="https://redirect.github.com/ruby/rexml/issues/210">#210</a>)</li>
<li><a
href="622011f25a"><code>622011f</code></a>
Bump version</li>
<li>See full diff in <a
href="https://github.com/ruby/rexml/compare/v3.3.8...v3.3.9">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
This PR modifies
- `_config.yml` to rename `bluesky_url` into `bluesky_id`
- `_includes/social.liquid` to handle the renaming in the display of
social media icons
I tested on my Github page and it worked correctly. Then, copied here.
Issue: Blog page navigation extends layout of the page in small screens.
Fixes: #2841
I am currently testing out docker in a remote lab environment where
docker was configured in a way that it can't run as root, causing some
permission issues. The solution I could find was to add these changes
(commented by default) to these files and fill the specifics so it could
run as it was your user running the code.
Signed-off-by: George Araújo <george.gcac@gmail.com>
Fixed the `docker compose` issue, when trying to run the repository,
locally.
#2795
<hr>
<h3>To test these out: </h3>
Run:
`docker compose pull`
`docker compose build`
`docker compose up`
---------
Co-authored-by: Amir Pourmand <pourmand1376@gmail.com>
This is to address
- #2733
Since a lot of times, the only problem is that docker image is not
consistent with the build. We have to somehow incorporate image version
into repository.
I don't insist to provide it this way. Maybe there are other automatic
ways which are better.
We can also calculate the relevant tag from git.
### Pull Request: Fix .webp SrcSet Creation Filter
#### Description
This PR addresses an issue with the filter for creating `.webp` srcsets
introduced in PR #2698. The original filter incorrectly searched for
extensions with a leading period (e.g., ".jpg" and ".png"). As a result,
no matches were found, preventing the srcset from being added to any
figures. This occurred because the split operation removes the period
from the file extensions.
#### Changes Made
- Updated the filter to search for file extensions without the leading
period (e.g., "jpg" and "png").
- Ensured that the resource sets are now correctly created for the
respective file extensions, allowing the `.webp` srcset to function as
intended.
#### Impact
With this change, responsive images will now correctly generate their
srcsets for the appropriate file types, improving image loading
performance and supporting better responsiveness.
#### Fixes
- Fixes#2777
Please review the changes and let me know if there are any further
adjustments needed. Thank you!
If `download: true`, the site deployment fails.
This caused e.g. issue #2548.
I believe the issue appears because the 3rd party downloaded libs rely
on ES6 Syntax, which jekyll-minifier cannot work on correctly.
Also, I think we do not need to minify 3rd party downloaded libs at all.
While this PR does **not** fix the issue above, it at least ensures that
the site can be deployed with `download: true`. We still need better ES6
support as suggested in #2571.
This PR allows the `figure` to accept url as the src of the`<img>`.
currently, it only supports the relative path.
```
// raw img
<img src="{{ image.url }}" alt="{{ image.description }}">
// assign url to figure
{% assign image_url = image.url %}
{% include figure.liquid url=image_url class="img-fluid rounded z-depth-1" zoomable=true %}
```
---------
Signed-off-by: ifuryst <ifuryst@gmail.com>
Co-authored-by: George <31376482+george-gca@users.noreply.github.com>
Bumps [google-protobuf](https://github.com/protocolbuffers/protobuf)
from 4.27.3 to 4.27.5.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/protocolbuffers/protobuf/commits">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
Thanks for the amazing theme! ❤️ I've been using al-folio for several
years, during which I have considered migrating to more modern
technologies like MDX or similar but really found no theme that look
better than this.
# In README.md
## All Contributors Section
**Out of the 216 contributors, the page only shows around 100**
By adding an additional parameter ```max``` It now shows all of them.
### Overview
This PR fixes an issue where unnecessary horizontal lines were displayed
when there were no tags or categories present. The tag and category
container is now conditionally rendered, ensuring it only appears when
there are tags or categories to display.
no tags meaning, in _config.yml
```
display_tags: []
display_categories: []
```
### Before and After
The difference is illustrated in the images below:
- **First Image (Fixed)**: Shows the correct behavior with no extra
lines when tags or categories are absent.
- **Second Image (Current)**: Demonstrates the issue with unwanted
horizontal lines appearing when no tags or categories are present.


### Impact
This change improves the visual consistency and cleanliness of the theme
by preventing unnecessary elements from being rendered, particularly in
cases where there are no tags or categories defined.
Hi, thanks for the great theme! Added my personal academic webpage to
the community list.
Co-authored-by: George <31376482+george-gca@users.noreply.github.com>
# Added prettier-hmtl.yml
## GitHub Workflow
## Purpose
The GitHub Workflow formats the html files on gh-pages. The html files
generated are always on a single line. This makes scaling programs a lot
more difficult. By formatting the HTML files, al-folio can now be used
to generate code which can then be modified to allow for using back-end.
## Errors found
I want to let you know that when I was using prettier for this, it kept
crashing and after some debugging I found out that al-folio was
generating an invalid tag ```</source>```. ```<source>``` is a
self-closing tag and doesn't have a separate closing tag.
Error: ```<source src="URL" type="type"></source>```
Correct: ```<source src="URL" type="type">```
## Workflow Description
1. The workflow starts by checking out the gh-pages branch.
2. Then it finds all ```</source>``` tags in all html files and deletes
them.
3. It Installs NodeJS and then Prettier. To make sure the code was
executed properly, the workflow checks if prettier is present.
4. Then the workflow runs prettier on all html files present in gh-pages
5. It ends by committing the changes and pushing them to the gh-pages
directory
# Example:
> Before
>

> After
>

Bumps [rexml](https://github.com/ruby/rexml) from 3.3.4 to 3.3.6.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ruby/rexml/releases">rexml's
releases</a>.</em></p>
<blockquote>
<h2>REXML 3.3.6 - 2024-08-22</h2>
<h3>Improvements</h3>
<ul>
<li>
<p>Removed duplicated entity expansions for performance.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/194">GH-194</a></li>
<li>Patch by Viktor Ivarsson.</li>
</ul>
</li>
<li>
<p>Improved namespace conflicted attribute check performance. It was
too slow for deep elements.</p>
<ul>
<li>Reported by l33thaxor.</li>
</ul>
</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>
<p>Fixed a bug that default entity expansions are counted for
security check. Default entity expansions should not be counted
because they don't have a security risk.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/198">GH-198</a></li>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/199">GH-199</a></li>
<li>Patch Viktor Ivarsson</li>
</ul>
</li>
<li>
<p>Fixed a parser bug that parameter entity references in internal
subsets are expanded. It's not allowed in the XML specification.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/191">GH-191</a></li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
<li>
<p>Fixed a stream parser bug that user-defined entity references in
text aren't expanded.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/200">GH-200</a></li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
</ul>
<h3>Thanks</h3>
<ul>
<li>
<p>Viktor Ivarsson</p>
</li>
<li>
<p>NAITOH Jun</p>
</li>
<li>
<p>l33thaxor</p>
</li>
</ul>
<h2>REXML 3.3.5 - 2024-08-12</h2>
<h3>Fixes</h3>
<ul>
<li>Fixed a bug that
<code>REXML::Security.entity_expansion_text_limit</code>
check has wrong text size calculation in SAX and pull parsers.
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/193">GH-193</a></li>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/195">GH-195</a></li>
<li>Reported by Viktor Ivarsson.</li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ruby/rexml/blob/master/NEWS.md">rexml's
changelog</a>.</em></p>
<blockquote>
<h2>3.3.6 - 2024-08-22 {#version-3-3-6}</h2>
<h3>Improvements</h3>
<ul>
<li>
<p>Removed duplicated entity expansions for performance.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/194">GH-194</a></li>
<li>Patch by Viktor Ivarsson.</li>
</ul>
</li>
<li>
<p>Improved namespace conflicted attribute check performance. It was
too slow for deep elements.</p>
<ul>
<li>Reported by l33thaxor.</li>
</ul>
</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>
<p>Fixed a bug that default entity expansions are counted for
security check. Default entity expansions should not be counted
because they don't have a security risk.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/198">GH-198</a></li>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/199">GH-199</a></li>
<li>Patch Viktor Ivarsson</li>
</ul>
</li>
<li>
<p>Fixed a parser bug that parameter entity references in internal
subsets are expanded. It's not allowed in the XML specification.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/191">GH-191</a></li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
<li>
<p>Fixed a stream parser bug that user-defined entity references in
text aren't expanded.</p>
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/200">GH-200</a></li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
</ul>
<h3>Thanks</h3>
<ul>
<li>
<p>Viktor Ivarsson</p>
</li>
<li>
<p>NAITOH Jun</p>
</li>
<li>
<p>l33thaxor</p>
</li>
</ul>
<h2>3.3.5 - 2024-08-12 {#version-3-3-5}</h2>
<h3>Fixes</h3>
<ul>
<li>Fixed a bug that
<code>REXML::Security.entity_expansion_text_limit</code>
check has wrong text size calculation in SAX and pull parsers.
<ul>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/193">GH-193</a></li>
<li><a
href="https://redirect.github.com/ruby/rexml/issues/195">GH-195</a></li>
<li>Reported by Viktor Ivarsson.</li>
<li>Patch by NAITOH Jun.</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="95871f399e"><code>95871f3</code></a>
Add 3.3.6 entry</li>
<li><a
href="7cb5eaeb22"><code>7cb5eae</code></a>
parser tree: improve namespace conflicted attribute check
performance</li>
<li><a
href="6109e0183c"><code>6109e01</code></a>
Fix a bug that Stream parser doesn't expand the user-defined entity
reference...</li>
<li><a
href="cb158582f1"><code>cb15858</code></a>
parser: keep the current namespaces instead of stack of Set</li>
<li><a
href="2b47b161db"><code>2b47b16</code></a>
parser: move duplicated end tag check to BaseParser</li>
<li><a
href="35e1681a17"><code>35e1681</code></a>
test tree-parser: move common method to base class</li>
<li><a
href="6e00a14daf"><code>6e00a14</code></a>
test: fix indent</li>
<li><a
href="df3a0cc830"><code>df3a0cc</code></a>
test: fix indent</li>
<li><a
href="fdbffe744b"><code>fdbffe7</code></a>
Use loop instead of recursive call for Element#namespace</li>
<li><a
href="6422fa3449"><code>6422fa3</code></a>
Use loop instead of recursive call for Element#root</li>
<li>Additional commits viewable in <a
href="https://github.com/ruby/rexml/compare/v3.3.4...v3.3.6">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
Inverted order of title and {% if site.data.repositories.github_users
%}, so that if there is no github_users, the "GitHub users" title does
not appear.
[INSPIRE](http://inspirehep.net/) is a trusted community hub that
facilitates the sharing and discovery of accurate scholarly information
in high energy physics. By integrating the social and citation count
badge, al-folio users within this community will gain significant
benefits.
In continuation of #2634, I am creating this pull request.
## Details
### Social Icon
- Add your INSPIRE author ID in the `config.yml` under `inspirehep_id`.
### Citation Count
- Enable this feature by setting `inspirehep` to `true` under
`enable_publication_badges` in your `config.yml` file.
- In your bibliography file (e.g., `papers.bib`), add `inspirehep_id =
{the literature's recid}` under the citation of a literature source.
In #2523, I did a copy&paste error with
07d6e619cc
I used the global `search_enabled` config key instead of the correct
`bib_search` key.
This PR fixed it.
## The issue
Currently Altmetric and Dimension publication badge elements have
non-obvious attributes that hide badges when some conditions are not met
,e.g.:
```
data-hide-no-mentions="true"
data-hide-less-than="15"
```
resulting in seemingly strange behavior where badges are enabled in
`config.yml` but don't show up consistently, as reported in #2443 :
Altmetric badges don't display for some pubs.
## This PR
- removes these hidden nondisplay conditions in favor of more
predictable website behavior;
- adds documentation links to point users interested in customizing
badge behavior to the right resources.
This PR adds a simple filter/search functionality to the bibliography.
It can be used in two ways:
1. Simply enter a search term in the input box.
2. Send a search term via the `location.hash`, e.g.,
https://alshedivat.github.io/al-folio/publications/#mechanics
**Notes:**
- The search box is optional. It can be simply removed if anyone does
not like it.
- Searching via `hash` works without the search box. My idea is to use
this functionality to index all BibTeX entries via the `ctrl-k` search
and link them via their BibTeX key.
- Searching via `hash` could also be used to set static links on the
current page, e.g., to filter specific co-authors, venues, etc.
- I don't know much about the design of the input field. I simply reused
the newsletter box style.
- Entering a search term in the box does exact matching. No fuzzy
search, no AND/OR logic. I kept it very simple. Maybe anyone else wants
to improve it in the future.
- The search looks in all data in the BibTeX entry that is parsed via
`bib.liquid`. E.g., it is possible to search for BibTeX keys, titles,
authors, years, venues, abstracts, or whatever `bib.liquid` prints.
- I used a 300ms delay before starting to search on the input box.
- Entering search terms in the box does not update the location hash
(things could get complex otherwise due to automatically updating each
other...)
- If the filter does not find any match in a specific year, the year is
also made invisible.
**Screenshot**
<img width="935" alt="screenshot"
src="https://github.com/alshedivat/al-folio/assets/1998723/447003e2-c623-4de9-b2c5-2357117a7743">
Looking for feedback.
To reproduce the bug:
```bibtex
@inproceedings{Vaswani2017AttentionIA,
title = {Attention is All you Need},
author = {Ashish Vaswani and Noam M. Shazeer and Niki Parmar and Jakob Uszkoreit and Llion Jones and Aidan N. Gomez and Lukasz Kaiser and Illia Polosukhin},
booktitle = {Neural Information Processing Systems},
year = {2017},
doi = {10.48550/arXiv.1706.03762},
altmetric = {21021191}
}
```
The bug is
1. It seems to be some weird property of the liquid template that [line
252-254](8d82670ff1/_layouts/bib.liquid (L252-L254))
doesn't work at all. According to [this
post](https://stackoverflow.com/questions/59887447/liquid-how-to-assign-the-output-of-an-operator-to-a-variable)
and [this issue](https://github.com/Shopify/liquid/issues/236), liquid
doesn't support assign the output of operator to a variable nor a
ternary operator. So based on my console log, the value of
`entry_has_altmetric_badge` is always a string value of
`entry.altmetric` when altmetric is provided in bibtex.
```liquid
{% assign entry_has_altmetric_badge = entry.altmetric or entry.doi or entry.eprint or entry.pmid or entry.isbn %}
{% assign entry_has_dimensions_badge = entry.dimensions or entry.doi or entry.pmid %}
{% assign entry_has_google_scholar_badge = entry.google_scholar_id %}
{% if entry_has_altmetric_badge or entry_has_dimensions_badge or entry_has_google_scholar_badge %}
<div class="badges">
{% if site.enable_publication_badges.altmetric and entry_has_altmetric_badge %}
<span
...
```
Note that this could be problematic that a string in liquid is always
evaluated as true as long as it is defined regardless if it is "" or
"false".
[reference](https://shopify.github.io/liquid/basics/truthy-and-falsy/)
2. when altmetric is defined in bibtex, now the order of set attribute
to badge is eprint > doi > altmetric id > pmid > ISBN, and the badge
doesn't work when an arxiv doi is provided.
I think the expected behavior should be
1. as documented in CUSTOMIZE.md, only render the badge when the entry
is set to either "true" or the altmetric id. (It could also implement to
always render the badge whenever doi or other related attribute is set,
and set altmetric to "false" to disable it)
```md
- `altmetric`: Adds an [Altmetric](https://www.altmetric.com/) badge (Note: if DOI is provided just use `true`, otherwise only add the altmetric identifier here - the link is generated automatically)
```
2. if the almetric id is set, use it first.
Currently, on the [blog](https://alshedivat.github.io/al-folio/blog/)
page, clicking "older" and "newer" on the pagination at the bottom
direct you forward to links like `/al-folio/blog/page/2/` and backward
to `/al-folio/blog/`.
However, if you click on the `1`, `2`.. etc buttons, there is a
different behavior. The links now contain an `index.html`. For example,
clicking `2` leads you to `/al-folio/blog/page/2/index.html`. It is the
same content, just with a messier hyper link. Same with clicking `1`,
you are brought to `/al-folio/blog/`.
This fix creates a consistency among the hyper links in pagination.
For some unknown reason, all the `document.onreadystatechange = () => {`
checks stopped working. Thankfully, replacing them with
`document.addEventListener("readystatechange", () => {` fixed the
issues.
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
Fixes#2469. Separated `news` and `posts` from other collections in
search, since it caused duplicated entries. Also to ensure they are in
chronological reverse order.
Signed-off-by: George Araujo <george.gcac@gmail.com>
- updates `external-posts.rb` plugin, allowing the user to specify an
explicit lists of urls in `_config.yml` that are then displayed in the
blog feed as external posts
- 99% of the code in this change is written by gpt-4:
https://chat.openai.com/share/24432d24-36a7-4d6f-a5c0-d7e5142f68cd
Thank you @george-gca for the awesome work. on #2415.
This PR generalizes the search on all collections. Currently, only
projects are added to the search.
This PR uses all of them, such as news. On my personal website, I use a
teaching collection which is then also automatically searched.
Fixes#2419 by downloading leaflet images. Also changed the path where
the libraries are downloaded to avoid not downloading files with same
name.
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.16.4
to 1.16.5.
<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.16.5 / 2024-05-13</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated to address CVE-2024-34459. See
<a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-r95h-9x8f-r3f7">GHSA-r95h-9x8f-r3f7</a>
for more information.</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated to <a
href="https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.12.7">v2.12.7</a>
from v2.12.6. (<a
href="https://github.com/flavorjones"><code>@flavorjones</code></a>)</li>
</ul>
<hr />
<p>sha256 checksums:</p>
<pre><code>af0f44fa3e664dfb2aa10de8b551447d720c1e8d1f0aa3f35783dcc43e40a874
nokogiri-1.16.5-aarch64-linux.gem
23dc2357b26409a5c33b7e32a82902f0e9995305420f16d1a03ab3ea1a482fec
nokogiri-1.16.5-arm-linux.gem
950d037530edb49f75ad35de0b8038b970a7dda57e2b6326895b0e49fadf6214
nokogiri-1.16.5-arm64-darwin.gem
b7aefc94370c62476b8528e8d8abb6160203abd84a1f4eceda8f1aa8974d9989
nokogiri-1.16.5-java.gem
ec2167160df8fec3137bf95d574ed80ebc1d002bb3b281546b60b4aa9002466e
nokogiri-1.16.5-x64-mingw-ucrt.gem
6984200491fac69974005ecfa2de129d61843d345eafa5d6f58e8b908d1cf107
nokogiri-1.16.5-x64-mingw32.gem
abdc389ab1ec6604492da16bd9d06ad746fdb6bd6a1bd274c400d61ffcadb3c4
nokogiri-1.16.5-x86-linux.gem
63d24981345856f2baf7f4089870a62d3042fb8d3021b280fb04fc052532e3c4
nokogiri-1.16.5-x86-mingw32.gem
71b5f54e378c433d13df67c3b71acc4716129da62402d8181f310c4216a63279
nokogiri-1.16.5-x86_64-darwin.gem
0ca238da870066bed2f7837af6f35791bb9b76c4c5638999c46aac44818a6a97
nokogiri-1.16.5-x86_64-linux.gem
ec36162c68984fa0a90a5c4ae7ab7759460639e716cc1ce75f34c3cb54158ad2
nokogiri-1.16.5.gem
</code></pre>
</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.16.5</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated to address CVE-2024-34459. See
<a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-r95h-9x8f-r3f7">GHSA-r95h-9x8f-r3f7</a>
for more information.</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li>[CRuby] Vendored libxml2 is updated to <a
href="https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.12.7">v2.12.7</a>
from v2.12.6. (<a
href="https://github.com/flavorjones"><code>@flavorjones</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="cd70bd3dc9"><code>cd70bd3</code></a>
version bump to v1.16.5</li>
<li><a
href="afc36de553"><code>afc36de</code></a>
dep: update vendored libxml2 to v2.12.7 (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3191">#3191</a>)</li>
<li><a
href="41b4f0846d"><code>41b4f08</code></a>
ci: add arm64-darwin coverage using macos-14</li>
<li><a
href="67b9e863a6"><code>67b9e86</code></a>
dep: update libxml2 to v2.12.7</li>
<li>See full diff in <a
href="https://github.com/sparklemotion/nokogiri/compare/v1.16.4...v1.16.5">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
This PR fixes a very niche bug.
If there is a co-author that is not *me* (=`<em>` tagged) and does not
have a `coauthor_url` (=`<a>` tagged), there will be a leading
whitespace before the separating comma. If the author list is split into
multiple lines (due to long author lists or a small view), the
whitespace can lead to a line beginning with a comma.
As I said, very niche, but interestingly, the other cases already did
the same whitespace handling. Just the case not-me/no-url was mising.
Currently, we do not have this case on vanilla al-folio, but you can see
it for example on [my website](https://christianmainka.de/publications/)
if the view is small (e.g., 430px).
Related to #1502.
This PR is related to #2309. I added an optional `last_updated` field.
This new field represents the timestamp for when the post was last
updated. Consequently, the existing `date` metadata should now be
interpreted as the creation date of the post.
The formatting for displaying these dates has been standardized as
follows:
```text
Created: July 11, 2023 | Last Updated: April 14, 2024
```
For a practical implementation example, please refer to [this
post](https://torydeng.github.io/blog/2023/deploying-server/) on my
website, where I have applied these changes.
---
Any feedback is wellcome.
adding "location" element when location object is added to work
experience. Location icon and the entered value will appear on the CV
page under the work experience section. This feature already exists for
education section, but not for work. The change is made to make the
experiece more consistent.

I added a [Remote Development
Containers](https://code.visualstudio.com/docs/devcontainers/tutorial)
in Visual Studio Code (VSCode).
Lots of people like to develop in Containers to have a clean system.
With this PR, it is possible to work with al-folio without any
installation (except for VS Code, its Remote Dev Container extension,
and Docker).
Once you've opened the `al-folio` repository, a prompt will appear
requesting to reopen the project within a container.
<img width="541" alt="grafik"
src="https://github.com/alshedivat/al-folio/assets/1998723/2963446f-8e42-4df1-9e8c-22691d78b7e4">
Upon doing so, Jekyll will automatically start within the container and
prompt you to open the website's preview sidebar directly in VSCode or
using your Browser. Additionally, it installs extensions for `liquid`
and Prettier (`npx prettier`). Files are formatted using
`al-folios`-prettier settings (`.prettierrc`) to streamline pull request
submission.
Additionally, the performance seems to be much better compared to the
`docker-compose`setup, see #2333.
---------
Co-authored-by: George <31376482+george-gca@users.noreply.github.com>
As discussed in #1181, I suggest to make embedding videos an optional
feature.
This behavior aligns well with recently merged PR #2312.
Open questions:
1. I added a youtube link to `papers.bib`. Is this link okay?
2. I set `enable_video_embedding: false` as the default. I argue that
privacy settings should be the default. Also, the current implementation
of `video.liquid` only works for some very specific video URLs. For
example, to embed youtube, specialized links must be used to avoid
`X-Frame-Option` issues. This behavior can lead to a broken embedding,
which would not look very nice.
Feedback welcome.
I added further filds to `bib.liquid`.
A common field is `location`, which is now printed.
I added fields for `acceptance` and `acceptance_rate`. These fields
might be usefull for external people to better determine a vanue's
quality.
`acceptance` is used for the accepted vs submitted papers.
`acceptance_rate` is a percent-value.
<img width="785" alt="Bildschirmfoto 2024-04-07 um 18 11 49"
src="https://github.com/alshedivat/al-folio/assets/1998723/d5eaeb08-7f67-4fb7-b9b9-fd5f4a3c331c">
The existence of two distinct variables stems from the fact that the
'acceptance_rate' is represented using the venue color. On my website, I
employ venue colors correlated with computer science conference
rankings, which naturally leads to associating the acceptance rate with
the same color scheme for coherence and better understanding.
<img width="785" alt="Bildschirmfoto 2024-04-07 um 18 14 54"
src="https://github.com/alshedivat/al-folio/assets/1998723/33ef0419-00ee-4fea-93d9-18c0269188de">
You can find more examples on my
[website](https://christianmainka.de/publications/peerreviewed).
Also, I added a CVE Score, which is mainly usefull for IT-Security
researchers, see this [example](https://christianmainka.de/cve/).
***
Let me know what you think about this proposal.
Created a plugin to tackle #1181. Currently have an issue with tikzjax
since it imports some wasm file from its javascript. The rest should
work as expected.
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
This PR adds an "award" button to publications.
It takes the `award` value from the bibtex entry and displays(incl.
Markdown rendering) the text in a box similarly to abstract and bibtex.
User can set the entry `award_name` to configure the value. See example
config with `award_name: Nobel Prize`.
The color of the award box can be configured in `_base.scss`.
Note, there is a similar PR #2175, it I saw to issues with:
1. There was no progress
2. The award button just prints the text directly in the button,
similarly to `award_name`. Long award names could clutter the webpage.
3. IMHO, it brokes the current al-folio design, since butons do have a
fixed size/text. However, variable prize names are also possible with
this PR.
***
Pictures:
Default. Text are hidden:
<img width="708" alt="grafik"
src="https://github.com/alshedivat/al-folio/assets/1998723/1221c82c-c384-4297-807e-39385e2ce4fd">
Additional info is shown when the button is clicked. Markdown supported.
<img width="684" alt="grafik"
src="https://github.com/alshedivat/al-folio/assets/1998723/2354aeee-12b0-4d32-b194-5d2ea80d8363">
Only one text box shown at the same time, like it is with "ABS" and
"BIB":
<img width="691" alt="grafik"
src="https://github.com/alshedivat/al-folio/assets/1998723/d3937bb9-d9c2-47ac-b819-b92aec3d916a">
***
Feedback welcome.
You can also check [my
website](https://christianmainka.de/publications/awarded), which was the
base for this PR.
The blog archive page tables have `table-borderless`, but
bootstrap-table JS adds `table-bordered` by default and this forces an
`!important` border.
Since these tables are also supposed to be borderless, this PR excludes
them from bootstrap-table, just like the news and CV table are.
Now that Bluesky is [finally
available](https://fontawesome.com/changelog) at Font Awesome, we can
add it to the template.
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
The theme toggle button now has a third option, which follows the user's
system preferences.
- In the code there's now a distinction between the theme setting (which
can be "dark", "light" or "system") and the computed theme.
- The theme setting is now stored as the "theme-setting" local storage
variable. Since this is different from the old variable ("theme"), this
will effectively reset all current user themes to the default "system".
Maybe this is not what you want.
- The "system" theme icon is currently a half circle symbol.
- The toggle button now displays the current theme setting, rather than
the next theme setting (as far as I know this is consistent with other
sites which have three theme options).
- `theme.js` is now loaded regardless of `site.enable_darkmode`. This is
because other scripts which were always loaded relied on being able to
determine the theme. `theme.js` no longer initialises the theme itself
though; this only happens when `site.enable_darkmode`.
- When the theme setting is "system", the theme will change immediately
whenever the user changes their system theme.
#2261
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
Co-authored-by: George Araujo <george.gcac@gmail.com>
I noticed disabling latest_posts in `_config.yml` didn't work because
the variable in the liquid template was seemingly incorrect. This should
fix that.
---------
Co-authored-by: Jake Nabasny <jake@nabasny.com>
Latex math is currently broken in
[_posts/2015-10-20-math.md](https://alshedivat.github.io/al-folio/blog/2015/math/)
. Fixed it by replacing starts with underscore
---------
Co-authored-by: George <31376482+george-gca@users.noreply.github.com>
Our score went down a little bit after the last few changes. Avoiding
lazy loading some images (as introduced in #2183), since [it is strongly
recommended to omit hero images and other images or iframes that are
likely to appear above the fold from being
lazy-loaded](https://web.dev/articles/browser-level-lazy-loading-for-cmss#avoid_lazy_loading_above-the-fold_elements).
Also added missing `alt` to google scholar field.
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
A proposed solution for #2190. Padding is added such that I considered
it aesthetically pleasing and the bullet points in front of the check
marks were removed.
---------
Co-authored-by: George <31376482+george-gca@users.noreply.github.com>
This PR introduces an enhancement to the site's image-loading strategy
by implementing lazy loading as the default behavior for all images. The
motivation behind this change is to improve the site's load times.
**Changes:**
1. **Default Lazy Loading:** By `default`, all images will now have the
`loading="lazy"` attribute.
2. **Configurable Option in `_config.yml`:** Added a new configuration
option under `lazy_loading_images.enable`.
3. **Override Capability:** For `specific images` where the user doesn't
want lazy loading, they can `override` this by directly setting the
`loading attribute` in the `image tag`.
I removed the spaces between the first, middle and last names in the
header.
It's just my preference, I don't know if it would be accepted but I have
done this for my own page using this repository as a template.
In this pull request, I've made adjustments to the image element's
handling of dimension properties. Previously, `min-width`, `min-height`,
`max-width`, and `max-height` were incorrectly placed as HTML attributes
on the `<img>` tag, which is not supported for these CSS properties.
This oversight could lead to issues with image responsiveness and layout
stability.
Changes:
- Moved `min-width`, `min-height`, `max-width`, and `max-height`
properties into the `style` attribute of the `<img>` tag. This change
ensures that these properties are correctly applied and recognized as
CSS properties, enhancing the responsiveness and flexibility of our
image displays.
- Retained `width` and `height` as attributes on the `<img>` tag to
maintain the intrinsic aspect ratio of images and help the browser
allocate space before images are fully loaded, improving the page load
experience.
These adjustments will ensure that our images are more responsive and
better adhere to the specified dimensions, improving the overall user
experience for the template.
This PR changes the footer text on the website (for both the sticky and
fixed footer) to be centered by default. This change is based on the
discussion post #257.
Moved libs versions and hashes to `_config.yml`.
Fixes#2067.
Deferring everything possible to keep pages loads fast.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Since a lot of issues opened are just questions that should be opened as
so, and sometimes the issue template is just not followed, I decided to
make opening new issues a little more "enforced", if not clear.
I based the new templates on the ones from [pytorch
lightning](https://github.com/Lightning-AI/pytorch-lightning/issues/new/choose),
which I think are pretty good. The visuals will only appear after the
merge is processed, but you can have an idea of how it will look like by
checking their templates and how they look.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
After some thorough testing, finally made prettier on PR work. Since an
html file can't be used as comment on GitHub, changed to simply point to
the action that failed and to the file containing the html diff.
Signed-off-by: George Araújo <george.gcac@gmail.com>
Splitted prettier GitHub action into two:
- `on push`, only runs on direct pushes, if test fails generates an
artifact (that lasts for 3 days) with an html version of the changes
needed to pass prettier test
- `on PR`, only runs on PRs, if test fails comments on the PR with the
HTML content of the diff
I couldn't actually test the `on PR` version since it needs to be on a
PR in the master branch, so this will only be triggered after this PR is
accepted, and for the next PR that fails prettier test.
PS: currently the artifact is a zip file with the html inside. It is not
currently possible to generate it other way, we have to wait for [this
issue](https://github.com/actions/upload-artifact/issues/14) to be
closed.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
The GitHub actions were running everytime a new commit was made to the
repo, but that wasn't needed. For example, we don't need to try to
create a new docker image if the libraries didn't change, same to build
the whole site after a change in the README.md.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Added GitHub action to do axe accessibility tests with [axe
cli](https://github.com/dequelabs/axe-core-npm/tree/develop/packages/cli).
I believe it is best by default to let this be run only manually, since
fixing some of the issues are not straightforward (I haven't fixed them
all for this template yet).
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Added another GitHub action to check for broken local links on version
of the site that will be deployed.
The `broken-links` action check for broken links considering
documentation files (like INSTALLING.md) and also pages like
[_pages/about.md](https://github.com/alshedivat/al-folio/blob/master/_pages/about.md),
but it can't check for broken links when the link will be handled by
jekyll tags (like in
[_pages/blog.md](https://github.com/alshedivat/al-folio/blob/master/_pages/blog.md).
With `broken-links-site` we can check if all the links that will be used
on the final site that refer to local files are correct. Focusing only
on local files since this would end up calling too many checks for
library files, like
`https://unpkg.com/bootstrap-table@1.22.1/dist/bootstrap-table.min.css`.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Added GitHub action to check for broken links in repo before commit,
ignoring files with liquid tags since these were not yet processed and
also README since some sites created from this template doesn't have
valid urls anymore. Fixed some broken links in repo.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
summary:
- adds prettier formatter configuration
- formats the entire repo using prettier, ignoring minified files
(`*.min.css`) and heavy generated html
- changes extensions of all `.html` files to `.liquid`, which is more
correct and necessary for prettier to work correctly
- replaces "%-" and "-%" with just "%" — manual liquid formatting using
minus signs is superfluous since we are compressing and minifying the
code anyway
- adds CI action for running prettier check on PR and pushes to master
Since the citation file and other stuff is already defined in
`_config.yml`, removed them when calling `{% bibliography %}`. Also
realized that `jekyll-scholar` helps in displaying only the papers cited
in page, changed to use that.
Signed-off-by: George Araújo <george.gcac@gmail.com>
I decided to break the README file into different ones to declutter it
from the main page. Also adding some more explanation on the structure
of the template. Tackling #2032 and #2033
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
I had added -strip arg to the imagemagick call as it is generally
desirable to strip metadata from images before publishing them, however
it seems to occasionally cause issues with jekyll-imagemagick
auto-regeneration, regenerating images even when they have not changed.
Fixes#1967
Update the way responsive images are used to only use one srcset, and
add corresponding `sizes` attribute to the relevant layouts and
templates.
I did not go through and add `sizes` to all the example posts/projects.
When `sizes` is not specified by the user, the `figure.html` template
defaults to 95% the width of the viewport which should work fine for
most cases; users can optimize further if they wish by feeding `sizes`
into the template.
Additionally:
- Enabled support for .gif to .webp compression
- fix error in jekyll-imagemagick config where all images were resized
to be 800px or less. (for example img-1400.webp was actually only 800px
wide, etc.)
- added note about making sure imagemagick is installed before enabling
it in responsive images section of `_config.yml`
After deploying my website (Cloudflare Pages), my Giscus did not work, I
realized these two paramesters are removed. After adding them again, my
Giscus worked correctly.
These new values are values from previous commits of original repository
---------
Co-authored-by: Maruan Al-Shedivat <maruan@genesistherapeutics.ai>
When the video entry is added to bib:
e.g.,
```
{
...
video={https://www.youtube.com/embed/jNQXAC9IVRw}
...
}
```
A dedicated button appears for videos. When clicked, a playable video
appears under the research article (like abstracts and bibtex)
This patch checks, if the title of the current page matches with the
title of a submenu child. If so, it sets the submenu and the
corresponding child as active, highlighting it in the header.
Updated README to explicitly tell how to proceed on creating your own
version based on this template. Also removed the video tutorial since it
was for an older version, recommending to fork the repo and it was
missing the `--lsi` parameter from jekyll command. Also was not using
docker, the current recommended way.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Fixes#1952 by updating font awesome version. Also updated icons names
to newest font awesome style.
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
giscus settings in `_config.yml` had al-folio repo specified by default.
many users kept these defaults in their own repos, which resulted in
getting comments from blog posts of different users posted to al-folio
discussions. this is undesirable, since users lose control over the
discussions in their blogs.
this PR solves the issue:
- first, we set `giscus.repo` to blank in `_config.yml`. if the field is
kept blank, when the website is built locally, the user will see a
warning saying that giscus comments are misconfigured.
- second, we add a step to the `deploy` workflow that writes repository
name to `giscus.repo` in `_config.yml`. that way, even if `giscus.repo`
field is left black or set to an incorrect repo, it gets correctly
populated at deployment time.
other small changes in this PR are small stylistic adjustments.
Addresses #963.
Supports two setups: getting profile text from page content.
```markdown
---
layout: about
title: about
permalink: /
subtitle: <a href='#'>Affiliations</a>. Address. Contacts. Moto. Etc.
profiles:
# if you want to include more than one profile, just replicate the following block
# and create one content file for each profile inside _pages/
- align: right
image: prof_pic.jpg
# content: about_einstein.md
image_circular: false # crops the image to make it circular
more_info: >
<p>555 your office number</p>
<p>123 your address street</p>
<p>Your City, State 12345</p>
news: true # includes a list of news items
selected_papers: true # includes a list of papers marked as "selected={true}"
social: true # includes social icons at the bottom of the page
---
Write your biography here. Tell the world about yourself. Link to your favorite [subreddit](http://reddit.com). You can put a picture in, too. The code is already in, just name your picture `prof_pic.jpg` and put it in the `img/` folder.
Put your address / P.O. box / other info right below your picture. You can also disable any these elements by editing `profile` property of the YAML header of your `_pages/about.md`. Edit `_bibliography/papers.bib` and Jekyll will render your [publications page](/al-folio/publications/) automatically.
Link to your social media connections, too. This theme is set up to use [Font Awesome icons](http://fortawesome.github.io/Font-Awesome/) and [Academicons](https://jpswalsh.github.io/academicons/), like the ones below. Add your Facebook, Twitter, LinkedIn, Google Scholar, or just disable all of them.
```
Or getting profile text from `content` (useful when having multiple
profiles).
```markdown
---
layout: about
title: about
permalink: /
subtitle: <a href='#'>Affiliations</a>. Address. Contacts. Moto. Etc.
profiles:
# if you want to include more than one profile, just replicate the following block
# and create one content file for each profile inside _pages/
- align: right
image: prof_pic.jpg
content: about_einstein.md
image_circular: false # crops the image to make it circular
more_info: >
<p>555 your office number</p>
<p>123 your address street</p>
<p>Your City, State 12345</p>
- align: left
image: prof_pic.jpg
content: about_einstein.md
image_circular: false # crops the image to make it circular
more_info: >
<p>555 your office number</p>
<p>123 your address street</p>
<p>Your City, State 12345</p>
news: true # includes a list of news items
selected_papers: true # includes a list of papers marked as "selected={true}"
social: true # includes social icons at the bottom of the page
---
```
Which looks like this:

---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
Signed-off-by: George Araujo <george.gcac@gmail.com>
Tackled #1329 with [PurgeCSS](https://purgecss.com/).
Being talking with @varuniyer about using
[jekyll-uncss](https://github.com/episource/jekyll-uncss) to reduce css
file sizes by ditching unused classes. This approach have 3 main
problems:
1 - have some limitations as pointed
[here](https://github.com/alshedivat/al-folio/issues/1329#issuecomment-1546517327)
2 - last update to
[jekyll-uncss](https://github.com/episource/jekyll-uncss) was about 3
years ago, so it might have a few issues
3 - [uncss](https://github.com/uncss/uncss) haven't seem a new release
in a while, currently [lacking
maintenance](https://github.com/uncss/uncss/issues/459), and using some
deprecated libraries as seem here:
```
npm install -g uncss
npm WARN deprecated request-promise-native@1.0.9: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated w3c-hr-time@1.0.2: Use your platform's native performance.now() and performance.timeOrigin.
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
```
I thought about giving PurgeCSS a go, since it has been more [actively
maintaned](https://github.com/FullHuman/purgecss), but
[jekyll-purgecss](https://github.com/mhanberg/jekyll-purgecss) haven't.
For this, I needed to change to use some local libraries instead of
getting them via CDN. The good news is that it is quite effective in
reducing css file sizes. Comparing dir sizes with `du -hs
_site/assets/css/`:
| current | minify | PurgeCSS | PurgeCSS + minify |
| ------- | ------ | -------- | ----------------- |
| 1,1M | 988K | 456K | 420K |
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
This addresses https://github.com/alshedivat/al-folio/issues/1425.
Contributions:
- Added border attribute to `.table-dark` within `_base.scss` to
override bootstrap theme border settings for `.tabled-bordered`.
Displays top border in dark mode for only those tables that are bordered
* added the link to my personal academic website
([mbarbetti.github.io](https://mbarbetti.github.io))
* added the link to the website for a workshop named "Beyond Vision:
Physics meets AI" ([BVPAI
2023](https://physicsmeetsai.github.io/beyond-vision)) held within ICIAP
2023
---------
Co-authored-by: Amir Pourmand <pourmand1376@gmail.com>
When the WeChat icon in socials is clicked, a picture of your WeChat QR
code is shown in the center of the screen. The actual picture of your QR
code has to be uploaded.
Dear `al-folio` maintainers,
I would greatly appreciate it if you could add my homepage as a star in
the academic examples.
Thank you for your wonderful work on this.
Addressing #1395 but with a different solution from #1478, using
semantic versioning based on implementation found
[here](https://distresssignal.org/busting-css-cache-with-jekyll-md5-hash).
Implemented a way of calculating the hash for both a single file or
directory. This way we can calculate the hash for when there is a change
in the `_sass` dir, for example, or in the contents of a single file.
Examples of generated outputs of the plugin:
```
/al-folio/assets/css/main.css?d41d8cd98f00b204e9800998ecf8427e
/al-folio/assets/js/theme.js?96d6b3e1c3604aca8b6134c7afdd5db6
/al-folio/assets/js/dark_mode.js?9b17307bb950ffa2e34be0227f53558f
/al-folio/assets/js/no_defer.js?d633890033921b33e0ceb13d22340a9c
/al-folio/assets/js/common.js?acdb9690d7641b2f8d40529018c71a01
/al-folio/assets/js/copy_code.js?c9d9dd48933de3831b3ee5ec9c209cac
/al-folio/assets/img/prof_pic.jpg?974957d202f671e4fa6700c04e68deae
```
Signed-off-by: George Araujo <george.gcac@gmail.com>
Solves #1586 by adding the option for giscus comments sites using the
pages layout and minimally modifies Project 2 to show giscus comments as
an example
#1569 Fixed mismatch between zotero-id in _config.yml and the zotero-id
called upon in the socials html file introduced by #1572 (sorry about
that; slipped in when I had to reset my zotero-branch)
Solving #1569
I added Zotero socials because I needed them; opened a issue/pull
request in case I'm not the only one.
Second pull request (previous: #1570 ) because unwanted commits
retroactively crept in somehow. It was easier to force reset (which
closed the pull request automatically apparently).
Just as discussed in #1513 , this pull request adds support for
[jsonresume](https://jsonresume.org/). Create the resume once, either as
a file in the repository or at [github gist](https://gist.github.com/)
called `resume.json`. Put the file in the `_config.yaml` file and that's
it! Other platforms like [resumake](https://latexresu.me/) use the same
schema.
I also incorperated the changes introduced by #1339 to the best of my
abilites. The style could be further improved.
**Please merge this pull request after #1339 is merged, due to
dependencies from it**
If someone has a bettet approach on how to solve the problem that each
section needs its own template, please let me know. But for now it works
fine and is still backwards compatible with the `cv.yaml` file.
Co-authored-by: George <31376482+george-gca@users.noreply.github.com>
Implementing #1440. Still not sure if the year should be shown there or
not. Also, I limited to be displayed at least 2 at most 3 elements on
the row of featured blog posts, since when having only 1 featured post
the card would occupy the whole row (and it looks weird). What do you
think @alshedivat? Also, idk how to force the cards to have the same
height. I think it would look nicer, but my lack of web dev skills made
a difference here.
Some current screenshots:


---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
Co-authored-by: Maruan <alshedivat@users.noreply.github.com>
Fixes#1450, and the behavior of the site with this "new" code is shown
in the Expected behavior screenshots there.
I copy-pasted the redirect logic from `blog/index.html` into
`_includes/latest_posts.html`, with minor name changes.
I also cleaned up a line in `blog/index.html`.
When the dark mode is default, or if you set the page to dark mode and
then refresh, the content in "General Information" can't be seen.
This PR fixes the problem.
Since #1253 has been hanging there for a while, I decided to part from
it and add audio and video support.
---------
Signed-off-by: George Araujo <george.gcac@gmail.com>
The bibliography filename `papers.bib` is hard coded in templates, and
the equivalent setting in `_config.yml` is not used anywhere. So
changing the bib filename in `_config.yml` won't have any effects.
This PR replaces hard-coded filenames with the value from `_config.yml`.
Moved information about using this template to the beginning of the
installation part, added a few more documentation links in it, fixed
some typos.
---------
Signed-off-by: George Araújo <george.gcac@gmail.com>
majority of the recent improvements to al-folio have been truly driven
by a growing community of fans and contributors. this template has
gradually transformed from a low-key weekend project into a "public
good" of some sort used by thousands of people, university labs and
classes, and academic conference and workshops. as such, having personal
sponsorship info from the repository is no longer relevant.
as the community grows a bit further, we may have to think about
establishing some kind of governance around decisions of how al-folio is
supposed to evolve, which features to prioritize, and how to reward
contributors for their hard work. for now, these decisions will be made
by the project maintainers (active contributors are welcome to join the
team). and I'm all ears for proposals and suggestions!
By using this Github action it is possible to keep the derived
repository up-to-date with its template.
I am currently using this to keep my website up to date with the
template repository. An example of the PR this action creates can be
seen [here](https://github.com/george-gca/george-gca.github.io/pull/13).
Signed-off-by: George Araújo <george.gcac@gmail.com>
This PR changes README.md to encourage people to use `Use this template`
rather than `fork`.
### Differences between `Use this template` and fork
> - A new fork includes the entire commit history of the parent
repository, while a repository created from a template starts with a
single commit.
> - Commits to a fork don't appear in your contributions graph, while
commits to a repository created from a template do appear in your
contribution graph.
> - A fork can be a temporary way to contribute code to an existing
project, while creating a repository from a template starts a new
project quickly.
[Ref](https://docs.github.com/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)
### Cons
Possible con would be that it is harder to pull the new changes from
this repo to the users' repos. It does not seem like impossible to do so
but it will require additonal actions on the users end.
- https://github.com/orgs/community/discussions/23528
-
https://stackoverflow.com/questions/56577184/github-pull-changes-from-a-template-repository
---------
Co-authored-by: Maruan <alshedivat@users.noreply.github.com>
This makes sure that the image is resized per media type by imagemagick.
The result is still a bit too big (1400 width on desktop), but better
than nothing.
Signed-off-by: Zuhair AlSader <zalsader@hotmail.com>
This document outlines the conventions for using Git and writing commit messages in this project.
## Commit Message Format
All commit messages should follow this format:
```
<type>: <subject>
<body(optional)>
```
**Types:**
- `feat`: A new feature
- `fix`: A bug fix
- `docs`: Documentation only changes
- `style`: Changes that do not affect the meaning of the code (white-space, formatting, etc.)
- `config`: Changes to configuration files
- `chore`: Changes to the build process or auxiliary tools and libraries
**Examples:**
```
feat: Add dark mode toggle button to header
fix: Correct baseurl in project site configuration
docs: Update INSTALL.md with Docker troubleshooting
style: Format all Liquid templates with Prettier
config: Enable blog section in _config.yml
chore: Update Jekyll dependencies with bundle update --all
```
## Staging Changes
**Always `git add` files explicitly.** Do not stage everything with `git add .` unless you are certain of what's being committed. Check `git status` first to review your changes.
## What NOT to Commit
**Always obey the project's [`.gitignore`](../.gitignore) file.** It prevents the accidental commit of:
or [ask a question](https://github.com/alshedivat/al-folio/discussions/new?category=q-a).
- type:checkboxes
id:requirements
attributes:
label:Have you checked that your issue isn't already filed?
description:>
Please check if somebody else has already filed the same issue.
If you find a similar issue, please add a 👍 reaction or comment on the original post.
options:
- label:I read through [FAQ](https://github.com/alshedivat/al-folio/blob/main/FAQ.md) and searched through the [past issues](https://github.com/alshedivat/al-folio/issues), none of which addressed my issue.
required:true
- label:Yes,I have checked that this issue isn't already filed.
required:true
- type:input
attributes:
label:Bug description
description:A description of the 🐛 bug.
placeholder:A clear and concise description of what the bug is.
validations:
required:true
- type:textarea
attributes:
label:How to reproduce the bug
description:Provide steps to reproduce the 🐛 bug.
placeholder:|
Include steps to reproduce, the expected behaviour, and the actual behaviour.
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required:true
- type:textarea
attributes:
label:Error messages and logs
description:>
Provide any error messages and/or logs
placeholder:"Copy the complete error messages and logs"
value:|
```
The error message you got, with the full traceback if available. Please paste it between these triple backticks.
```
validations:
required:false
- type:dropdown
id:os
attributes:
label:What operating system are you using?
description:select all OSs where you have experienced this issue
multiple:true
options:
- Linux
- Mac
- Windows
- Not applicable (e.g. you're using GitHub Pages or other hosting)
validations:
required:true
- type:dropdown
id:environment
attributes:
label:Where are you seeing the problem on?
description:select all environments where you have experienced this issue
multiple:true
options:
- "Running locally with Docker (docker compose)"
- "Running locally with Docker (devcontainer)"
- "Running locally without Docker"
- "Deployed site"
validations:
required:true
- type:textarea
attributes:
label:More info
description:Add any other info about the issue here.
placeholder:|
Add any other context about the problem here, such as versions of the libraries if running without docker, screenshots, links to the deployed site, etc.
or [ask a question](https://github.com/alshedivat/al-folio/discussions/new?category=q-a).
- type:checkboxes
id:requirements
attributes:
label:Have you checked that your feature request isn't already filed?
description:>
Please check if somebody else has already filed the same 🚀 feature request.
If you find a similar feature request, please add a 👍 reaction or comment on the original post.
options:
- label:I read through [FAQ](https://github.com/alshedivat/al-folio/blob/main/FAQ.md) and searched through the [past issues](https://github.com/alshedivat/al-folio/issues), none of which addressed my feature request.
required:true
- label:Yes,I have checked that this feature request isn't already filed.
required:true
- type:textarea
attributes:
label:Description & Motivation
description:A clear and concise description of the 🚀 feature proposal
placeholder:|
Please outline the motivation for the proposal.
Is your feature request related to a problem? e.g., I'm always frustrated when [...].
If this is related to another GitHub issue, please link it here
- type:textarea
attributes:
label:Pitch
description:A clear and concise description of what you want to happen.
validations:
required:false
- type:textarea
attributes:
label:Alternatives
description:A clear and concise description of any alternative solutions or features you've considered, if any.
validations:
required:false
- type:textarea
attributes:
label:Additional context
description:Add any other context or screenshots about the feature request here.
- [ ] I carefully read and followed the [Getting Started](https://github.com/alshedivat/al-folio#getting-started) guide.
- [ ] I read through [FAQ](https://github.com/alshedivat/al-folio#faq) and searched through the [past issues](https://github.com/alshedivat/al-folio/issues), none of which addressed my issue.
- [ ] The issue I am raising is a potential bug in al-folio and not just a usage question. <br> [For usage questions, please post in the [Discussions](https://github.com/alshedivat/al-folio/discussions) instead of raising an issue.]
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**System (please complete the following information):**
## Community Context & Issue/Discussion References
Users may reference community discussions, issues, or past questions from the **al-folio repository** (https://github.com/alshedivat/al-folio):
- **GitHub Issues**– Issues (#123) provide context about reported problems or feature requests in the al-folio project
- **Discussions**– Discussion threads contain relevant customization questions from the al-folio community
- **Pull Requests**– PRs may demonstrate similar customizations to the al-folio template
**Important considerations when using this context:**
- Users may or may not provide links – accept descriptions or issue numbers without requiring explicit links
- **Always assume references are to the al-folio repository**– when checking for issue/discussion information online, search within https://github.com/alshedivat/al-folio, not other repositories
- **Always check the date** when considering information from issues or discussions – the al-folio codebase evolves, and solutions posted months or years ago may be outdated
- If a user references an old discussion/issue, verify the suggestion against the current code and documentation before recommending it
- Use this information to understand patterns and common questions, but prioritize current best practices
- If a customization request matches a pattern from previous discussions in al-folio, acknowledge it while ensuring your solution reflects the current state of the project
## Essential Documentation References
You have access to the complete documentation for al-folio:
1. **README.md**– Overview, features, community examples, installation basics
2. **QUICKSTART.md**– Quick start guide for getting up and running
3. **INSTALL.md**– Installation, deployment, and Docker setup instructions
- CV information (RenderCV and JSONResume formats)
- Creating pages, blog posts, projects, news items, and teaching pages
- Publications and BibTeX management
- Theme colors and styling
- Social media setup
- Search and analytics configuration
- Removing unwanted content
- Font and spacing customization
- Newsletter setup
- Google Calendar integration
5. **FAQ.md**– Frequently asked questions and common solutions
6. **TROUBLESHOOTING.md**– Troubleshooting guide for common issues
7. **CONTRIBUTING.md**– Guidelines for contributing to the project
8. **ANALYTICS.md**– Analytics and tracking configuration
9. **SEO.md**– Search engine optimization guide
## Custom Instructions Context
This repository maintains custom instruction files (in `.github/instructions/` and `.github/copilot-instructions.md`) to guide Copilot agents when working with specific file types. These instructions provide:
- **Build process and requirements**– Docker setup, Ruby/Python versions, dependency management
- **Common patterns and examples**– How to modify configuration, create content, and implement features
- **Common pitfalls and workarounds**– Solutions to frequent issues like YAML syntax errors, CSS/JS not loading, broken links
When helping users, reference these instructions to ensure recommendations align with project conventions and best practices. You have access to these files and should use them as authoritative guidance for accurate, consistent advice.
## Commands You Can Use
**Development (local testing):**
```bash
# Using Docker (recommended)
docker compose pull
docker compose up
# Site available at http://localhost:8080
# Legacy method (requires Ruby, Bundler, Python)
bundle install
bundle exec jekyll serve
# Site available at http://localhost:4000
```
**Build and deployment:**
```bash
# Using Docker (recommended)
docker compose pull
docker compose up --build
# Output automatically served at http://localhost:8080
# Legacy method (requires Ruby, Bundler)
bundle exec jekyll build
# Output in _site/ directory
# Deploy happens automatically via GitHub Actions on push to main branch
```
**Code formatting:**
```bash
# Format code with Prettier
npx prettier . --write
```
## Common Customization Tasks
### 1. Basic Site Information
**Files:** `_config.yml`, `_pages/about.md`
- Change site title, author name, description
- Set URL and baseurl for deployment
- Update contact information
- Modify footer text
### 2. Social Media & Contact
**Files:** `_data/socials.yml`, `_config.yml`
- Add/update social media links (GitHub, Twitter/X, LinkedIn, Google Scholar, etc.)
- Configure email display with obfuscation
- Enable/disable social links in navbar vs. footer
- **Choose your format:** Users can maintain either RenderCV (`_data/cv.yml`) or JSONResume (`assets/json/resume.json`), or both simultaneously
- **RenderCV (recommended):** Human-readable YAML format with automatic PDF generation via GitHub Actions, customizable styling via `assets/rendercv/` config files (`design.yaml`, `locale.yaml`, `settings.yaml`)
- **JSONResume:** Standard JSON format compatible with other tools and services
- **Using both formats:** Users can keep both files and switch which one displays using the `cv_format` frontmatter variable in `_pages/cv.md` (options: `rendercv` or `jsonresume`)
- **Single format:** To use only one format, optionally delete the unused file (both are supported equally well)
- Images: `descriptive-name.jpg/png` in `assets/img/`
- PDFs: `descriptive-name.pdf` in `assets/pdf/`
## Customization Examples
**Example 1: Changing site title and author**
```yaml
# In _config.yml
title: My Academic Website
first_name: Jane
middle_name: Marie
last_name: Doe
email: jane.doe@university.edu
```
**Example 2: Adding a new blog post**
Create `_posts/2024-11-21-my-first-post.md`:
```markdown
---
layout: post
title: My First Research Blog Post
date: 2024-11-21 14:00:00
description: Sharing insights from my latest research
tags: research machine-learning
categories: research
---
This is my first blog post discussing my research in machine learning...
```
**Example 3: Customizing theme color**
In `_sass/_themes.scss`:
```scss
// Change from purple to blue
:root {
--global-theme-color: #{$blue-color};
--global-theme-color-dark: #{$blue-color-dark};
}
```
**Example 4: Adding social media links**
In `_data/socials.yml`:
```yaml
- name: Twitter
link: https://twitter.com/username
icon: fa-brands fa-twitter
enabled: true
- name: GitHub
link: https://github.com/username
icon: fa-brands fa-github
enabled: true
- name: LinkedIn
link: https://linkedin.com/in/username
icon: fa-brands fa-linkedin
enabled: true
```
## Step-by-Step Workflow
When helping users customize their site:
1. **Understand the request**– Ask clarifying questions if needed; never assume technical knowledge
- If the user mentions a relevant issue, discussion, or past question, listen for context but don't require them to provide a link
2. **Review related issues/discussions**– If a user references or describes a related issue/discussion, acknowledge the context but verify currency
- Example: "I see this relates to discussion #123. Let me verify the current approach and address your specific needs."
- Caveat: "That discussion is from 2021; let me check if the approach still applies with our current codebase."
3. **Identify affected files**– Determine which files need modification
4. **Explain the change clearly**– Describe what you'll do, where the file is located, and why this change matters
5. **Apply changes**– Use file editing tools to make modifications
6. **Verify syntax**– Ensure YAML/Markdown/BibTeX syntax is correct
7. **Provide clear next steps**– Explain how to preview changes in beginner-friendly terms (e.g., "After I make this change, you can see it by...")
8. **Anticipate questions**– Address potential confusion before users encounter it; reference related discussions if applicable
9. **Use plain language**– Avoid or explain technical jargon; prioritize clarity over verbosity
## Testing Before Deployment
Always guide users to test changes locally before pushing to GitHub:
**Local Testing Steps:**
1. **Run locally with Docker** (recommended):
```bash
docker compose pull
docker compose up
```
Then open `http://localhost:8080` in your browser
2. **Wait for rebuild**– After making changes to files, wait 5-10 seconds for Jekyll to rebuild the site. You'll see output in the terminal indicating the rebuild is complete.
3. **Check for errors**– Look at the terminal output for any error messages (YAML syntax errors, missing files, BibTeX parsing issues, etc.).
4. **Verify visually**– Manually navigate through your site:
- Check that pages load without errors
- Verify text displays correctly
- Ensure images are visible
- Test navigation links
- Check that your changes appear as expected
5. **Test on different pages**– If you modified:
- `_config.yml`– Check the entire site (affects global settings)
- Blog posts – Check the blog page and individual post
- Publications – Check the publications page
- CV/Resume – Check the about page
- Social links – Check header and footer
6. **Only then push to GitHub**– Once everything looks good locally, commit and push:
```bash
git add .
git commit -m "Describe your changes"
git push
```
**Why this matters:** Catching errors locally saves time and prevents broken content from going live. Most issues are easy to spot in the local preview.
## Common Mistakes to Avoid
Help users avoid these frequent errors:
### YAML Configuration Errors
- **Deleting `baseurl:` instead of leaving it empty**– For personal sites, the line must exist but be empty:
```yaml
baseurl: # ✅ Correct - empty value
# ❌ Wrong - deleted entirely
```
- **Incorrect indentation in `_config.yml`**– YAML is very sensitive to spacing. Use spaces, not tabs. Each nested item should be indented by exactly 2 spaces.
- **Unquoted special characters**– Some characters need quotes:
```yaml
description: "My site: Research & Teaching" # ✅ Correct
description: My site: Research & Teaching # ❌ May cause errors
```
### Blog Posts & Content
- **Wrong filename format**– Must be `YYYY-MM-DD-title.md` (e.g., `2024-01-15-my-post.md`). If the format is wrong, the post won't appear.
- **Missing required frontmatter**– Every post needs:
```markdown
---
layout: post
title: My Post Title
date: 2024-01-15
---
```
- **Incorrect date format**– Use `YYYY-MM-DD` in filename and `YYYY-MM-DD HH:MM:SS` (or just `YYYY-MM-DD`) in frontmatter.
### Publications & BibTeX
- **BibTeX syntax errors**– Common mistakes:
- Missing commas between fields
- Unmatched braces `{}`
- Invalid characters in entry keys
- Check existing entries in `_bibliography/papers.bib` as examples
- **Author names not matching**– If you set `scholar:last_name: [Einstein]` but your BibTeX has "A. Einstein", it won't highlight. Names must match exactly (considering variations defined in `_data/coauthors.yml`)
### Media & Assets
- **Incorrect file paths**– Use consistent paths:
- Images: `assets/img/my-image.jpg`
- PDFs: `assets/pdf/my-paper.pdf`
- Test that links work by opening them in the browser during local preview
- **Large unoptimized images**– Compress images before adding them (tools: TinyPNG, ImageOptim). Large images slow down your site.
### Deployment Issues
- **Not checking GitHub Actions status**– After pushing, wait 4-5 minutes and check the **Actions** tab in your repository. If the build failed, you'll see error messages there.
- **Modifying the `gh-pages` branch directly**– Never edit this branch. It's auto-generated by GitHub Actions. All changes go to `main`.
- **Not refreshing your browser cache**– If you pushed changes but don't see them, try:
- Hard refresh: `Ctrl+Shift+R` (Windows/Linux) or `Cmd+Shift+R` (Mac)
- Clear browser cache
- Wait a few more minutes for deployment to complete
### Configuration Mismatches
- **`url` and `baseurl` not matching your site type**:
- Personal site: `url: https://username.github.io`, `baseurl:` (empty)
- Be direct and concise; avoid unnecessary examples unless they clarify significantly different use cases
- Each section should answer: "What is this?" and "How do I use it?"
- Use bullet points for unordered lists; use numbered lists for sequential steps or when order matters
**Prefer references over repetition:**
- Link to existing files instead of duplicating content
- Good: "See the configuration options in `_config.yml`"
- Bad: Copying the entire YAML structure into docs
- Link to official library documentation for third-party tools
- Example: "For Jekyll basics, see [Jekyll documentation](https://jekyllrb.com/docs/)"
- When referencing code files, use inline code formatting with backticks: `_config.yml`, `_pages/about.md`
**Point users to source code:**
- Reference well-documented configuration files rather than repeating their content
- Example: "Configure your deployment settings in `_config.yml`. For Docker deployment, see `docker-compose.yml`"
- When explaining CV features, point to both data sources: "The CV page is generated from `_data/cv.yml` (RenderCV format) or `assets/json/resume.json` (JSONResume format), which are kept in sync. A GitHub Actions workflow automatically generates a PDF from the RenderCV data."
**Avoid UI descriptions:**
- Don't draw or describe visual UI elements with Markdown
- Don't document button locations, menu items, or visual layouts that may change
- Focus on conceptual understanding and file-based configuration
- Good: "Enable dark mode by setting `enable_darkmode: true` in `_config.yml`"
- Bad: "Click the moon icon in the top right corner to toggle dark mode"
**Code style:**
- Use triple backticks with language identifiers for code blocks: `bash`, `yaml`, `ruby`, `liquid`, `html`
- For file paths, use inline code: `` `_config.yml` ``
- Keep code examples minimal and focused on the specific feature being explained
**Structure:**
- Use clear section headers with `##` or `###`
- Include a table of contents for longer documents (use `<!--ts-->` and `<!--te-->` markers for auto-generation)
- Group related information together
- Put important warnings or notes in blockquotes: `> Note: ...` or `> Warning: ...`
## Documentation file purposes
- `ANALYTICS.md`– Analytics and tracking configuration options
- `CONTRIBUTING.md`– Guidelines for contributors and development
- `FAQ.md`– Frequently asked questions and common issues
- `INSTALL.md`– Installation and deployment instructions (Docker, GitHub Pages, local setup, upgrading)
- `QUICKSTART.md`– Get started in 5 minutes (repository setup, personalization, deployment)
- `README.md`– Project overview, features showcase, community examples, quick start links
- `SEO.md`– Search engine optimization guide
- `TROUBLESHOOTING.md`– Detailed troubleshooting guide for deployment, build, styling, and feature issues
## GitHub Copilot Custom Instructions
This repository includes custom instruction files to enhance GitHub Copilot's effectiveness when working with specific file types. These files are located in `.github/instructions/` and `.github/copilot-instructions.md`:
**Main Instructions:**
- `.github/copilot-instructions.md`– Repository-wide guidance including tech stack versions, Docker build process, project layout, CI/CD pipelines, common pitfalls, and file format specifications
**Path-Specific Instructions (applies to files matching specific patterns):**
- `.github/instructions/liquid-templates.instructions.md` (applies to `**/*.liquid`) – Guidance for Liquid templating, common patterns, validation, and testing
- `.github/instructions/yaml-configuration.instructions.md` (applies to `_config.yml,_data/**/*.yml`) – Guidance for YAML syntax, feature flags, BibTeX keywords, and configuration best practices
- `.github/instructions/bibtex-bibliography.instructions.md` (applies to `**/*.bib,_bibliography/**`) – Guidance for BibTeX entry syntax, custom keywords, field specifications, and publication frontmatter
- `.github/instructions/markdown-content.instructions.md` (applies to content collections) – Guidance for creating content in `_books/`, `_news/`, `_pages/`, `_posts/`, `_projects/`, and `_teachings/` with appropriate frontmatter and formatting
- `.github/instructions/javascript-scripts.instructions.md` (applies to `_scripts/**/*.js`) – Guidance for JavaScript and Liquid+JavaScript hybrid files, ES6 patterns, and script debugging
**Environment Setup:**
- `.github/workflows/copilot-setup-steps.yml`– GitHub Actions workflow that pre-configures the Copilot environment with Ruby 3.3.5, Python 3.13, Node.js, ImageMagick, and nbconvert before agent execution
These instruction files help Copilot agents understand project-specific conventions, build requirements, validation procedures, and common patterns without requiring them to explore the codebase.
## Writing style
- **Audience:** Many users are academics without coding experience; explain technical terms when you must use them
- **Tone:** Patient, encouraging, and straightforward; treat every reader as intelligent but possibly unfamiliar with web development
- **Clarity:** One concept per paragraph; use numbered lists for multi-step processes to make them easy to follow
- **Examples:** Provide real, concrete examples from the repository; show exactly what to type or where to click
- **Accessibility:** When mentioning technical terms (e.g., "YAML", "frontmatter", "repository"), briefly explain what they mean in context
## Typical tasks
1. **Update configuration documentation** when `_config.yml` changes
2. **Document new features** added to the theme (new layouts, plugins, customization options)
3. **Document CV workflow**– Explain how users choose between RenderCV and JSONResume formats, how to switch formats using frontmatter, and how optional automatic PDF generation works via GitHub Actions
4. **Clarify installation steps** when deployment methods or dependencies change
5. **Update troubleshooting** in FAQ when common issues arise
6. **Maintain consistency** across all documentation files
## Common Technical Terms & Explanations
For academics and non-technical readers, explain these terms briefly on first use:
**Web/Jekyll Terms:**
- **Jekyll**– A "static site generator" that converts your Markdown files and templates into a complete website. Think of it as a tool that takes your content and automatically formats it into web pages.
- **Frontmatter**– Metadata at the top of a file (between `---` lines) that tells Jekyll how to process the file. Example: title, date, author.
- **Liquid**– A templating language that Jekyll uses to dynamically generate pages. You'll see it in `_layouts/` and `_includes/` files with `{% %}` syntax.
- **Markdown**– A simple text format for writing content. Much easier than HTML. Files use `.md` extension.
**Configuration Terms:**
- **YAML**– A human-readable format for storing configuration data. Uses colons and indentation. Examples in `_config.yml`, `_data/` files.
- **Configuration file**–`_config.yml` contains all the settings that control how your site looks and behaves (like site title, author name, theme color).
**Content Organization:**
- **Collection**– A group of similar content items. al-folio uses collections for `_posts/` (blog posts), `_projects/`, `_news/`, etc.
- **Repository**– The folder containing all your website code and content. Stored on GitHub for version control and deployment.
- **Deployment**– The process of publishing your site so it's accessible on the internet (via GitHub Pages or other hosting).
**Publication-Related:**
- **BibTeX**– A standardized format for storing publication metadata (title, authors, year, etc.). Used in `_bibliography/papers.bib`.
- **Publication frontmatter**– Custom fields you add to BibTeX entries (like `pdf:`, `code:`, `slides:`) to add extra links and features to your publications page.
**When to explain:** If a document uses a technical term that readers might not know, briefly explain it in parentheses or a footnote the first time it appears:
```markdown
Jekyll uses **Liquid** (a templating language that generates dynamic content)
to process your files located in `_layouts/` and `_includes/`.
```
## Boundaries
- ✅ **Always do:**
- Update documentation files (`*.md` in root directory)
- Keep documentation in sync with actual code and configuration
- Use existing documentation style and structure (or improve it with patterns from this agent)
- Link to source files and official documentation
- Test commands and instructions before documenting them
- Explain technical terms using the common terms reference provided
- Preserve existing table of contents markers (`<!--ts-->` and `<!--te-->`
- ⚠️ **Ask first:**
- Major restructuring of documentation organization
- Adding entirely new documentation files
- Changing the documentation format or style guide
**al-folio** is a simple, clean, and responsive [Jekyll](https://jekyllrb.com/) theme for academics and researchers. It enables users to create professional portfolio and blog websites with minimal configuration. The repository serves both as a template and as a reference implementation.
- **Type:** Jekyll static site generator template
- **Target Users:** Academics, researchers, and professionals
- **Type:** Conditional setup scripts (may be excluded from production builds)
- **Usage:** Loaded conditionally based on `_config.yml` feature flags
- **Integration:** Each sets up tracking code for respective analytics platforms
## File Structure & Frontmatter
All scripts in `_scripts/` may include Jekyll frontmatter:
```javascript
---
permalink: /assets/js/filename.js
---
// JavaScript code here
```
**Key frontmatter fields:**
- `permalink:`– Specifies output path in compiled site (e.g., `/assets/js/search-data.js`)
- Comments/empty – Files with only JavaScript and no frontmatter are processed as-is
**Processing:**
- `.liquid.js` files – Processed by Jekyll's Liquid engine before JavaScript compilation
- `.js` files – Processed normally, passed through to assets directory
- **Note:** Files in `_scripts/` are ignored by Prettier (see `.prettierignore`) because `.liquid.js` files mix Liquid template syntax with JavaScript, which Prettier doesn't support
## JavaScript Patterns in al-folio
### Liquid + JavaScript Mixing (in `.liquid.js` files)
- **title, first_name, last_name**– Site header and metadata
- **description**– Used in RSS feeds and metadata
- **lang**– Language code (e.g., "en", "fr")
### Feature Flags in \_config.yml
Look for `enabled: false/true` patterns. Common ones:
- `blog.enabled`
- `news.enabled`
- `profile.image_circular`
- `profile.show_social_links`
- `projects.enabled`
- `publications.enabled`
- `related_blog_posts`
### YAML Syntax Rules
- Quote string values containing special characters: `":"`
- Use `>` for multi-line strings (ignore newlines)
- Use `|` for multi-line strings (preserve newlines)
- Indentation matters: always use spaces (2 spaces), never tabs
- No tabs allowed; use only spaces
### Testing YAML Syntax
If you modify `_config.yml`, verify syntax by running:
```bash
docker compose up
# Site should start without YAML parse errors
# Check output for "YAML parse error" or "valid YAML"
```
## Data Files (\_data/\*.yml)
Data files provide structured content that templates can access via Liquid. Each file serves a specific purpose.
### socials.yml
Defines social media links and contact information displayed on the site.
**Format:** Entries are displayed in the order they are defined (not alphabetically sorted)
**For standard socials:** Use the key with the appropriate value. Common built-in socials include:
- `email:`– Email address
- `cv_pdf:`– Path to CV PDF file
- `scholar_userid:`– Google Scholar ID
- `inspirehep_id:`– Inspire HEP author ID
- `rss_icon:`– Boolean to show/hide RSS icon
- And many others (see [jekyll-socials documentation](https://github.com/george-gca/jekyll-socials) for full list)
**For custom socials:** Define a custom entry with nested fields:
- `logo:`– URL or path to logo image
- `title:`– Display name
- `url:`– Profile or website URL
**Example:**
```yaml
cv_pdf: /assets/pdf/example_pdf.pdf
email: you@example.com
scholar_userid: qc6CJjYAAAAJ
github_username: username
linkedin_username: username
custom_social:
logo: https://example.com/logo.png
title: Custom Profile
url: https://example.com/
```
For more information, see the [jekyll-socials documentation](https://github.com/george-gca/jekyll-socials).
### cv.yml
CV content in **RenderCV format** (recommended approach for generating professional CVs).
**Format:** [RenderCV](https://rendercv.com/) YAML format — human-readable and designed specifically for professional resumes with automatic PDF generation capability.
**Key Files:**
- [`_data/cv.yml`](_data/cv.yml) — Main CV content in RenderCV format
- [`assets/rendercv/design.yaml`](assets/rendercv/design.yaml) — Design and styling customization
- [`assets/rendercv/locale.yaml`](assets/rendercv/locale.yaml) — Localization and text formatting
**Usage:** Rendered by `cv.liquid` layout on CV page; displayed in `about.liquid` on home page.
**Automatic PDF Generation:** When using RenderCV format, a GitHub Actions workflow (`render-cv.yml`) automatically generates a PDF version whenever you push changes to `_data/cv.yml`. The generated PDF is saved to `assets/rendercv/rendercv_output/` and can be linked via `cv_pdf` setting in `_config.yml`.
**Alternative Format (JSONResume):** For an alternative format, see `assets/json/resume.json` which uses the [JSONResume](https://jsonresume.org/) standard. Switch between formats using the `cv_format` frontmatter variable in `_pages/cv.md` (options: `rendercv` or `jsonresume`).
**For more details:** See [CUSTOMIZE.md § Modifying the CV information](CUSTOMIZE.md#modifying-the-cv-information) for setup, switching formats, and PDF generation configuration.
### citations.yml
Social media citation counts and metrics.
**Format:** Varies by platform (Google Scholar, ORCID, etc.)
**Example:**
```yaml
scholar_userid: YOUR_SCHOLAR_ID
```
### repositories.yml
GitHub repository listing for the repositories page.
**Format:** List of repository information
**Usage:** Used by repositories page to display GitHub projects
### coauthors.yml
Co-author information for bibliography/publications.
**Mapping:** Author names to profile URLs and affiliations
# required to fetch internal or private CodeQL packs
packages:read
# only required for workflows in private repositories
actions:read
contents:read
strategy:
fail-fast:false
matrix:
include:
- language:javascript-typescript
build-mode:none
- language:ruby
build-mode:none
# CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'
# Use `c-cpp` to analyze code written in C, C++ or both
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
# Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
# To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
# see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
# If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
steps:
- name:Checkout repository
uses:actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name:Initialize CodeQL
uses:github/codeql-action/init@v3
with:
languages:${{ matrix.language }}
build-mode:${{ matrix.build-mode }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# If the analyze step fails for one of the languages you are analyzing with
# "We were unable to automatically build your code", modify the matrix above
# to set the build mode to "manual" for that language. Then modify this step
# to build your code.
# ℹ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
- if:matrix.build-mode == 'manual'
shell:bash
run:|
echo 'If you are using a "manual" build mode for one or more of the' \
'languages you are analyzing, replace this with the commands to build'\
# Description: Generates, adds & updates manually/automatically Lighthouse badges & reports from one/multiple input URL(s) to the current repository & main branch with minimal settings
A simple, clean, and responsive Jekyll theme for academics.
## Quick Links by Role
- **Are you a coding agent?** → Read [`.github/copilot-instructions.md`](.github/copilot-instructions.md) first (tech stack, build, CI/CD, common pitfalls & solutions)
- **Customizing the site?** → See [`.github/agents/customize.agent.md`](.github/agents/customize.agent.md)
- **Writing documentation?** → See [`.github/agents/docs.agent.md`](.github/agents/docs.agent.md)
Analytics help you understand your website visitors: where they come from, which pages they visit, and how they interact with your content. al-folio supports several analytics providers that you can enable in `_config.yml`.
## Supported Analytics Services
Currently implemented in al-folio:
- **Google Analytics**– Free, feature-rich, but collects user data
- **Pirsch Analytics**– GDPR-compliant, free tier available, European servers
Thank you for considering to contribute to al-folio!
Thank you for considering contributing to al-folio!
## Pull Requests
We welcome your pull requests (PRs).
For minor fixes (e.g., documentation improvements), feel free to submit a PR directly.
If you would like to implement a new feature or a bug, please make sure you (or someone else) has opened an appropriate issue first; in your PR, please mention the issue it addresses.
Note that since [#2048](https://github.com/alshedivat/al-folio/pull/2048) al-folio uses the [prettier formatter](https://prettier.io/) for its code, meaning all new submitted code must conform to its standard. If you don't have `prettier` installed for your setup and the `prettier` code check fails when submitting a PR, you can check the referred failed action in our repo. In that action there will be an artifact with an HTML diff showing the needed changes.
## GitHub Copilot Agents
This repository includes specialized GitHub Copilot agents and files to assist with development and documentation:
### CLAUDE.md
The `CLAUDE.md` file serves as an entry point for Claude (Anthropic's AI assistant) when working with this repository. It uses Claude's `@path/to/import` syntax (as described in [Claude's best practices](https://code.claude.com/docs/en/best-practices#write-an-effective-claude-md)) to dynamically import the `AGENTS.md` file. This approach keeps documentation centralized while providing a convenient entry point for AI assistants. The file simply contains:
```
@AGENTS.md
```
### Customization Agent
The **Customization Agent** (`.github/agents/customize.agent.md`) helps users customize their al-folio website. It:
- Guides you through modifying configuration files, adding content, and customizing the theme
- Explains technical concepts in plain language for users without coding experience
- Applies changes directly to your repository files
- Provides step-by-step instructions for common customization tasks
To use the customization agent, you need to have [GitHub Copilot](https://github.com/features/copilot) enabled in your repository. The agent can help with tasks like changing site information, updating your CV, adding publications, creating blog posts, customizing theme colors, and more.
### Documentation Agent
The **Documentation Agent** (`.github/agents/docs.agent.md`) maintains the project documentation. It:
- Writes clear, concise documentation for users without technical backgrounds
- Follows documentation standards and best practices
The documentation agent is primarily intended for maintainers and contributors who are updating the project documentation.
### Custom Instruction Files
To enhance GitHub Copilot's effectiveness when working with specific file types, this repository includes custom instruction files in `.github/instructions/`:
- **`.github/copilot-instructions.md`** – Main Copilot instructions with repository overview, build process, tech stack, project layout, CI/CD pipelines, and common pitfalls
- **`.github/instructions/liquid-templates.instructions.md`** – Guidance for modifying Liquid template files (`.liquid`)
- **`.github/instructions/yaml-configuration.instructions.md`** – Guidance for configuration and data files (`_config.yml`, `_data/**/*.yml`)
- **`.github/instructions/bibtex-bibliography.instructions.md`** – Guidance for bibliography files (`.bib`, `_bibliography/**`)
- **`.github/instructions/markdown-content.instructions.md`** – Guidance for content files across collections (`_books/`, `_news/`, `_pages/`, `_posts/`, `_projects/`, `_teachings/`)
- **`.github/instructions/javascript-scripts.instructions.md`** – Guidance for JavaScript files in `_scripts/`
These files help Copilot agents understand project conventions, build requirements, and development workflows without requiring codebase exploration.
### Copilot Environment Setup
A GitHub Actions workflow (`.github/workflows/copilot-setup-steps.yml`) automatically configures the Copilot environment with required dependencies (Ruby 3.3.5, Python 3.13, Node.js, ImageMagick, nbconvert) before agent execution.
### Important: Verify Agent Output
While these agents are designed to assist you, **they can make mistakes or produce incorrect information**. Always review and verify the output before applying it to your repository:
- **Review code and configuration changes**– Check that suggested modifications are correct and fit your needs
- **Test changes locally**– Before pushing to GitHub, test the changes locally (using Docker or native setup)
- **Verify syntax**– Ensure any YAML, Markdown, or configuration files have correct syntax
- **Check documentation**– If the agent generates documentation, review it for accuracy and clarity
- **Don't blindly apply changes**– Understand what changes are being made and why
- **Run your site**– After applying changes, run your site locally and verify everything works as expected
**Example:** If an agent suggests a BibTeX entry or configuration change, verify that the syntax is correct and matches the existing style in your repository before committing.
### How to Enable Agents
GitHub Copilot agents are available to users with GitHub Copilot subscriptions. To use these agents:
1. Ensure you have [GitHub Copilot](https://github.com/features/copilot) enabled for your account
2. Open your repository in an editor with GitHub Copilot support (such as VS Code with the GitHub Copilot extension)
3. The agents will be automatically available based on the configuration files in `.github/agents/`. For more information, see [Using custom agents in your IDE](https://docs.github.com/en/enterprise-cloud@latest/copilot/how-tos/use-copilot-agents/coding-agent/create-custom-agents#using-custom-agents-in-your-ide).
For more information about GitHub Copilot agents and how to use them, see the [GitHub Copilot documentation](https://docs.github.com/en/copilot).
## Issues
We use GitHub issues to track bugs and feature requests.
Before submitting an issue, please make sure:
1. You have read [the FAQ section](https://github.com/alshedivat/al-folio#faq) of the README and your question is NOT addressed there.
1. You have read [the FAQ section](FAQ.md) of the README and your question is NOT addressed there.
2. You have done your best to ensure that your issue is NOT a duplicate of one of [the previous issues](https://github.com/alshedivat/al-folio/issues).
3. Your issue is either a bug (unexpected/undesirable behavior) or a feature request.
If it is just a question, please ask it in the [Discussions](https://github.com/alshedivat/al-folio/discussions) forum.
If it is just a question, please ask it in the [Discussions](https://github.com/alshedivat/al-folio/discussions) forum.
When submitting an issue, please make sure to use the appropriate template.
## License
By contributing to al-folio, you agree that your contributions will be licensed
under the LICENSE file in the root directory of the source tree.
Here are some frequently asked questions. If you have a different question, please check if it was not already answered in the Q&A section of the [GitHub Discussions](https://github.com/alshedivat/al-folio/discussions/categories/q-a). If not, feel free to ask a new question there.
- [After I create a new repository from this template and setup the repo, I get a deployment error. Isn't the website supposed to correctly deploy automatically?](#after-i-create-a-new-repository-from-this-template-and-setup-the-repo-i-get-a-deployment-error-isnt-the-website-supposed-to-correctly-deploy-automatically)
- [I am using a custom domain (e.g., foo.com). My custom domain becomes blank in the repository settings after each deployment. How do I fix that?](#i-am-using-a-custom-domain-eg-foocom-my-custom-domain-becomes-blank-in-the-repository-settings-after-each-deployment-how-do-i-fix-that)
- [My webpage works locally. But after deploying, it fails to build and throws Unknown tag 'toc'. How do I fix that?](#my-webpage-works-locally-but-after-deploying-it-fails-to-build-and-throws-unknown-tag-toc-how-do-i-fix-that)
- [My webpage works locally. But after deploying, it is not displayed correctly (CSS and JS are not loaded properly). How do I fix that?](#my-webpage-works-locally-but-after-deploying-it-is-not-displayed-correctly-css-and-js-are-not-loaded-properly-how-do-i-fix-that)
- [My site doesn't work when I enable related_blog_posts. Why?](#my-site-doesnt-work-when-i-enable-related_blog_posts-why)
- [When trying to deploy, it's asking for github login credentials, which github disabled password authentication and it exits with an error. How to fix?](#when-trying-to-deploy-its-asking-for-github-login-credentials-which-github-disabled-password-authentication-and-it-exits-with-an-error-how-to-fix)
- [When I manually run the Lighthouse Badger workflow, it fails with Error: Input required and not supplied: token. How do I fix that?](#when-i-manually-run-the-lighthouse-badger-workflow-it-fails-with-error-input-required-and-not-supplied-token-how-do-i-fix-that)
- [My code runs fine locally, but when I create a commit and submit it, it fails with prettier code formatter workflow run failed for main branch. How do I fix that?](#my-code-runs-fine-locally-but-when-i-create-a-commit-and-submit-it-it-fails-with-prettier-code-formatter-workflow-run-failed-for-main-branch-how-do-i-fix-that)
- [After I update my site with some new content, even a small change, the GitHub action throws an error or displays a warning. What happened?](#after-i-update-my-site-with-some-new-content-even-a-small-change-the-github-action-throws-an-error-or-displays-a-warning-what-happened)
- [I am trying to deploy my site, but it fails with Could not find gem 'jekyll-diagrams' in locally installed gems. How do I fix that?](#i-am-trying-to-deploy-my-site-but-it-fails-with-could-not-find-gem-jekyll-diagrams-in-locally-installed-gems-how-do-i-fix-that)
- [How can I update Academicons version on the template](#how-can-i-update-academicons-version-on-the-template)
- [How can I update Font Awesome version on the template](#how-can-i-update-font-awesome-version-on-the-template)
- [What do all these GitHub actions/workflows mean?](#what-do-all-these-github-actionsworkflows-mean)
- [How can I use Google Search Console ID on the template?](#how-can-i-use-google-search-console-id-on-the-template)
- [What are Code Wiki and DeepWiki?](#what-are-code-wiki-and-deepwiki)
- [When to use these tools](#when-to-use-these-tools)
- [What they do](#what-they-do)
- [Limitations](#limitations)
- [Access these tools](#access-these-tools)
<!--te-->
## After I create a new repository from this template and setup the repo, I get a deployment error. Isn't the website supposed to correctly deploy automatically?
Yes, if you are using release `v0.3.5` or later, the website will automatically and correctly re-deploy right after your first commit. Please make some changes (e.g., change your website info in `_config.yml`), commit, and push. Make sure to follow [deployment instructions](https://github.com/alshedivat/al-folio#deployment). (Relevant issue: [209](https://github.com/alshedivat/al-folio/issues/209#issuecomment-798849211).)
## I am using a custom domain (e.g., `foo.com`). My custom domain becomes blank in the repository settings after each deployment. How do I fix that?
You need to add `CNAME` file to the `main` or `source` branch of your repository. The file should contain your custom domain name. (Relevant issue: [130](https://github.com/alshedivat/al-folio/issues/130).)
## My webpage works locally. But after deploying, it fails to build and throws `Unknown tag 'toc'`. How do I fix that?
Make sure you followed through the [deployment instructions](#deployment) in the previous section. You should have set the deployment branch to `gh-pages`. (Related issue: [1438](https://github.com/alshedivat/al-folio/issues/1438).)
## My webpage works locally. But after deploying, it is not displayed correctly (CSS and JS are not loaded properly). How do I fix that?
If the website does not load the theme, the layout looks weird, and all links are broken, being the main page displayed this way:
make sure to correctly specify the `url` and `baseurl` paths in `_config.yml`. Set `url` to `https://<your-github-username>.github.io` or to `https://<your.custom.domain>` if you are using a custom domain. If you are deploying a <ins>personal</ins> or <ins>organization</ins> website, leave `baseurl`**empty** (do **NOT** delete it). If you are deploying a project page, set `baseurl: /<your-project-name>/`. If all previous steps were done correctly, all is missing is for your browser to fetch again the site stylesheet. For this, you can:
- press [Shift + F5 on Chromium-based](https://support.google.com/chrome/answer/157179#zippy=%2Cwebpage-shortcuts) or [Ctrl + F5 on Firefox-based](https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly) browsers to reload the page ignoring cached content
- clean your browser history
- simply try it in a private session, here's how to do it in [Chrome](https://support.google.com/chrome/answer/95464) and [Firefox](https://support.mozilla.org/en-US/kb/private-browsing-use-firefox-without-history)
## Atom feed doesn't work. Why?
Make sure to correctly specify the `url` and `baseurl` paths in `_config.yml`. RSS Feed plugin works with these correctly set up fields: `title`, `url`, `description` and `author`. Make sure to fill them in an appropriate way and try again.
## My site doesn't work when I enable `related_blog_posts`. Why?
This is probably due to the [classifier reborn](https://github.com/jekyll/classifier-reborn) plugin, which is used to calculate related posts. If the error states `Liquid Exception: Zero vectors can not be normalized...` or `sqrt': Numerical argument is out of domain - "sqrt"`, it means that it could not calculate related posts for a specific post. This is usually caused by [empty or minimal blog posts](https://github.com/jekyll/classifier-reborn/issues/64) without meaningful words (i.e. only [stop words](https://en.wikipedia.org/wiki/Stop_words)) or even [specific characters](https://github.com/jekyll/classifier-reborn/issues/194) you used in your posts. Also, the calculus for similar posts are made for every `post`, which means every page that uses `layout: post`, including the announcements. To change this behavior, simply add `related_posts: false` to the front matter of the page you don't want to display related posts on. Another solution is to disable the lsi (latent semantic indexing) entirely by setting the `lsi` flag to `false` in `_config.yml`. Related issue: [#1828](https://github.com/alshedivat/al-folio/issues/1828).
## When trying to deploy, it's asking for github login credentials, which github disabled password authentication and it exits with an error. How to fix?
Open .git/config file using your preferred editor. Change the `https` portion of the `url` variable to `ssh`. Try deploying again.
## When I manually run the Lighthouse Badger workflow, it fails with `Error: Input required and not supplied: token`. How do I fix that?
You need to [create a personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token) and [add it as a secret](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-encrypted-secrets-for-a-repository) named `LIGHTHOUSE_BADGER_TOKEN` to your repository. For more information, check [lighthouse-badger documentation](https://github.com/MyActionWay/lighthouse-badger-workflows#lighthouse-badger-easyyml) on how to do this.
## My code runs fine locally, but when I create a commit and submit it, it fails with `prettier code formatter workflow run failed for main branch`. How do I fix that?
We implemented support for [Prettier code formatting](https://prettier.io/) in [#2048](https://github.com/alshedivat/al-folio/pull/2048). It basically ensures that your code is [well formatted](https://prettier.io/docs/en/). If you want to ensure your code is compliant with `Prettier`, you have a few options:
- if you are running locally with `Docker` and using [development containers](https://github.com/alshedivat/al-folio/blob/main/INSTALL.md#local-setup-with-development-containers), `Prettier` is already included
- if you don't use `Docker`, it is simple to integrate it with your preferred IDE using an [extension](https://prettier.io/docs/en/editors)
- if you want to run it manually, you can follow the first 2 steps in [this tutorial](https://george-gca.github.io/blog/2023/slidev_for_non_web_devs/) (`Installing node version manager (nvm)` and `Installing Node (latest version)`), then, install it using `npm install prettier` inside the project directory, or install it globally on your computer using `npm install -g prettier`. To run `Prettier` on your current directory use `npx prettier . --write`.
You can also disable it for your repo. For this, just delete the file [.github/workflows/prettier.yml](https://github.com/alshedivat/al-folio/blob/main/.github/workflows/prettier.yml).
## After I update my site with some new content, even a small change, the GitHub action throws an error or displays a warning. What happened?
Probably your GitHub workflow is throwing an error like this:
```bash
/opt/hostedtoolcache/Ruby/3.0.2/x64/lib/ruby/gems/3.0.0/gems/bundler-2.5.5/lib/bundler/runtime.rb:304:in `check_for_activated_spec!': You have already activated uri 0.10.1, but your Gemfile requires uri 0.13.0. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError)
```
or maybe displaying a warning like one of these:
```
Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20: actions/checkout@v3. For more information see: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.
Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20: actions/checkout@v2, actions/cache@v2. For more information see: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.
The following actions uses node12 which is deprecated and will be forced to run on node16: actions/checkout@v2, actions/cache@v2. For more info: https://github.blog/changelog/2023-06-13-github-actions-all-actions-will-run-on-node16-instead-of-node12-by-default/
The `set-output` command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more information see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
```
If that's the case, you are using deprecated libraries/commands. This happens because you are using a very old version of al-folio. To fix this it is recommended [upgrading your code to the latest version](INSTALL.md#upgrading-from-a-previous-version) of the template. You will probably need to do some manual merging. If you find it easier, you could create a copy of your repository, do a fresh installation from the template and reapply all your changes. For this I would recommend a tool like [meld](https://meldmerge.org/) or [winmerge](https://winmerge.org/) to check the differences between directories/files.
Note that libraries tend to be deprecated and support for them dropped as they are no longer maintained, and keep using them involves security breaches. Also, some of these deprecations are enforced, for example, by GitHub itself, so there's so much we can do. We have also added tons of new functionality, as well as tidying things up and improving the overall speed and structure, so you could also benefit from these improvements.
## I am trying to deploy my site, but it fails with `Could not find gem 'jekyll-diagrams' in locally installed gems`. How do I fix that?
`jekyll-diagrams` support was dropped in [#1992](https://github.com/alshedivat/al-folio/pull/1992) in favor of using `mermaid.js` directly. Simply [update your code](INSTALL.md#upgrading-from-a-previous-version) to get the latest changes.
## How can I update Academicons version on the template
To update the Academicons version, you need to download the latest release from the [Academicons website](https://jpswalsh.github.io/academicons/). After downloading, extract the zip file and copy the files `academicons.ttf` and `academicons.woff` from the `fonts/` directory to `assets/fonts/` and the file `academicons.min.css` from the `css/` directory to `assets/css/`.
## How can I update Font Awesome version on the template
To update the Font Awesome version, you need to download the latest release "for the web" from the [Font Awesome website](https://fontawesome.com/download). After downloading, extract the zip file and copy the `scss/` directory content to `_sass/font-awesome/` and the `webfonts/` content to `assets/webfonts/`.
## What do all these GitHub actions/workflows mean?
GitHub actions are a way to automate tasks in the repository. They are defined in `.github/workflows/` directory. Each file in this directory is a workflow. Workflows are made up of one or more jobs, and each job runs on a virtual machine hosted by GitHub. You can see the status of the workflows in the `Actions` tab of your repository. For more information, check the [GitHub Actions documentation](https://docs.github.com/en/actions).
Currently we have the following workflows:
- `axe.yml`: does some accessibility testing in your site. It uses the [axe cli](https://github.com/dequelabs/axe-core-npm/tree/develop/packages/cli) tool with a chrome driver to render the webpage and allow the analysis. Must be run manually, since fixing some of the issues is not straightforward
- `broken-links-site.yml`: checks for broken links in your built website with the [lychee-action](https://github.com/lycheeverse/lychee-action)
- `broken-links.yml`: checks for broken links in your repository with the [lychee-action](https://github.com/lycheeverse/lychee-action)
- `deploy-docker-tag.yml`: adds some metadata to the docker image and pushes it to Docker Hub
- `deploy-image.yml`: deploys a new docker image with the latest changes to Docker Hub
- `deploy.yml`: deploys the website to GitHub Pages
- `docker-slim.yml`: deploys a smaller version of the docker image to Docker Hub with the [docker-slim-action](https://github.com/kitabisa/docker-slim-action)
- `lighthouse-badger.yml`: runs a [lighthouse](https://github.com/GoogleChrome/lighthouse) test for your site with the [lighthouse-badger-action](https://github.com/MyActionWay/lighthouse-badger-action), saving the results in the repository for easy inspecting, as can be seen [here](https://github.com/alshedivat/al-folio?tab=readme-ov-file#lighthouse-pagespeed-insights). For more information on how to enable this workflow, check our [FAQ question about it](https://github.com/alshedivat/al-folio/blob/main/FAQ.md#when-i-manually-run-the-lighthouse-badger-workflow-it-fails-with-error-input-required-and-not-supplied-token-how-do-i-fix-that)
- `prettier-comment-on-pr.yml`: not working. For now, this action is disabled. It was supposed to run prettier on the PRs and comment on them with the changes needed. For more information, check [issue 2115](https://github.com/alshedivat/al-folio/issues/2115)
- `prettier.yml`: runs [prettier](https://prettier.io/) on the code to ensure it is well formatted. For more information, check our [FAQ question about it](https://github.com/alshedivat/al-folio/blob/main/FAQ.md#my-code-runs-fine-locally-but-when-i-create-a-commit-and-submit-it-it-fails-with-prettier-code-formatter-workflow-run-failed-for-main-branch-how-do-i-fix-that)
## How can I use Google Search Console ID on the template?
In the configuration file `_config.yml` the tag `google-site-verification` should be updated to use this functionality. Here is how you can proceed,
- Generate your HTML tag by following [https://support.google.com/webmasters/answer/9008080?hl=en#meta_tag_verification&zippy=%2Chtml-tag](https://support.google.com/webmasters/answer/9008080?hl=en#meta_tag_verification&zippy=%2Chtml-tag) with URL prefix option.
- In the verify ownership option choose HTML tag and copy the tag contents which should look like `<meta name="google-site-verification" content="GoogleSearchConsoleID" />`.
- The string against `content` is the Google Search Console ID that can be used in the template. e.g. `google-site-verification: GoogleSearchConsoleID`. Now set the property `enable_google_verification: true`.
It looks like the Domain type property in the Google Search Console to verify the ownership of all URLs across all subdomains with GitHub Pages does not work.
## What are Code Wiki and DeepWiki?
**Code Wiki** and **DeepWiki** are AI-powered tools that help you understand GitHub repositories through interactive documentation. They should be treated as supplementary resources when you cannot find the information you need in the official project documentation.
### When to use these tools
**Use Code Wiki and DeepWiki only after**:
- You have reviewed the relevant documentation files in this repository (`README.md`, `INSTALL.md`, `CUSTOMIZE.md`, `FAQ.md`, or `CONTRIBUTING.md`)
- You have checked the [GitHub Discussions Q&A section](https://github.com/alshedivat/al-folio/discussions/categories/q-a) for similar questions
- You have searched existing [GitHub Issues](https://github.com/alshedivat/al-folio/issues)
### What they do
**Code Wiki** (powered by Google Gemini) generates interactive documentation from your repository code. It allows you to:
- Browse your repository's structure and architecture
- Search for specific functions or modules
- Understand how different parts of the codebase work together
- Get diagrams and visual representations of your code architecture
**DeepWiki** provides an AI-powered interface to ask questions about a repository, similar to having an engineer available 24/7. It allows you to:
- Ask natural language questions about the codebase
- Get instant answers about how specific features work
- Search for code patterns and implementations
### Limitations
These tools are generated automatically from our code and may not always reflect the most current documentation standards or best practices specific to this project. They should not replace official documentation but rather complement it when you need deeper technical insights.
### Access these tools
- **Code Wiki**: [Code Wiki for al-folio](https://codewiki.google/github.com/alshedivat/al-folio)
- **DeepWiki**: [DeepWiki for al-folio](https://deepwiki.com/alshedivat/al-folio)
- [Upgrading from a previous version](#upgrading-from-a-previous-version)
<!--te-->
## Recommended Approach
The recommended approach for using **al-folio** is to first create your own site using the template with as few changes as possible, and only when it is up and running customize it however you like. This way it is easier to pinpoint what causes a potential issue in case of a bug.
**For the quickest setup**, follow the [Quick Start Guide](QUICKSTART.md), which will have you up and running in 5 minutes.
### Template vs. Fork: Which Should I Use?
**Use the "Use this template" button** (recommended) when creating your own al-folio site. This creates a clean, independent copy that is not linked to the main al-folio repository.
**If you already forked the repository**, your fork will work fine, but you should be aware of a common pitfall:
- Forks maintain a connection to the original repository, which can make it easy to accidentally submit pull requests to al-folio with your personal site changes
- **Solution:** When making changes to your fork, always create a new branch (e.g., `git checkout -b my-site-updates`) and verify that you're pushing to **your own fork** before submitting pull requests
- Only submit pull requests to `alshedivat/al-folio` if you're intentionally contributing improvements that benefit the entire al-folio community
### Important Notes for GitHub Pages Sites
If you plan to upload your site to `<your-github-username>.github.io`, the repository name :warning: **MUST BE** :warning: `<your-github-username>.github.io` or `<your-github-orgname>.github.io`, as stated in the [GitHub pages docs](https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages#types-of-github-pages-sites).
When configuring `_config.yml`, set `url` to `https://<your-github-username>.github.io` and leave `baseurl`**empty** (do NOT delete it), setting it as `baseurl:`.
### Automatic Deployment
Starting version [v0.3.5](https://github.com/alshedivat/al-folio/releases/tag/v0.3.5), **al-folio** will automatically re-deploy your webpage each time you push new changes to your repository! :sparkles:
### Local Development
Once everything is deployed, you can download the repository to your machine and start customizing it locally:
See [Local setup using Docker](#local-setup-using-docker-recommended) or other sections below for local development options.
## Local setup on Windows
If you are using Windows, it is **highly recommended** to use [Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/install), which is a compatibility layer for running Linux on top of Windows. You can follow [these instructions](https://ubuntu.com/tutorials/install-ubuntu-on-wsl2-on-windows-11-with-gui-support) to install WSL and Ubuntu on your machine. You only need to go up to the step 4 of the tutorial (you don't have to enable the optional `systemd` nor the graphical applications), and then you can follow the instructions below to install docker. You can install docker natively on Windows as well, but it has been having some issues as can be seen in [#1540](https://github.com/alshedivat/al-folio/issues/1540), [#2007](https://github.com/alshedivat/al-folio/issues/2007).
## Local setup using Docker (Recommended)
Using Docker to install Jekyll and Ruby dependencies is the easiest way.
You need to take the following steps to get `al-folio` up and running on your local machine:
- First, install [docker](https://docs.docker.com/get-docker/) and [docker-compose](https://docs.docker.com/compose/install/).
- Finally, run the following command that will pull the latest pre-built image from DockerHub and will run your website.
```bash
docker compose pull
docker compose up
```
Note that when you run it for the first time, it will download a docker image of size 400MB or so. To see the template running, open your browser and go to `http://localhost:8080`. You should see a copy of the theme's demo website.
Now, feel free to customize the theme however you like (don't forget to change the name!). Also, your changes should be automatically rendered in real-time (or maybe after a few seconds).
> Beta: You can also use the slimmed docker image with a size below 100MBs and exact same functionality. Just use `docker compose -f docker-compose-slim.yml up`
### Build your own docker image
> Note: this approach is only necessary if you would like to build an older or very custom version of al-folio.
Build and run a new docker image using:
```bash
docker compose up --build
```
> If you want to update jekyll, install new ruby packages, etc., all you have to do is build the image again using `--force-recreate` argument at the end of the previous command! It will download Ruby and Jekyll and install all Ruby packages again from scratch.
If you want to use a specific docker version, you can do so by changing the version tag to `your_version` in `docker-compose.yaml` (the `v0.16.3` in `image: amirpourmand/al-folio:v0.16.3`). For example, you might have created your website on `v0.10.0` and you want to stick with that.
### Have Bugs on Docker Image?
Sometimes, there might be some bugs in the current docker image. It might be version mismatch or anything. If you want to debug and easily solve the problem for yourself you can do the following steps:
```
docker compose up -d
docker compose logs
```
Then you can see the bug! You can enter the container via this command:
```
docker compose exec -it jekyll /bin/bash
```
Then you can run the script:
```
./bin/entry_point.sh
```
You might see problems for package dependecy or something which is not available. You can fix it now by using
```
bundle install
./bin/entry_point.sh
```
Most likely, this will solve the problem but it shouldn't really happen. So, please open a bug report for us.
For example, when you open the repository with Visual Studio Code (VSCode), it prompts you to install the necessary extension and automatically install everything necessary.
## Local Setup (Legacy, no longer supported)
For a hands-on walkthrough of running al-folio locally without using Docker, check out [this cool blog post](https://george-gca.github.io/blog/2022/running-local-al-folio/) by one of the community members!
Assuming you have [Ruby](https://www.ruby-lang.org/en/downloads/) and [Bundler](https://bundler.io/) installed on your system (_hint: for ease of managing ruby gems, consider using [rbenv](https://github.com/rbenv/rbenv)_), and also [Python](https://www.python.org/) and [pip](https://pypi.org/project/pip/) (_hint: for ease of managing python packages, consider using a virtual environment, like [venv](https://docs.python.org/pt-br/3/library/venv.html) or [conda](https://docs.conda.io/en/latest/)_).
```bash
bundle install
# assuming pip is your Python package manager
pip install jupyter
bundle exec jekyll serve
```
To see the template running, open your browser and go to `http://localhost:4000`. You should see a copy of the theme's [demo website](https://alshedivat.github.io/al-folio/). Now, feel free to customize the theme however you like. After you are done, remember to **commit** your final changes.
## Deployment
Deploying your website to [GitHub Pages](https://pages.github.com/) is the most popular option.
Starting version [v0.3.5](https://github.com/alshedivat/al-folio/releases/tag/v0.3.5), **al-folio** will automatically re-deploy your webpage each time you push new changes to your repository **main branch**! :sparkles:
### For personal and organization webpages
1. The name of your repository **MUST BE**`<your-github-username>.github.io` or `<your-github-orgname>.github.io`.
2. In `_config.yml`, set `url` to `https://<your-github-username>.github.io` and leave `baseurl` empty.
3. Set up automatic deployment of your webpage (see instructions below).
4. Make changes to your main branch, commit, and push!
5. After deployment, the webpage will become available at `<your-github-username>.github.io`.
### For project pages
1. In `_config.yml`, set `url` to `https://<your-github-username>.github.io` and `baseurl` to `/<your-repository-name>/`.
2. Set up automatic deployment of your webpage (see instructions below).
3. Make changes to your main branch, commit, and push!
4. After deployment, the webpage will become available at `<your-github-username>.github.io/<your-repository-name>/`.
### Enabling automatic deployment
1. Click on **Actions** tab and **Enable GitHub Actions**; do not worry about creating any workflows as everything has already been set for you.
2. Go to `Settings -> Actions -> General -> Workflow permissions`, and give `Read and write permissions` to GitHub Actions
3. Make any other changes to your webpage, commit, and push to your main branch. This will automatically trigger the **Deploy** action.
4. Wait for a few minutes and let the action complete. You can see the progress in the **Actions** tab. If completed successfully, in addition to the `main` branch, your repository should now have a newly built `gh-pages` branch. **Do NOT touch this branch!**
5. Finally, in the **Settings** of your repository, in the Pages section, set the branch to `gh-pages` (**NOT** to `main`). For more details, see [Configuring a publishing source for your GitHub Pages site](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#choosing-a-publishing-source).
If you keep your site on another branch, open `.github/workflows/deploy.yml`**on the branch you keep your website on** and change `on->push->branches` and `on->pull\_request->branches` to the branch you keep your website on. This will trigger the action on pulls/pushes on that branch. The action will then deploy the website on the branch it was triggered from.
### Manual deployment to GitHub Pages
If you need to manually re-deploy your website to GitHub pages, go to Actions, click "Deploy" in the left sidebar, then "Run workflow."
### Deploy on [Netlify](https://www.netlify.com/)
1. [Use this template -> Create a new repository](https://github.com/new?template_name=al-folio&template_owner=alshedivat).
2. Netlify: **Add new site** -> **Import an existing project** -> **GitHub** and give Netlify access to the repository you just created.
3. Netlify: In the deploy settings
- Set **Branch to deploy** to `main`
- **Base directory** is empty
- Set **Build command** to `sed -i "s/^\(baseurl: \).*$/baseurl:/" _config.yml && bundle exec jekyll build`
- Set **Publish directory** to `_site`
4. Netlify: Add the following two **environment variables**
| `RUBY_VERSION` | set to the Ruby version found in `.github/workflows/deploy.yml` (for example, `3.3.5`) |
5. Netlify: Click **Deploy** and wait for the site to be published. If you want to use your own domain name, follow the steps in [this documentation](https://docs.netlify.com/domains-https/custom-domains/).
### Deployment to another hosting server (non GitHub Pages)
If you decide to not use GitHub Pages and host your page elsewhere, simply run:
```bash
bundle exec jekyll build
```
which will (re-)generate the static webpage in the `_site/` folder.
Then simply copy the contents of the `_site/` directory to your hosting server.
If you also want to remove unused css classes from your file, run:
```bash
purgecss -c purgecss.config.js
```
which will replace the css files in the `_site/assets/css/` folder with the purged css files.
**Note:** Make sure to correctly set the `url` and `baseurl` fields in `_config.yml` before building the webpage. If you are deploying your webpage to `your-domain.com/your-project/`, you must set `url: your-domain.com` and `baseurl: /your-project/`. If you are deploying directly to `your-domain.com`, leave `baseurl` blank, **do not delete it**.
### Deployment to a separate repository (advanced users only)
**Note:** Do not try using this method unless you know what you are doing (make sure you are familiar with [publishing sources](https://help.github.com/en/github/working-with-github-pages/about-github-pages#publishing-sources-for-github-pages-sites)). This approach allows to have the website's source code in one repository and the deployment version in a different repository.
Let's assume that your website's publishing source is a `publishing-source` subdirectory of a git-versioned repository cloned under `$HOME/repo/`.
For a user site this could well be something like `$HOME/<user>.github.io`.
Firstly, from the deployment repo dir, checkout the git branch hosting your publishing source.
Then from the website sources dir (commonly your al-folio fork's clone):
This will instruct jekyll to deploy the website under `$HOME/repo/publishing-source`.
**Note:** Jekyll will clean `$HOME/repo/publishing-source` before building!
The quote below is taken directly from the [jekyll configuration docs](https://jekyllrb.com/docs/configuration/options/):
> Destination folders are cleaned on site builds
>
> The contents of `<destination>` are automatically cleaned, by default, when the site is built. Files or folders that are not created by your site will be removed. Some files could be retained by specifying them within the `<keep_files>` configuration directive.
>
> Do not use an important location for `<destination>`; instead, use it as a staging area and copy files from there to your web server.
If `$HOME/repo/publishing-source` contains files that you want jekyll to leave untouched, specify them under `keep_files` in `_config.yml`.
In its default configuration, al-folio will copy the top-level `README.md` to the publishing source. If you want to change this behavior, add `README.md` under `exclude` in `_config.yml`.
**Note:** Do _not_ run `jekyll clean` on your publishing source repo as this will result in the entire directory getting deleted, irrespective of the content of `keep_files` in `_config.yml`.
## Maintaining Dependencies
**al-folio** uses **Bundler** (a Ruby dependency manager) to keep track of Ruby packages (called "gems") needed to run Jekyll and its plugins.
**To update all dependencies:**
```bash
bundle update --all
```
**After updating:**
1. Rebuild the Docker image to apply changes: `docker compose up --build`
2. Test locally to ensure everything still works: `docker compose up`
3. Visit `http://localhost:8080` and verify the site renders correctly
4. If your site fails after updating, check the [FAQ](FAQ.md) for troubleshooting
**For Ruby/Python environment issues:**
- Always use Docker for consistency with CI/CD (see [Local setup using Docker](#local-setup-using-docker-recommended))
- Avoid manual Ruby/Python installation when possible
## Upgrading from a previous version
If you installed **al-folio** as described above, you can manually update your code by following the steps below:
```bash
# Assuming the current directory is <your-repo-name>
If you have extensively customized a previous version, it might be trickier to upgrade.
You can still follow the steps above, but `git rebase` may result in merge conflicts that must be resolved.
See [git rebase manual](https://help.github.com/en/github/using-git/about-git-rebase) and how to [resolve conflicts](https://help.github.com/en/github/using-git/resolving-merge-conflicts-after-a-git-rebase) for more information.
If rebasing is too complicated, we recommend re-installing the new version of the theme from scratch and port over your content and changes from the previous version manually. You can use tools like [meld](https://meldmerge.org/)
or [winmerge](https://winmerge.org/) to help in this process.
- [Step 4: View Your Site (1 min)](#step-4-view-your-site-1-min)
- [What's Next?](#whats-next)
- [Add Your Content](#add-your-content)
- [Customize Appearance](#customize-appearance)
- [Learn More](#learn-more)
- [Get Help from AI](#get-help-from-ai)
<!--te-->
## Step 1: Create Your Repository (1 min)
**⚠️ Important:** Use the **"Use this template"** button, NOT the fork button. This ensures your site is independent and you won't accidentally submit your personal changes back to the al-folio project.
1. Go to the [al-folio repository](https://github.com/alshedivat/al-folio)
2. Click the green **"Use this template"** button (top right), then select **"Create a new repository"**
3. Name your repository:
- **Personal/Organization site (if you want your site to be at `username.github.io`):**`username.github.io` (replace `username` with your GitHub username)
- **Project site (if you want your site to be at `username.github.io/project-name`):** Any name (e.g., `my-research-website`)
4. Click **"Create repository from template"**
**Already forked by mistake?** No problem. Your fork will work fine—just be careful when making changes. Create a new branch for your updates (e.g., `git checkout -b my-site-updates`) and make sure you push to **your own repository**, not the main al-folio project.
## Step 2: Configure Deployment (1 min)
1. Go to your new repository → **Settings** → **Actions** → **General** → **Workflow permissions**
2. Select **Read and write permissions**
3. Click **Save**
## Step 3: Personalize (2 min)
1. Open `_config.yml` in your repository
2. Update these fields:
```yaml
title: My Website
first_name: Your
last_name: Name
url: https://your-username.github.io # or your custom domain
baseurl: # Leave this empty (do NOT delete it)
```
3. Click **Commit changes** (at the bottom of the page)
## Step 4: View Your Site (1 min)
1. Go to your repository → **Actions** tab
2. Wait for the "Deploy site" workflow to complete (look for a green checkmark, ~4 minutes)
3. Go to **Settings** → **Pages** → **Build and deployment**
4. Make sure **Source** is set to **Deploy from a branch**
5. Set the branch to **gh-pages** (NOT main)
6. Wait for the "pages-build-deployment" workflow to complete (~45 seconds)
7. Visit `https://your-username.github.io` in your browser
**That's it!** Your site is live. You now have a working al-folio website.
---
## What's Next?
Once your site is running, explore these customization options:
### Add Your Content
- **Profile picture:** Replace `assets/img/prof_pic.jpg` with your photo
- **About page:** Edit `_pages/about.md` to write your bio
- **Publications:** Add entries to `_bibliography/papers.bib`
- **Blog posts:** Create files in `_posts/` with format `YYYY-MM-DD-title.md`
### Customize Appearance
- **Theme color:** Edit `_config.yml`, search for `theme_color`
- **Enable/disable sections:** In `_config.yml`, look for `enabled: false/true` options
- **Social media links:** Edit `_data/socials.yml`
### Learn More
- Installation and local setup options: [INSTALL.md](INSTALL.md)
- Full customization guide: [CUSTOMIZE.md](CUSTOMIZE.md)
This guide covers common issues and their solutions. For more information, see [FAQ.md](FAQ.md) or check [GitHub Discussions](https://github.com/alshedivat/al-folio/discussions).
<!--ts-->
- [Troubleshooting Guide](#troubleshooting-guide)
- [Deployment Issues](#deployment-issues)
- [Site fails to deploy on GitHub Pages](#site-fails-to-deploy-on-github-pages)
- [Custom domain becomes blank after deployment](#custom-domain-becomes-blank-after-deployment)
- [GitHub Actions: "Unknown tag 'toc'" error](#github-actions-unknown-tag-toc-error)
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sollicitudin eros sit amet ante aliquet, sit amet vulputate lectus mattis. Aenean ullamcorper pretium nunc, sed egestas lorem elementum id. Nulla id mi id neque ultrices egestas ut in urna. Sed ac ultricies nunc. Nam convallis placerat urna id egestas. Nulla porta, est interdum vestibulum venenatis, lorem odio laoreet sapien, in pulvinar tellus eros a dolor. Vivamus sapien justo, ullamcorper a mi eget, scelerisque euismod nunc. In augue augue, ultrices a ornare non, tincidunt quis justo. Donec sit amet consectetur eros. Nullam neque leo, tincidunt id ipsum ac, volutpat lobortis mi. Phasellus consequat ultricies arcu, eu semper ligula ultrices eget. Ut in fringilla elit, ac tincidunt nisi.
Nunc commodo elit nec turpis feugiat consectetur. Nullam in nisi egestas, fermentum ligula hendrerit, euismod enim. Nulla eu hendrerit eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin et velit ante. Vestibulum pretium vitae quam et sagittis. Proin eu nunc vel velit accumsan eleifend. Nulla facilisis, diam tempus imperdiet ultrices, massa ipsum consequat orci, sed efficitur eros mi a felis. Cras lobortis turpis sem, sed lobortis nunc ullamcorper tristique. Nam vehicula rhoncus ante, in faucibus sapien scelerisque et. Donec semper libero et tincidunt mattis. In vestibulum, nulla pretium dictum commodo, risus nulla vestibulum felis, at tincidunt massa mi in odio. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
Donec efficitur ultrices purus sit amet imperdiet. Nam consequat metus in erat sodales faucibus. Aliquam maximus fermentum nulla id finibus. Aliquam iaculis sed odio vel rutrum. Curabitur sed odio est. Praesent nec sollicitudin tortor. Praesent pharetra, turpis quis porttitor rhoncus, ante massa fringilla lacus, nec porttitor magna turpis vitae felis. Nullam tristique massa id odio imperdiet, nec sodales massa egestas. Proin nisi metus, euismod sed accumsan vitae, facilisis vel risus. Morbi suscipit auctor erat, nec viverra elit fringilla eu. Mauris congue, purus id tristique facilisis, felis nisi efficitur magna, eu consectetur augue sem vitae lacus. Aliquam erat volutpat. Cras at nibh ultricies, volutpat arcu vitae, dictum est. In ac dolor sagittis, egestas lectus et, semper nisl. Etiam consectetur purus vitae sapien porttitor auctor.
Nulla sit amet venenatis odio. Suspendisse ac lacus quis augue mollis tempus vel in lorem. Donec augue turpis, eleifend nec nibh eu, elementum dictum metus. Proin ut est ligula. Etiam vehicula facilisis metus, sit amet consectetur risus ullamcorper porttitor. In congue nibh quis sollicitudin iaculis. Donec a mollis lorem, non mollis lacus. Nulla et leo ex. Aliquam erat volutpat. Nam sit amet tincidunt mauris. Vivamus vitae est sit amet nisi semper egestas. Donec in diam pharetra, commodo diam vitae, imperdiet ligula. Cras iaculis ac diam eget vehicula. Proin suscipit ante enim, quis vehicula mi porta bibendum. Aliquam a diam porttitor, sollicitudin justo vitae, tempor odio.
Cras fermentum dignissim pretium. Donec quis turpis eu neque lacinia facilisis in sit amet nibh. Nulla non tortor ultricies, euismod est in, blandit nibh. Ut a neque metus. Sed convallis condimentum nibh quis finibus. Praesent aliquam sem iaculis eros maximus accumsan. Nulla venenatis mauris id aliquet maximus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin at enim vitae ex porttitor vestibulum sed eget nibh. Suspendisse accumsan feugiat quam eget ultricies.
mastodon_username:# your mastodon instance+username in the format instance.tld/@username
linkedin_username:fguiotte# your LinkedIn user name
telegram_username:# your Telegram user name
scholar_userid:QHs7TucAAAAJ# your Google Scholar ID
semanticscholar_id:# your Semantic Scholar ID
whatsapp_number:# your WhatsApp number (full phone number in international format. Omit any zeroes, brackets, or dashes when adding the phone number in international format.)
orcid_id:# your ORCID ID
medium_username:# your Medium username
quora_username:# your Quora username
publons_id:# your ID on Publons
research_gate_profile:# your profile on ResearchGate
blogger_url:# your blogger URL
work_url:# work page URL
keybase_username:# your keybase user name
wikidata_id:# your wikidata id
dblp_url:# your DBLP profile url
stackoverflow_id:# your stackoverflow id
kaggle_id:# your kaggle id
lastfm_id:# your lastfm id
spotify_id:# your spotify id
pinterest_id:# your pinterest id
unsplash_id:# your unsplash id
instagram_id:# your instagram id
facebook_id:# your facebook id
youtube_id:# your youtube channel id (youtube.com/@<youtube_id>)
discord_id:# your discord id (18-digit unique numerical identifier)
contact_note:>
You can even add a little note about which of these is the best way to reach you.
google_analytics: # your Goole Analytics measurement ID (format:G-XXXXXXXXXX)
panelbear_analytics: # panelbear analytics site ID (format:XXXXXXXXX)
# For Google Analytics, see https://support.google.com/analytics/answer/10447272?hl=en&ref_topic=14088998&sjid=5129943941510317771-SA#zippy=%2Cgoogle-sites
# and follow the instructions for Google Sites. You will need to create a Google Analytics property and copy the Google tag ID.
google_analytics: # your Google Analytics measurement ID (format:G-XXXXXXXXXX)
cronitor_analytics: # cronitor RUM analytics site ID (format:XXXXXXXXX)
pirsch_analytics:# your Pirsch analytics site ID (length 32 characters)
openpanel_analytics: # your Openpanel analytics client ID (format:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)
google_site_verification:# your google-site-verification ID (Google Search Console)
bing_site_verification:# out your bing-site-verification ID (Bing Webmaster)
# For Google Search Console, see https://support.google.com/webmasters/answer/9008080?hl=en#meta_tag_verification&zippy=%2Chtml-tag
google_site_verification:# your google-site-verification ID (Google Search Console)
bing_site_verification:# out your bing-site-verification ID (Bing Webmaster)
# this file contains the social media links and usernames of the author
# the socials will be displayed in the order they are defined here
# for more information, please refer to the documentation of jekyll-socials plugin: https://github.com/george-gca/jekyll-socials
cv_pdf:/assets/pdf/example_pdf.pdf# path to your CV PDF file
email:you@example.com# your email address
inspirehep_id:1010907# Inspire HEP author ID
rss_icon:true# comment this line to hide the RSS icon
scholar_userid:qc6CJjYAAAAJ# your Google Scholar ID
# wechat_qr: # filename of your wechat qr-code saved as an image (e.g., wechat-qr.png if saved to assets/img/wechat-qr.png)
# whatsapp_number: # your WhatsApp number (full phone number in international format. Omit any zeroes, brackets, or dashes when adding the phone number in international format.)
custom_social:# can be any name here other than the ones already defined in the jekyll-socials plugin
logo:https://www.alberteinstein.com/wp-content/uploads/2024/03/cropped-favicon-192x192.png# can be png, svg, jpg
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.