diff --git a/.agents/skills/al-folio-bootstrap/SKILL.md b/.agents/skills/al-folio-bootstrap/SKILL.md new file mode 100644 index 0000000000000..42285209552f3 --- /dev/null +++ b/.agents/skills/al-folio-bootstrap/SKILL.md @@ -0,0 +1,34 @@ +# al-folio Bootstrap + +Use this skill when a user asks an agent to create, configure, or personalize a new al-folio v1.x website. + +## Workflow + +1. Read `AGENTS.md` and `docs/BOUNDARIES.md` before editing. +2. Keep the starter small: customize `_config.yml`, `_data`, content collections, and site assets first. +3. Leave runtime behavior in plugin repos. Do not copy plugin-owned layouts, includes, Sass, JavaScript, or assets into the starter unless the user intentionally wants a local override. +4. For local visual/content customization, prefer: + - `_config.yml` feature flags and site metadata + - `_data/*.yml` + - `_pages`, `_posts`, `_projects`, `_news`, `_teachings`, `_bibliography` + - local `_includes`, `_layouts`, and `_sass` overrides only when config/content cannot express the change +5. Run validation before handing work back: + +```bash +npm ci +npm run lint:prettier +bundle exec al-folio upgrade audit --no-fail +bundle exec jekyll build --baseurl /al-folio +``` + +## Routing + +- Starter wiring/docs/examples/tests: edit `al-folio`. +- Shared layouts/includes/assets: use `al_folio_core`. +- CV rendering: use `al_folio_cv`. +- Distill runtime: use `al_folio_distill`. +- Search/icons/math/comments/analytics/citations/external posts/newsletter/charts/images: use the owning `al-*` plugin repo. + +## Handoff + +Summarize changed files, validation results, and any local overrides created. diff --git a/.agents/skills/al-folio-v1-migration/SKILL.md b/.agents/skills/al-folio-v1-migration/SKILL.md new file mode 100644 index 0000000000000..df80ec9239d66 --- /dev/null +++ b/.agents/skills/al-folio-v1-migration/SKILL.md @@ -0,0 +1,42 @@ +# al-folio v1 Migration + +Use this skill when a user asks an agent to migrate an existing customized al-folio fork to v1.x. + +## Workflow + +1. Work in a disposable branch, fork, or clone. Do not overwrite the user's original site. +2. Start from the v1 starter contract, then bring over site-owned files: + - `_config.yml` values + - `_data` + - `_bibliography` + - content collections + - site assets + - intentional local `_includes`, `_layouts`, and `_sass` overrides +3. Keep v1 plugin wiring from the starter: + - `theme: al_folio_core` + - bundled `al_*` and `al_folio_*` gems in `Gemfile` + - bundled plugin entries in `_config.yml` +4. Remove stale copied runtime files now owned by plugins unless they are intentional overrides. +5. Run upgrade checks: + +```bash +bundle exec al-folio upgrade audit --no-fail +bundle exec al-folio upgrade overrides audit +``` + +6. For each stale or unacknowledged override: + +```bash +bundle exec al-folio upgrade overrides diff LOCAL_PATH +bundle exec al-folio upgrade overrides accept LOCAL_PATH +``` + +7. Build and inspect key pages: home, CV, publications, repositories, projects, posts, and any custom routes. + +## Migration Notes + +Commit `.al-folio-overrides.yml` when the site intentionally keeps local overrides. It records the upstream plugin file checksum last reviewed so future gem updates can flag drift explicitly. + +## Handoff + +Report removed stale runtime files, retained local overrides, unresolved visual differences, and exact validation commands. diff --git a/.al-folio-overrides.yml b/.al-folio-overrides.yml new file mode 100644 index 0000000000000..6ef664e9bdc46 --- /dev/null +++ b/.al-folio-overrides.yml @@ -0,0 +1,59 @@ +--- +version: 1 +overrides: + _includes/figure.liquid: + owner: al_folio_core + gem_version: 1.0.12 + upstream_path: _includes/figure.liquid + upstream_sha256: d094ba62f74e50ec9a3a7aca01d41f3d499f7fb3bc3507ca8aecd946347132bb + local_sha256: 54902b218d44582081573b9d469e395e24e8cf3323e148e32f7b08a0207b3ac7 + acknowledged_at: '2026-07-30' + _includes/footer.liquid: + owner: al_folio_core + gem_version: 1.0.12 + upstream_path: _includes/footer.liquid + upstream_sha256: 65219faad5445eb4456649d77921acd07845875bbcad4fb8f33b12b3d52d96d2 + local_sha256: f2d392f9dd6d468a73615d829b381e05ded1c31e77d316050b2d0f60d6121c28 + acknowledged_at: '2026-07-30' + _includes/header.liquid: + owner: al_folio_core + gem_version: 1.0.12 + upstream_path: _includes/header.liquid + upstream_sha256: c8663513baded68d9fa5fbe4d6363a976535bbe201efe5138243d0ff03101058 + local_sha256: aaaacc7589d2a3a8758fcde44efed858b6fff7ebda6b8af18616d5a2b3168a7b + acknowledged_at: '2026-07-30' + _includes/repository/repo.liquid: + owner: al_folio_core + gem_version: 1.0.12 + upstream_path: _includes/repository/repo.liquid + upstream_sha256: ce87ac70cb6a8e2b1ed708b0418c638ebc4e59c4198de68bff0fc39cd5a01087 + local_sha256: 204440d391995038c509dbefe05c05ab199a7198c71cb6aaaf9e4ebf26195a96 + acknowledged_at: '2026-07-30' + _layouts/about.liquid: + owner: al_folio_core + gem_version: 1.0.12 + upstream_path: _layouts/about.liquid + upstream_sha256: 2c28eb83b71fe65f252202c11f0b4a19a9b6f1faccdc870b4f91c4ea51d0c6f1 + local_sha256: 3f621e36c62f6521f57602e5e711f0b7e1a1d54c02c74cfddff2ceec2fc524b8 + acknowledged_at: '2026-07-30' + _layouts/bib.liquid: + owner: al_folio_core + gem_version: 1.0.12 + upstream_path: _layouts/bib.liquid + upstream_sha256: 430311d9b94adf6fb1c2fab7609f6e726efc98e2b50e7b1c4cde0ad654c04506 + local_sha256: 7119a1649bfc5822a4d111e6b2cdc5c21ec1cc2d4cb84627f3aae78a96f81b88 + acknowledged_at: '2026-07-30' + _layouts/page.liquid: + owner: al_folio_core + gem_version: 1.0.12 + upstream_path: _layouts/page.liquid + upstream_sha256: eb392ada31cdbe8d1a0f5dbd7229700b5fa7cdf6f4788cbb65d6b746ac3b1231 + local_sha256: 6088ab8a58b2f3ae7d42068980747e333471800e6493fd9fa0e7e34a1ccc5c1a + acknowledged_at: '2026-07-30' + assets/css/main.scss: + owner: al_folio_core + gem_version: 1.0.12 + upstream_path: assets/css/main.scss + upstream_sha256: 437c6c911c596391413e435dc0ea7095e682e85c572c1fd3fff69f9597455b3e + local_sha256: 961c4d03034dd7d13dee2c34f2a533110706aaea8931c262ece0cd2f4045546f + acknowledged_at: '2026-07-30' diff --git a/.claude/skills b/.claude/skills new file mode 120000 index 0000000000000..2b7a412b8fa0f --- /dev/null +++ b/.claude/skills @@ -0,0 +1 @@ +../.agents/skills \ No newline at end of file diff --git a/.codex/skills b/.codex/skills new file mode 120000 index 0000000000000..2b7a412b8fa0f --- /dev/null +++ b/.codex/skills @@ -0,0 +1 @@ +../.agents/skills \ No newline at end of file diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000000000..e511a1bfad2f0 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,7 @@ +FROM mcr.microsoft.com/devcontainers/jekyll + +# Fix: Remove the broken Yarn repository from the apt sources. +# This prevents 'apt-get update' from failing due to the missing GPG key. +# (Yarn is already provided by the dev container features/nvm, so this system repo is unnecessary) +# See issue #3487 +RUN rm -f /etc/apt/sources.list.d/yarn.list diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 46bd1ede6282d..041b0e9df5eac 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,10 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/jekyll { "name": "Jekyll", - "image": "mcr.microsoft.com/devcontainers/jekyll", + // Using a Dockerfile to fix the broken Yarn repository. See issue #3487. + "build": { + "dockerfile": "Dockerfile" + }, // Features to add to the dev container. More info: https://containers.dev/features. "features": { diff --git a/.gemini/settings.json b/.gemini/settings.json new file mode 100644 index 0000000000000..6ff0526cd8cca --- /dev/null +++ b/.gemini/settings.json @@ -0,0 +1,17 @@ +{ + "context": { + "fileName": [ + "AGENTS.md", + ".github/copilot-instructions.md", + ".github/agents/customize.agent.md", + ".github/agents/docs.agent.md", + ".github/instructions/**/*.md", + "docs/README.md", + "docs/CUSTOMIZE.md", + "docs/INSTALL.md", + "docs/TROUBLESHOOTING.md", + "docs/QUICKSTART.md", + "docs/BOUNDARIES.md" + ] + } +} diff --git a/.github/GIT_WORKFLOW.md b/.github/GIT_WORKFLOW.md new file mode 100644 index 0000000000000..771a71ce5042b --- /dev/null +++ b/.github/GIT_WORKFLOW.md @@ -0,0 +1,47 @@ +# Git Workflow + +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: + +``` +: + + +``` + +**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 docs/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: + +- Build outputs (`_site/`, `.jekyll-cache/`) +- Dependencies (`node_modules/`, `vendor/`) +- OS-specific files (`.DS_store`) +- Editor temporary files (`.idea/`, `.swp`, `.swo`) +- Secrets and API keys (never commit credentials) diff --git a/.github/ISSUE_TEMPLATE/1_bug_report.yml b/.github/ISSUE_TEMPLATE/1_bug_report.yml index f9c461f413c4e..318d1ad0e4a7e 100644 --- a/.github/ISSUE_TEMPLATE/1_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/1_bug_report.yml @@ -7,8 +7,8 @@ body: value: > Before you go any further. Is this really a **🐛 bug**? - If it's a question about how al-folio works, have a look at our [documentation](https://github.com/alshedivat/al-folio/blob/main/README.md), - [frequently asked questions](https://github.com/alshedivat/al-folio/blob/main/FAQ.md), + If it's a question about how al-folio works, have a look at our [documentation](https://github.com/alshedivat/al-folio/blob/main/docs/README.md), + [frequently asked questions](https://github.com/alshedivat/al-folio/blob/main/docs/FAQ.md), [past questions](https://github.com/alshedivat/al-folio/discussions/categories/q-a), or [ask a question](https://github.com/alshedivat/al-folio/discussions/new?category=q-a). @@ -20,7 +20,7 @@ body: 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. + - label: I read through [FAQ](https://github.com/alshedivat/al-folio/blob/main/docs/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 diff --git a/.github/ISSUE_TEMPLATE/2_feature_request.yml b/.github/ISSUE_TEMPLATE/2_feature_request.yml index 6934f60c6087b..6b97b1be4dbae 100644 --- a/.github/ISSUE_TEMPLATE/2_feature_request.yml +++ b/.github/ISSUE_TEMPLATE/2_feature_request.yml @@ -7,8 +7,8 @@ body: value: > Before you go any further, are you sure that this feature is not already implemented? - If it's a question about how al-folio works, have a look at our [documentation](https://github.com/alshedivat/al-folio/blob/main/README.md), - [frequently asked questions](https://github.com/alshedivat/al-folio/blob/main/FAQ.md), + If it's a question about how al-folio works, have a look at our [documentation](https://github.com/alshedivat/al-folio/blob/main/docs/README.md), + [frequently asked questions](https://github.com/alshedivat/al-folio/blob/main/docs/FAQ.md), [past questions](https://github.com/alshedivat/al-folio/discussions/categories/q-a), or [ask a question](https://github.com/alshedivat/al-folio/discussions/new?category=q-a). @@ -20,7 +20,7 @@ body: 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. + - label: I read through [FAQ](https://github.com/alshedivat/al-folio/blob/main/docs/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 diff --git a/.github/ISSUE_TEMPLATE/3_plugin_feature_proposal.yml b/.github/ISSUE_TEMPLATE/3_plugin_feature_proposal.yml new file mode 100644 index 0000000000000..986c0c068dab0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3_plugin_feature_proposal.yml @@ -0,0 +1,112 @@ +name: "🔌 Plugin feature proposal" +description: Propose a plugin to be listed (featured) or bundled in al-folio. +labels: ["needs triage", "plugin-ecosystem"] +body: + - type: markdown + attributes: + value: > + Use this template to propose adding a plugin to the `al-folio` ecosystem catalog. + Featuring and bundling are separate decisions. + + - type: checkboxes + id: requirements + attributes: + label: Proposal checklist + options: + - label: I confirmed this plugin is not already listed in `_data/featured_plugins.yml`. + required: true + - label: I understand that featuring does not automatically mean bundling. + required: true + + - type: input + id: plugin_name + attributes: + label: Plugin name + description: Human-readable plugin name. + placeholder: al_folio_example + validations: + required: true + + - type: input + id: repo_url + attributes: + label: Repository URL + description: Public repository URL for the plugin. + placeholder: https://github.com/your-org/al-folio-example + validations: + required: true + + - type: input + id: gem_name + attributes: + label: Gem name + description: Name published on RubyGems. + placeholder: al_folio_example + validations: + required: true + + - type: input + id: plugin_id + attributes: + label: Jekyll plugin ID + description: Plugin id used in `_config.yml` plugins list. + placeholder: al_folio_example + validations: + required: true + + - type: dropdown + id: plugin_scope + attributes: + label: Plugin scope + description: Does this plugin depend on al-folio-specific runtime contracts? + options: + - Theme-coupled (al-folio-specific) + - Reusable (works outside al-folio) + validations: + required: true + + - type: dropdown + id: requested_track + attributes: + label: Requested track + description: Which listing track are you proposing? + options: + - Featured-only + - Bundled in starter + validations: + required: true + + - type: input + id: compatibility + attributes: + label: Compatibility range + description: al-folio versions supported by this plugin. + placeholder: "al_folio_min: 1.0.0, al_folio_max: 1.x" + validations: + required: true + + - type: input + id: demo_path + attributes: + label: Demo page/post URL + description: Public demo path showing the plugin in action. + placeholder: https://your-site.example/plugins/my-plugin-demo + validations: + required: true + + - type: input + id: maintainer_contact + attributes: + label: Maintainer contact + description: Primary maintainer handle or contact URL. + placeholder: https://github.com/your-handle + validations: + required: true + + - type: textarea + id: notes + attributes: + label: Additional notes + description: Add context, migration notes, or caveats. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index e8510012e8a2d..0195fcacb39b7 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -4,5 +4,8 @@ contact_links: url: https://github.com/alshedivat/al-folio/discussions/categories/q-a about: Ask and answer al-folio related questions. - name: 📖 Read the documentation - url: https://github.com/alshedivat/al-folio/blob/main/README.md + url: https://github.com/alshedivat/al-folio/blob/main/docs/README.md about: Please consult the documentation before opening any issues! + - name: ⭐ Add your site to the showcase + url: https://github.com/alshedivat/al-folio/discussions + about: Request a listing in the Showcase category of GitHub Discussions. Entries are reviewed and added periodically — please do not open a pull request. diff --git a/.github/agents/customize.agent.md b/.github/agents/customize.agent.md new file mode 100644 index 0000000000000..b97b2b9f11907 --- /dev/null +++ b/.github/agents/customize.agent.md @@ -0,0 +1,51 @@ +--- +name: customization_agent +description: Customization assistant for al-folio v1.x starter and plugin ecosystem +--- + +You are a customization assistant for `al-folio` v1.x. + +## Mission + +Help users customize their site while respecting v1 ownership boundaries. + +## Boundary Model + +- `al-folio` starter: docs, content, config wiring, integration and visual checks. +- `al-*` plugins: runtime feature behavior and component assets. + +If a request changes runtime behavior, route to the owning plugin repo instead of patching starter internals. + +## User Guidance Priorities + +1. Keep explanations simple for non-expert users. +2. Prefer editing `_config.yml`, content collections, and data files. +3. Avoid monolith-era guidance that assumes starter owns `_includes/_layouts/_sass` runtime internals. +4. When retaining local overrides of plugin-owned files, run the override audit and acknowledge reviewed overrides. + +## Key Starter Files + +- `_config.yml` +- `_data/*.yml` +- `_pages/`, `_posts/`, `_projects/`, `_news/`, `_teachings/` +- `Gemfile` +- `README.md` +- `docs/INSTALL.md`, `docs/CUSTOMIZE.md`, `docs/FAQ.md`, `docs/CONTRIBUTING.md`, `docs/BOUNDARIES.md` + +## Validation + +Use the validated command set in `AGENTS.md`. + +For local overrides, include: + +```bash +bundle exec al-folio upgrade overrides audit +``` + +## Escalation + +If user requests a feature that should live in a plugin: + +- identify likely owner plugin repo, +- explain why, +- provide starter wiring/docs changes only in this repo. diff --git a/.github/agents/docs.agent.md b/.github/agents/docs.agent.md new file mode 100644 index 0000000000000..6ea1231ef19fd --- /dev/null +++ b/.github/agents/docs.agent.md @@ -0,0 +1,41 @@ +--- +name: docs_agent +description: Documentation specialist for al-folio v1.x +--- + +You are the documentation specialist for `al-folio` v1.x. + +## Documentation Objective + +Keep starter docs accurate for the pluginized architecture. + +## Non-Negotiable Rules + +- Do not document `al-folio` as a monolithic runtime theme. +- Reflect starter-vs-plugin boundaries from `docs/BOUNDARIES.md`. +- Keep contributor routing explicit: starter changes here, feature/runtime changes in owning plugin repos. +- Avoid stale bootstrap-era instructions unless clearly marked compatibility-only. +- Keep migration guidance aligned with `al_folio_upgrade`, including the local override audit workflow. + +## Core Docs to Maintain + +- `README.md` +- `docs/README.md` +- `docs/INSTALL.md` +- `docs/CUSTOMIZE.md` +- `docs/FAQ.md` +- `docs/CONTRIBUTING.md` +- `docs/BOUNDARIES.md` +- `.github/copilot-instructions.md` +- `.agents/skills/al-folio-bootstrap/SKILL.md` +- `.agents/skills/al-folio-v1-migration/SKILL.md` + +## Validation + +Use commands from `AGENTS.md` and ensure documented commands are current and runnable. + +## Style + +- Be concise and practical. +- Prefer links over duplicated long instructions. +- Use repository-real file paths and commands. diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000000000..9582579409e2f --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,27 @@ +# Copilot Coding Agent Instructions (v1.x) + +**Read [`AGENTS.md`](../AGENTS.md) first — it is the authoritative entry point for all coding agents in this repo.** It carries the change-routing table, the stop sign for gem-owned paths, the three silent failure modes, and the validated command set. This file previously duplicated that content; it is now a pointer so the rules cannot drift apart. + +In short: `al-folio` v1.x is a **thin Jekyll starter, not a theme**. It owns starter wiring (`Gemfile`, `_config.yml`), example content, docs, integration tests, and visual parity tests. All runtime — layouts, includes, Sass, Liquid tags, filters, feature JS — lives in versioned gems under [`al-org-dev`](https://github.com/al-org-dev). Route runtime changes to the owning gem. + +## Where to look + +| Question | File | +| ------------------------------------ | --------------------------------------------------------------------------------------------- | +| Which repo does my change belong in? | [`AGENTS.md`](../AGENTS.md#route-your-change) | +| Which gem owns this area? | [`docs/BOUNDARIES.md`](../docs/BOUNDARIES.md) | +| Which gem owns this Liquid tag? | [`docs/ARCHITECTURE.md`](../docs/ARCHITECTURE.md#wrapper-to-tag-to-gem-delegation) | +| Why did my feature render nothing? | [`docs/ARCHITECTURE.md`](../docs/ARCHITECTURE.md#failure-modes-that-produce-no-error-message) | +| What commands should I run? | [`AGENTS.md`](../AGENTS.md#validated-local-command-set) | +| How do I contribute? | [`docs/CONTRIBUTING.md`](../docs/CONTRIBUTING.md) | + +## Copilot-specific paths + +- `.github/agents/` — custom agents (`customize.agent.md`, `docs.agent.md`). +- `.github/instructions/` — per-file-type instruction files (Liquid, YAML, BibTeX, Markdown, JavaScript). +- `.github/workflows/copilot-setup-steps.yml` — pre-installs Ruby, Python, Node, ImageMagick, and nbconvert for the coding agent. +- `.agents/skills/` — canonical agent skills, also exposed via the `.codex/skills` and `.claude/skills` symlinks. + +## CI expectations + +Keep these workflows aligned when changing starter behavior: `unit-tests.yml` (style contract plus all six `test/integration_*.sh` scripts), `visual-regression.yml`, `upgrade-check.yml`, `prettier.yml`, and `deploy.yml`. diff --git a/.github/instructions/bibtex-bibliography.instructions.md b/.github/instructions/bibtex-bibliography.instructions.md new file mode 100644 index 0000000000000..2ade7ef91465d --- /dev/null +++ b/.github/instructions/bibtex-bibliography.instructions.md @@ -0,0 +1,13 @@ +# BibTeX/Bibliography Instructions (v1.x) + +Scope: `_bibliography/**`, `*.bib` + +## Guidance + +- Keep BibTeX entries valid and consistently formatted. +- Preserve fields expected by citation/publication plugins. +- Route citation runtime/parsing changes to owning plugin repos. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/instructions/javascript-scripts.instructions.md b/.github/instructions/javascript-scripts.instructions.md new file mode 100644 index 0000000000000..32fa3a53875ec --- /dev/null +++ b/.github/instructions/javascript-scripts.instructions.md @@ -0,0 +1,18 @@ +# JavaScript Instructions (v1.x) + +Scope: starter JS and related setup scripts + +## Ownership + +- Starter JS should be limited to orchestration/integration behavior. +- Feature runtime JS belongs in owning plugin repos. + +## Guidance + +- Do not copy plugin-owned search/icon/math/image runtime code into starter. +- Keep starter scripts framework-agnostic and compatible with plugin contracts. +- Prefer deterministic behavior suitable for integration/visual tests. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/instructions/liquid-templates.instructions.md b/.github/instructions/liquid-templates.instructions.md new file mode 100644 index 0000000000000..a990ea0f747ea --- /dev/null +++ b/.github/instructions/liquid-templates.instructions.md @@ -0,0 +1,18 @@ +# Liquid Templates Instructions (v1.x) + +Scope: `**/*.liquid` + +## Ownership + +- Starter templates in this repo should orchestrate plugin tags/includes. +- Runtime feature logic belongs in owning plugin repos. + +## Guidance + +- Prefer plugin wrappers/includes over embedding feature runtime logic in starter. +- Keep markup/config expectations consistent with `docs/BOUNDARIES.md`. +- Avoid reintroducing bootstrap-specific assumptions in starter templates. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/instructions/markdown-content.instructions.md b/.github/instructions/markdown-content.instructions.md new file mode 100644 index 0000000000000..32379fb3dd43a --- /dev/null +++ b/.github/instructions/markdown-content.instructions.md @@ -0,0 +1,13 @@ +# Markdown Content Instructions (v1.x) + +Scope: `_pages/**`, `_posts/**`, `_projects/**`, `_news/**`, `_teachings/**`, `_books/**` + +## Guidance + +- Keep starter content examples aligned with pluginized v1 behavior. +- Do not document runtime implementation details as starter-owned unless they truly are. +- When content depends on a plugin feature, ensure plugin wiring exists in `_config.yml` and `Gemfile`. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/instructions/yaml-configuration.instructions.md b/.github/instructions/yaml-configuration.instructions.md new file mode 100644 index 0000000000000..fb75385b7b304 --- /dev/null +++ b/.github/instructions/yaml-configuration.instructions.md @@ -0,0 +1,18 @@ +# YAML Configuration Instructions (v1.x) + +Scope: `_config.yml`, `_data/**/*.yml` + +## Ownership + +- `_config.yml` in starter wires plugins and feature flags. +- Plugin-specific runtime semantics are owned by plugin repos. + +## Guidance + +- Keep plugin list and config keys aligned with v1 boundaries. +- When adding featured plugins, update `_data/featured_plugins.yml`. +- Validate YAML syntax and avoid stale monolith keys. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000000..57b679a4ace9a --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,48 @@ +## Summary + +Describe what changed and why. + +> **Adding your site to the showcase?** We no longer accept pull requests for that. Please close this PR and post a request in the _Showcase_ category of [GitHub Discussions](https://github.com/alshedivat/al-folio/discussions) instead — entries are reviewed and added periodically. + +## Ownership Routing + +- [ ] I confirmed this PR targets the correct repo based on `docs/BOUNDARIES.md`. +- [ ] This PR only changes starter-owned scope (`al-folio`) **or** I am porting a routed change and linked the owning repo issue/PR. + +Owning repo (if not starter): +Related issue/PR: + +## Plugin Ecosystem (if applicable) + +- [ ] Not applicable +- [ ] This PR proposes a plugin for **featured-only** listing. +- [ ] This PR proposes a plugin for **bundled** starter inclusion. + +If plugin-related, provide: + +- Plugin repo URL: +- Gem name: +- Jekyll plugin id: +- Compatibility (`al_folio_min`/`al_folio_max`): +- Demo page/post path: +- Maintainer contact: + +## Starter Wiring Changes + +- [ ] Not applicable +- [ ] Updated `Gemfile` dependency wiring. +- [ ] Updated `_config.yml` plugin activation/config. +- [ ] Updated `_data/featured_plugins.yml` metadata. + +## Validation + +- [ ] `npm ci` +- [ ] `bundle exec jekyll build` +- [ ] `npm run lint:prettier` +- [ ] `npm run lint:style-contract` +- [ ] Integration tests (`test/integration_*.sh`) as needed +- [ ] Visual tests (`npm run test:visual`) as needed + +## Notes + +Compatibility, migration implications, and follow-ups: diff --git a/.github/workflows/broken-links.yml b/.github/workflows/broken-links.yml index d23c011715471..44b794fe28d59 100644 --- a/.github/workflows/broken-links.yml +++ b/.github/workflows/broken-links.yml @@ -51,4 +51,7 @@ jobs: with: fail: true # removed md files that include liquid tags - args: --user-agent 'curl/7.54' --exclude-path README.md --exclude-path _pages/404.md --exclude-path _pages/blog.md --exclude-path _posts/2018-12-22-distill.md --exclude-path _posts/2023-04-24-videos.md --exclude-path _books/the_godfather.md --verbose --no-progress './**/*.md' './**/*.html' + # docs/releases is excluded because release notes link to the compare + # range for the tag they are about to create, which cannot resolve until + # the release is published + args: --user-agent 'curl/7.54' --max-retries 3 --retry-wait-time 2 --exclude-path docs/releases --exclude-path README.md --exclude-path _pages/404.md --exclude-path _pages/blog.md --exclude-path _posts/2018-12-22-distill.md --exclude-path _posts/2023-04-24-videos.md --exclude-path _books/the_godfather.md --exclude-path .github/instructions/bibtex-bibliography.instructions.md --exclude-path .github/instructions/yaml-configuration.instructions.md --exclude-path .github/instructions/markdown-content.instructions.md --exclude-path .github/instructions/liquid-templates.instructions.md --exclude-path AGENTS.md --exclude-path docs/SEO.md --exclude-path docs/SHOWCASE.md --verbose --no-progress './**/*.md' './**/*.html' diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 0000000000000..e1b652e8d0179 --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,58 @@ +name: "Copilot Setup Steps" + +# Automatically run the setup steps when they are changed to allow for easy validation, and +# allow manual testing through the repository's "Actions" tab +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml + +jobs: + # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot. + copilot-setup-steps: + runs-on: ubuntu-latest + + # Set the permissions to the lowest permissions possible needed for your steps. + # Copilot will be given its own token for its operations. + permissions: + contents: read + + # You can define any steps you want, and they will run before the agent starts. + # If you do not check out your code, Copilot will do this for you. + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.3.5" + bundler-cache: true + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + cache: "pip" + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "latest" + cache: "npm" + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y imagemagick + + - name: Install Python dependencies + run: | + pip3 install --upgrade nbconvert + + - name: Install Node.js dependencies + run: npm ci diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5fb7e8ae21c91..2062b0388ed34 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -7,8 +7,6 @@ on: - main paths: - "assets/**" - - "_sass/**" - - "_scripts/**" - "**.bib" - "**.html" - "**.js" @@ -25,10 +23,10 @@ on: - "!.github/workflows/lighthouse-badger.yml" - "!.github/workflows/prettier.yml" - "!lighthouse_results/**" - - "!CONTRIBUTING.md" - - "!CUSTOMIZE.md" - - "!FAQ.md" - - "!INSTALL.md" + - "!docs/CONTRIBUTING.md" + - "!docs/CUSTOMIZE.md" + - "!docs/FAQ.md" + - "!docs/INSTALL.md" - "!README.md" pull_request: branches: @@ -36,8 +34,6 @@ on: - main paths: - "assets/**" - - "_sass/**" - - "_scripts/**" - "**.bib" - "**.html" - "**.js" @@ -54,10 +50,10 @@ on: - "!.github/workflows/lighthouse-badger.yml" - "!.github/workflows/prettier.yml" - "!lighthouse_results/**" - - "!CONTRIBUTING.md" - - "!CUSTOMIZE.md" - - "!FAQ.md" - - "!INSTALL.md" + - "!docs/CONTRIBUTING.md" + - "!docs/CUSTOMIZE.md" + - "!docs/FAQ.md" + - "!docs/INSTALL.md" - "!README.md" workflow_dispatch: @@ -81,6 +77,13 @@ jobs: with: python-version: "3.13" cache: "pip" # caching pip dependencies + - name: Setup Node 🧰 + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + - name: Install JS deps 📦 + run: npm ci - name: Update _config.yml ⚙️ uses: fjogeleit/yaml-update-action@main with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000000..52fd6b7b3044d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,112 @@ +name: Create release + +# Cutting a release means creating a tag and a GitHub Release. Doing that from a +# local clone requires pushing to `refs/tags/*`, which not every environment is +# permitted to do, so the tag is created here instead — the runner's +# GITHUB_TOKEN has `contents: write` and `gh release create` creates the tag as +# part of publishing. +# +# Release notes are read from a committed file rather than a dispatch input, so +# they are reviewed in a pull request before they are ever published, and the +# repo keeps a history of what each release claimed. +on: + workflow_dispatch: + inputs: + tag: + description: "Tag to create, e.g. v1.1 (must not already exist)" + required: true + type: string + draft: + description: "Create as a draft so it can be read before going public" + type: boolean + default: true + prerelease: + description: "Mark as a pre-release" + type: boolean + default: false + +permissions: + contents: write + +concurrency: + group: create-release + cancel-in-progress: false + +jobs: + release: + runs-on: ubuntu-latest + # This repo is a template. Without this guard, every site generated from it + # would expose a workflow that cuts releases of somebody else's project. + if: github.repository == 'alshedivat/al-folio' + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Validate inputs 🔍 + id: check + env: + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + run: | + set -euo pipefail + tag="${{ inputs.tag }}" + + # The dispatch UI lets you pick any branch, and GITHUB_SHA then points at + # that branch's tip — which is what gets tagged below. Without this check a + # permanent version tag could be cut from unmerged code, with release notes + # that were never reviewed. The repository guard above does not constrain + # the ref, only the repo. + if [ "${GITHUB_REF_NAME}" != "${DEFAULT_BRANCH}" ]; then + echo "::error::Releases must be cut from ${DEFAULT_BRANCH}, but this run was dispatched from '${GITHUB_REF_NAME}'." + echo "Merge the release notes first, then dispatch again from ${DEFAULT_BRANCH}." + exit 1 + fi + + if ! printf '%s' "$tag" | grep -Eq '^v[0-9]+\.[0-9]+(\.[0-9]+)?$'; then + echo "::error::'$tag' is not a version tag (expected v1.1 or v1.1.0)." + exit 1 + fi + + # Publishing is effectively irreversible once people have fetched the + # tag, so refuse rather than move an existing one. + if git rev-parse -q --verify "refs/tags/$tag" >/dev/null; then + echo "::error::Tag $tag already exists. Bump the version instead of retagging." + exit 1 + fi + + notes="docs/releases/${tag}.md" + if [ ! -s "$notes" ]; then + echo "::error::No release notes at $notes (missing or empty)." + echo "Add them in a pull request first — this workflow deliberately will not invent them." + exit 1 + fi + + echo "notes=$notes" >> "$GITHUB_OUTPUT" + echo "Will release $tag from ${GITHUB_SHA} using $notes" + + - name: Create release 🚀 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + gh release create "${{ inputs.tag }}" \ + --target "${GITHUB_SHA}" \ + --title "al-folio ${{ inputs.tag }}" \ + --notes-file "${{ steps.check.outputs.notes }}" \ + --draft=${{ inputs.draft }} \ + --prerelease=${{ inputs.prerelease }} + + - name: Summary 📝 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + { + echo "### al-folio ${{ inputs.tag }}" + echo + echo "- commit: \`${GITHUB_SHA}\`" + echo "- draft: ${{ inputs.draft }}" + echo "- prerelease: ${{ inputs.prerelease }}" + echo + gh release view "${{ inputs.tag }}" --json url --jq '"[View release](" + .url + ")"' + } >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/render-cv.yml b/.github/workflows/render-cv.yml new file mode 100644 index 0000000000000..af2c5580c984d --- /dev/null +++ b/.github/workflows/render-cv.yml @@ -0,0 +1,58 @@ +name: Render a CV +on: + push: + branches: + - main + - master + paths: + - "_data/cv.yml" + - "assets/rendercv/design.yaml" + - "assets/rendercv/locale.yaml" + - "assets/rendercv/settings.yaml" + workflow_call: + workflow_dispatch: +permissions: + contents: write +jobs: + rendercv: + name: RenderCV + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Install RenderCV + run: | + pip install -r requirements.txt + - name: RenderCV + run: | + cv_file=$(find _data -maxdepth 1 -type f \( -name "cv.yaml" -o -name "cv.yml" \)) + if [ -z "$cv_file" ]; then + echo "No cv.yml file found!" + exit 1 + fi + rendercv_dir=$(find assets -maxdepth 1 -type d -name "rendercv") + if [ -z "$rendercv_dir" ]; then + echo "No RenderCV config directory found!" + exit 1 + fi + settings=$(find $rendercv_dir -maxdepth 1 -type f \( -name "settings.yaml" -o -name "settings.yml" \)) + if [ -z "$settings" ]; then + echo "Missing RenderCV config file!" + exit 1 + fi + rendercv render $cv_file --settings $settings + rm assets/rendercv/rendercv_output/*.typ + - name: Upload rendercv_output as an artifact + uses: actions/upload-artifact@v4 + with: + name: RenderCV Output + path: assets/rendercv/rendercv_output + - name: Push the changes + run: | + git config --global user.name "${{ github.actor }}" + git config --global user.email "${{ github.actor }}@users.noreply.github.com" + git add -A + git commit -m "chore: render the latest CV" + git push diff --git a/.github/workflows/star-history.yml b/.github/workflows/star-history.yml new file mode 100644 index 0000000000000..af37539d3f6dd --- /dev/null +++ b/.github/workflows/star-history.yml @@ -0,0 +1,69 @@ +name: Update star history chart + +on: + push: + branches: + - main + # The job commits the regenerated SVGs back to main. Ignoring them here + # means the bot's own commit — which touches nothing else — cannot retrigger + # this workflow. (GitHub also declines to raise `push` events for commits + # made with GITHUB_TOKEN, so this is the second of two guards.) + paths-ignore: + - "assets/img/star-history-*.svg" + # Stars keep accruing even when nobody pushes, so refresh weekly regardless. + schedule: + - cron: "17 4 * * 1" + workflow_dispatch: + +permissions: + contents: write + +# Never let two runs race to commit the same files. +concurrency: + group: star-history + cancel-in-progress: false + +jobs: + update: + runs-on: ubuntu-latest + # This repo is a template; without this guard every site generated from it + # would burn Actions minutes charting someone else's repository. + if: github.repository == 'alshedivat/al-folio' + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v6 + + - name: Regenerate chart 📈 + env: + # Lifts the API limit from 60 to 5000 requests/hour. The stargazer + # data itself is public — no personal or scoped token is needed. + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: python3 bin/generate_star_history.py --repo "${{ github.repository }}" --out-dir assets/img + + - name: Commit if changed 💾 + run: | + set -euo pipefail + if git diff --quiet -- assets/img/star-history-light.svg assets/img/star-history-dark.svg; then + echo "Chart unchanged; nothing to commit." + exit 0 + fi + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add assets/img/star-history-light.svg assets/img/star-history-dark.svg + git commit -m "chore: refresh star history chart [skip ci]" + # Regenerating the chart takes about a minute, and update-tocs.yml + # triggers on the same push and commits to main in ~15s, so main can + # move underneath this job. That is a plain non-fast-forward, not a + # permissions problem, so rebase onto the new tip and retry instead of + # failing the run. Only the two generated SVGs are in flight here, and + # nothing else writes them, so the rebase cannot conflict in practice. + for attempt in 1 2 3; do + if git push; then + echo "Pushed on attempt ${attempt}." + exit 0 + fi + echo "Push rejected (main moved); rebasing onto origin/main and retrying." + git pull --rebase origin main + done + echo "::error::Could not push the refreshed chart after 3 attempts." + exit 1 diff --git a/.github/workflows/update-tocs.yml b/.github/workflows/update-tocs.yml index 3567ee82a8f6b..5bad0fb764a60 100644 --- a/.github/workflows/update-tocs.yml +++ b/.github/workflows/update-tocs.yml @@ -8,6 +8,7 @@ on: - master paths: - "*.md" + - "docs/*.md" workflow_dispatch: permissions: @@ -22,11 +23,15 @@ jobs: with: fetch-depth: 0 # OR "2" -> To retrieve the preceding commit. + - uses: actions/setup-node@v4 + - name: Get changed files id: changed-files uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46 with: - files: ./*.md + files: | + ./*.md + docs/*.md - name: Updated toc on all markdown changed files env: @@ -43,6 +48,27 @@ jobs: done rm gh-md-toc + # gh-md-toc and Prettier disagree about escaping in link text: the TOC + # generator emits `_config.yml` where Prettier requires `\_config.yml`. + # Without this step the auto-commit lands unformatted and prettier.yml + # immediately goes red on main. Prettier gets the last word. + - name: Normalize TOC formatting 🎨 + env: + ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} + run: | + # `npm ci` installs from the lockfile and does not touch package.json or + # package-lock.json. `npm install --save-dev` would rewrite the caret + # ranges to exact pins and upgrade them, and because the auto-commit step + # below sets no file_pattern (default `.`), those dependency changes would + # be committed to main under the message "Auto update markdown TOC". + npm ci + for file in ${ALL_CHANGED_FILES}; do + if [[ "$file" != *.md ]]; then + continue + fi + npx prettier --write "$file" + done + - name: Commit changes if: steps.changed-files.outputs.any_changed == 'true' uses: stefanzweifel/git-auto-commit-action@v5.0.1 diff --git a/.github/workflows/upgrade-check.yml b/.github/workflows/upgrade-check.yml new file mode 100644 index 0000000000000..77524b7bc1c27 --- /dev/null +++ b/.github/workflows/upgrade-check.yml @@ -0,0 +1,59 @@ +name: Upgrade contract checks + +on: + push: + branches: + - master + - main + - v1.0-dev + paths: + - "_config.yml" + - "_data/**" + - "_pages/**" + - "_posts/**" + - "_projects/**" + - "assets/**" + - "Gemfile" + - "Gemfile.lock" + - "test/integration_upgrade_cli.sh" + - ".github/workflows/upgrade-check.yml" + pull_request: + branches: + - master + - main + - v1.0-dev + paths: + - "_config.yml" + - "_data/**" + - "_pages/**" + - "_posts/**" + - "_projects/**" + - "assets/**" + - "Gemfile" + - "Gemfile.lock" + - "test/integration_upgrade_cli.sh" + - ".github/workflows/upgrade-check.yml" + +jobs: + upgrade-check: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v4 + + - name: Setup Ruby 💎 + uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.3.5" + bundler-cache: true + + - name: Run upgrade audit 🧪 + run: bundle exec al-folio upgrade audit + + - name: Upload upgrade report 📄 + if: always() + uses: actions/upload-artifact@v4 + with: + name: al-folio-upgrade-report + path: al-folio-upgrade-report.md + if-no-files-found: ignore diff --git a/.gitignore b/.gitignore index 99aa214369c35..9e4326da0a512 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,27 @@ _site .bundle -.sass-cache +.DS_store +.idea .jekyll-cache .jekyll-metadata .DS_store +.ruby-version +.sass-cache .tweet-cache -Gemfile.lock -assets/libs/ -node_modules/ -vendor -.idea .venv bin/__pycache__/update_scholar_citations.cpython-314.pyc uv.lock pyproject.toml main.py .python-version +assets/libs/ +assets/rendercv/rendercv_output/*.typ +al-folio-upgrade-report.md +node_modules/ +output/playwright/ +test-results/ +vendor + +# Python bytecode from bin/ helper scripts +__pycache__/ +*.pyc diff --git a/.lycheeignore b/.lycheeignore index 6b7796d57a3c8..45d57d96deebf 100644 --- a/.lycheeignore +++ b/.lycheeignore @@ -12,3 +12,19 @@ reddit.com /assets/img/CaseStudy2-1400.webp /assets/img/CaseStudy3-800.webp /assets/img/CaseStudy3-1400.webp +.github/instructions/bibtex-bibliography.instructions.md +.github/instructions/liquid-templates.instructions.md +.github/instructions/markdown-content.instructions.md +.github/instructions/yaml-configuration.instructions.md +_books/the_godfather.md +_pages/404.md +_pages/blog.md +_posts/2018-12-22-distill.md +_posts/2023-04-24-videos.md +AGENTS.md +https://dash.cloudflare.com/ +https://www.linkedin.com/ +https://www.reddit.com/ +README.md +docs/SEO.md +docs/SHOWCASE.md diff --git a/.prettierignore b/.prettierignore index ed2331ef0944f..fd7a42034d141 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,14 +1,8 @@ **/*.map **/*.min.css **/*.min.js -assets/css/main.scss -assets/js/distillpub/template.v2.js -assets/js/search/*.js assets/plotly/demo.html lighthouse_results/** _posts/2015-10-20-math.md -_sass/font-awesome/*.scss -_sass/tabler-icons/*.scss -_scripts/* # Ignore citation YAML file generated by script _data/citations.yml diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000000..51dc63363fd77 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,90 @@ +# Agent Guidelines for al-folio (v1.x) + +**This file is the authoritative entry point for coding agents working in this repo.** Read it before making any change. It is intentionally short and tool-neutral; it links to the one place each longer-form fact lives. + +`al-folio` v1.x is a **thin Jekyll starter, not a theme**. This repo owns starter wiring, example content, docs, and cross-plugin tests. All runtime — layouts, includes, Sass, Liquid tags, filters, feature JS — lives in versioned gems published under [`al-org-dev`](https://github.com/al-org-dev). + +## Route your change + +Find your change on the left; edit only what is on the right. + +| Your change | Goes in | +| ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | +| Dependency pin, plugin activation, feature flag | this repo: `Gemfile` **and** `_config.yml` (both — see below) | +| Example/demo content, bibliography, data files | this repo: `_pages`, `_posts`, `_projects`, `_news`, `_teachings`, `_books`, `_data` | +| Documentation | this repo: `docs/` (long-form) or this file (agent rules) | +| Cross-plugin integration test, visual parity test | this repo: `test/integration_*.sh`, `test/visual/` | +| Plugin catalog metadata | this repo: `_data/featured_plugins.yml` | +| A layout, include, or Sass partial | the owning gem — start with `al_folio_core` | +| A Liquid tag or filter, or what a tag renders | the gem that registers it — see the [delegation table](docs/ARCHITECTURE.md#wrapper-to-tag-to-gem-delegation) | +| Feature behavior (search, math, charts, comments, cookies, icons, CV, distill, analytics, images, newsletter, citations) | that feature's gem — see [`docs/BOUNDARIES.md`](docs/BOUNDARIES.md) | +| Component/unit test for gem-owned behavior | the owning gem, not here | +| A feature with no existing owner | open a plugin proposal issue first, then a standalone plugin repo | + +[`docs/BOUNDARIES.md`](docs/BOUNDARIES.md) is the authoritative area-to-gem table. [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) explains how the pieces connect. + +## Stop sign + +**If your change would create any of these paths in this repo, it belongs in a gem instead:** + +``` +_layouts/ _includes/ _sass/ _scripts/ assets/tailwind/ tailwind.config.js assets/webfonts/ +``` + +`npm run lint:style-contract` fails CI when any of them exists here, and it also rejects `build:css` / `build:tailwind` npm scripts. Do not add a starter-local Tailwind or CSS build pipeline. + +This restriction applies to **this repo only**. A user's own site created from this template _may_ legally shadow gem-owned files — see [local overrides: your site vs. this repo](docs/ARCHITECTURE.md#local-overrides-your-site-vs-this-repo). + +## Three failures that produce no error message + +Read [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#failure-modes-that-produce-no-error-message) for the full explanation. The short version: + +1. **Features fail silently.** A feature renders only when its gem is loaded _and_ its flag is on _and_ the page opts in. Otherwise the Liquid tag emits an empty string — no warning, no error. +2. **`Gemfile` and `_config.yml` are two lists that must agree.** A plugin in only one of them is inert. Adding or removing a plugin means editing both. Repo dirs use hyphens (`al-folio-core`); gem/plugin ids use underscores (`al_folio_core`). +3. **This repo's effective baseurl is `/al-folio`.** `_config.yml` already sets it, so a plain `bundle exec jekyll build` is correct — that is what `deploy.yml`, `broken-links-site.yml` and `axe.yml` run. Passing `--baseurl /al-folio` is redundant but harmless; blanking the baseurl out is what renders the site unstyled with broken links. Dev server is at `http://localhost:4000/al-folio/`. + +## Validated local command set + +Run from the repo root, in this order: + +```bash +bundle install +npm ci +npm run lint:prettier +npm run lint:style-contract +bundle exec jekyll build --baseurl /al-folio +bash test/integration_comments.sh +bash test/integration_plugin_toggles.sh +bash test/integration_distill.sh +bash test/integration_bootstrap_compat.sh +bash test/integration_upgrade_cli.sh +bash test/integration_css_minify.sh +npx playwright install chromium webkit +npm run test:visual +bundle exec al-folio upgrade audit +bundle exec al-folio upgrade overrides audit +bundle exec al-folio upgrade report +docker compose up -d +curl -fsS http://127.0.0.1:8080/al-folio/ >/dev/null +docker compose logs --tail=80 +docker compose down +``` + +All six `test/integration_*.sh` scripts are gated by `unit-tests.yml`; run the ones your change touches. Docker note: v1 uses `/srv/jekyll/bin/entry_point.sh` and serves from container-local `/tmp/_site` to avoid host bind-mount write deadlocks. + +## Before you open a PR + +- Keep starter work here; route runtime behavior to the owning plugin repo. +- Run `npm run lint:prettier` (Prettier with `@shopify/prettier-plugin-liquid`, `printWidth: 150`). `npx prettier . --write` fixes formatting. +- Keep docs aligned with v1 ownership, and keep each fact in one place — link rather than restate. +- If you create or keep local overrides of plugin-owned files, run `bundle exec al-folio upgrade overrides audit` and commit `.al-folio-overrides.yml` after review. + +## Further reading + +- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — how the starter and gems fit together, silent failure modes, the v1 config contract, local overrides. +- [`docs/BOUNDARIES.md`](docs/BOUNDARIES.md) — authoritative area-to-gem ownership table and PR triage playbook. +- [`docs/CONTRIBUTING.md`](docs/CONTRIBUTING.md) — contributor workflow and agent tooling. +- [`docs/README.md`](docs/README.md) — index of all user and maintainer guides. +- `.agents/skills/al-folio-bootstrap/SKILL.md` — new-site setup workflow. +- `.agents/skills/al-folio-v1-migration/SKILL.md` — customized-fork migration and override drift auditing. +- `.codex/skills` and `.claude/skills` are symlinks to `.agents/skills` for agent-specific discovery. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000000..6e445254bec3c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,48 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +@AGENTS.md + +`AGENTS.md` (imported above) is the **authoritative** agent entry point: change routing, the stop sign for gem-owned paths, the three silent failure modes, and the validated command set. Keep it short and ecosystem-neutral. Cross-repo architecture — the wrapper/tag/gem delegation table, feature gating, the v1 config contract, local overrides — lives in [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md); area-to-gem ownership lives in [`docs/BOUNDARIES.md`](docs/BOUNDARIES.md). + +**Read those three before editing anything.** Everything below is Claude-specific or longer-form operational detail that does not belong in the short entry point. Do not restate facts from those files here — link to them. + +## Daily dev loop + +```bash +bundle install # ruby gems +bundle exec jekyll serve # dev server → http://localhost:4000/al-folio/ (NOTE baseurl) +bundle exec jekyll build --baseurl /al-folio # production-style build to _site/ +bash test/integration_distill.sh # run ONE integration test (any of the six in test/) +npm run test:visual:update # refresh playwright snapshots after intentional UI change +bundle exec al-folio upgrade apply --safe # deterministic codemods (font-weight-* → font-*, remote→local URLs) +bundle exec al-folio upgrade overrides diff # then `overrides accept ` to acknowledge an override +``` + +## Optional toolchains + +- **Jupyter posts.** `bin/setup-python-deps` installs _only_ `jupyter` and `nbconvert` (via `pip --user --break-system-packages`) for `jekyll-jupyter-notebook`. It does **not** read `requirements.txt`. Missing `jupyter-nbconvert` is warn-and-continue; notebook rendering is skipped. +- **Everything else Python.** [`requirements.txt`](requirements.txt) is the fuller list and must be installed separately (`python3 -m pip install -r requirements.txt`): `rendercv[full]` for CV rendering, `scholarly` for `bin/update_scholar_citations.py`, plus `nbconvert` and `pyyaml`. +- **Responsive images.** `imagemagick.enabled: true` needs ImageMagick `convert` on `PATH`. +- **Manual deploy.** `bin/deploy` is the manual `gh-pages` build + purgecss + force-push path; CI normally deploys. `purgecss` is not a devDependency — install it with `npm install -g purgecss`. + +## Docker serving model (v1-specific) + +`docker compose up -d` bind-mounts the repo to `/srv/jekyll` and runs `bin/entry_point.sh`, which serves with `--force_polling --destination /tmp/_site`. The build output deliberately goes to **container-local `/tmp/_site`, not the bind-mounted `_site`** — writing `_site` back across the host bind mount caused write deadlocks. The container also `inotifywait`s `_config.yml` and restarts Jekyll on change (config edits aren't hot-reloaded by `--watch`). Verify with the `/al-folio` baseurl: `curl -fsS http://127.0.0.1:8080/al-folio/`. `docker-compose-slim.yml` pulls a prebuilt `:slim` image instead of building locally. + +## CI gates and the style contract + +`npm run lint:style-contract` (`test/style_contract.js`) is the automated enforcement of the thin-starter boundary and will fail CI if you cross it. Beyond the forbidden paths listed in `AGENTS.md`, it also asserts that `_config.yml` keeps `theme: al_folio_core` and the required plugins, that the `third_party_libraries` SRI pins are present, and that the `al_math` Gemfile pin stays on a released version rather than a git branch. + +Other gates: + +- `unit-tests.yml` — style contract plus all six `test/integration_*.sh` scripts (`comments`, `plugin_toggles`, `distill`, `bootstrap_compat`, `upgrade_cli`, `css_minify`). +- `visual-regression.yml` — Playwright on chromium + webkit, diffing the candidate build against a `v0.16.3` baseline worktree served on `:4100` via `BASELINE_URL`. +- `upgrade-check.yml` — `bundle exec al-folio upgrade audit`. +- `prettier.yml` — Prettier with `@shopify/prettier-plugin-liquid` and `printWidth: 150`. Run `npm run lint:prettier` before pushing; `npx prettier . --write` fixes. +- `update-tocs.yml` — regenerates `` blocks in changed root and `docs/` Markdown files. If you add or rename a heading, expect a follow-up auto-commit on `main`. + +## Gem version pins + +`Gemfile` pins every `al-*` gem to an exact released version in `group :al_folio_plugins`, and `_config.yml` lists the same gems under `plugins:`. Read the current pins from the `Gemfile` rather than trusting any version quoted in prose — including here. To test a gem fix against this site, repoint the `Gemfile` at a sibling checkout (`path:`, `git:`, or `branch:`) and `bundle install`; see [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#working-on-a-gem-alongside-the-starter). Revert the pin before committing. diff --git a/Gemfile b/Gemfile index d9087b6a72cf8..c6aef3f7ec815 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,9 @@ gem 'jekyll' # Core plugins that directly affect site building group :jekyll_plugins do + gem 'jekyll-3rd-party-libraries' gem 'jekyll-archives-v2' + gem 'jekyll-cache-bust' gem 'jekyll-email-protect' gem 'jekyll-feed' gem 'jekyll-get-json' @@ -16,6 +18,7 @@ group :jekyll_plugins do gem 'jekyll-regex-replace' gem 'jekyll-scholar' gem 'jekyll-sitemap' + gem 'jekyll-socials' gem 'jekyll-tabs' gem 'jekyll-terser', :git => "https://github.com/RobertoJBeltran/jekyll-terser.git" gem 'jekyll-toc' @@ -29,11 +32,30 @@ end # Gems for development or external data fetching (outside :jekyll_plugins) group :other_plugins do gem 'css_parser' - gem 'feedjira' - gem 'httparty' gem 'observer' # used by jekyll-scholar gem 'ostruct' # used by jekyll-twitter-plugin # gem 'terser' # used by jekyll-terser # gem 'unicode_utils' -- should be already installed by jekyll # gem 'webrick' -- should be already installed by jekyll end + +# Gems for al-folio plugins +group :al_folio_plugins do + gem 'al_folio_core', '= 1.0.12' + gem 'al_icons', '= 1.0.0' + gem 'al_folio_cv', '= 1.0.2' + gem 'al_folio_distill', '= 1.0.3' + gem 'al_folio_upgrade', '= 1.0.3' + gem 'al_folio_bootstrap_compat', '= 1.0.0' + gem 'al_cookie', '= 1.0.0' + + gem 'al_analytics', '= 1.0.2' + gem 'al_citations', '= 1.0.1' + gem 'al_ext_posts', '= 1.0.3' + gem 'al_img_tools', '= 1.0.3' + gem 'al_search', '= 1.0.3' + gem 'al_charts', '= 1.0.1' + gem 'al_math', '= 1.0.2' + gem 'al_comments', '= 1.0.0' + gem 'al_newsletter', '= 1.0.0' +end diff --git a/Gemfile.lock b/Gemfile.lock index f2e3186836185..7a11bd2c01871 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -9,26 +9,79 @@ GIT GEM remote: https://rubygems.org/ specs: - activesupport (8.1.1) + activesupport (7.2.3.1) base64 + benchmark (>= 0.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) - json logger (>= 1.4.2) - minitest (>= 5.1) + minitest (>= 5.1, < 6) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) - uri (>= 0.13.1) - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) - base64 (0.2.0) - bibtex-ruby (6.1.0) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + al_analytics (1.0.2) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_charts (1.0.1) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_citations (1.0.1) + activesupport (>= 6.0, < 8.0) + jekyll (>= 3.9, < 5.0) + nokogiri (>= 1.13, < 2.0) + al_comments (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_cookie (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_ext_posts (1.0.3) + feedjira (>= 3.2, < 5.0) + httparty (>= 0.18, < 1.0) + jekyll (>= 3.9, < 5.0) + nokogiri (>= 1.13, < 2.0) + al_folio_bootstrap_compat (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_folio_core (1.0.12) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_folio_cv (1.0.2) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_folio_distill (1.0.3) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_folio_upgrade (1.0.3) + al_folio_core (>= 1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_icons (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_img_tools (1.0.3) + jekyll (>= 3.9, < 5.0) + jekyll-3rd-party-libraries (~> 0.0.1) + al_math (1.0.2) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_newsletter (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_search (1.0.3) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + base64 (0.3.0) + benchmark (0.5.0) + bibtex-ruby (6.2.0) latex-decode (~> 0.0) + logger (~> 1.7) racc (~> 1.7) - bigdecimal (3.1.9) + bigdecimal (4.1.2) citeproc (1.1.0) date forwardable @@ -36,7 +89,7 @@ GEM namae (~> 1.0) observer (< 1.0) open-uri (< 1.0) - citeproc-ruby (2.1.1) + citeproc-ruby (2.1.8) citeproc (~> 1.0, >= 1.0.9) csl (~> 2.0) observer (< 1.0) @@ -44,10 +97,10 @@ GEM fast-stemmer (~> 1.0) matrix (~> 0.4) colorator (1.1.0) - concurrent-ruby (1.3.5) - connection_pool (2.5.3) - crass (1.0.6) - csl (2.1.0) + concurrent-ruby (1.3.7) + connection_pool (3.0.2) + crass (1.0.7) + csl (2.2.1) forwardable (~> 1.3) namae (~> 1.2) open-uri (< 1.0) @@ -55,42 +108,72 @@ GEM set (~> 1.1) singleton (< 1.0) time (< 1.0) - csl-styles (2.0.1) + csl-styles (2.0.2) csl (~> 2.0) - css_parser (1.21.1) + css_parser (1.22.0) addressable - cssminify2 (2.0.1) - csv (3.3.4) - date (3.4.1) + cssminify2 (2.1.0) + csv (3.3.5) + date (3.5.1) deep_merge (1.2.2) - drb (2.2.1) + drb (2.2.3) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) - execjs (2.10.0) + execjs (2.10.1) fast-stemmer (1.0.2) - feedjira (3.2.5) + feedjira (4.0.2) + logger (>= 1.0, < 2) loofah (>= 2.3.1, < 3) sax-machine (>= 1.0, < 2) - ffi (1.17.2) - forwardable (1.3.3) + ffi (1.17.4-aarch64-linux-gnu) + ffi (1.17.4-aarch64-linux-musl) + ffi (1.17.4-arm-linux-gnu) + ffi (1.17.4-arm-linux-musl) + ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x86_64-darwin) + ffi (1.17.4-x86_64-linux-gnu) + ffi (1.17.4-x86_64-linux-musl) + forwardable (1.4.0) forwardable-extended (2.6.0) gemoji (4.1.0) - google-protobuf (4.30.2) + google-protobuf (4.35.0) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-aarch64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-aarch64-linux-musl) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-arm64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-x86_64-darwin) bigdecimal - rake (>= 13) + rake (~> 13.3) + google-protobuf (4.35.0-x86_64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-x86_64-linux-musl) + bigdecimal + rake (~> 13.3) html-pipeline (2.14.3) activesupport (>= 2) nokogiri (>= 1.4) htmlcompressor (0.4.0) - http_parser.rb (0.8.0) - httparty (0.23.1) + http_parser.rb (0.8.1) + httparty (0.24.2) csv mini_mime (>= 1.0.0) multi_xml (>= 0.5.2) - i18n (1.14.7) + i18n (1.14.8) concurrent-ruby (~> 1.0) + jekyll-3rd-party-libraries (0.0.1) + css_parser (>= 1.6, < 2.0) + jekyll (>= 3.6, < 5.0) + nokogiri (>= 1.8, < 2.0) jekyll (4.4.1) addressable (~> 2.4) base64 (~> 0.2) @@ -110,9 +193,11 @@ GEM safe_yaml (~> 1.0) terminal-table (>= 1.8, < 4.0) webrick (~> 1.7) - jekyll-archives-v2 (0.0.6) + jekyll-archives-v2 (0.0.8) activesupport jekyll (>= 3.6, < 5.0) + jekyll-cache-bust (0.0.1) + jekyll (>= 3.6, < 5.0) jekyll-email-protect (1.1.0) jekyll-feed (0.17.0) jekyll (>= 3.7, < 5.0) @@ -123,26 +208,28 @@ GEM jekyll (>= 3.4) jekyll-jupyter-notebook (0.0.6) jekyll - jekyll-link-attributes (1.0.1) - jekyll-minifier (0.1.10) - cssminify2 (~> 2.0) + jekyll-link-attributes (2.0.1) + jekyll-minifier (0.2.2) + cssminify2 (~> 2.1.0) htmlcompressor (~> 0.4) - jekyll (>= 3.5) + jekyll (~> 4.0) json-minify (~> 0.0.3) - uglifier (~> 4.1) + terser (~> 1.2.3) jekyll-paginate-v2 (3.0.0) jekyll (>= 3.0, < 5.0) jekyll-regex-replace (1.1.0) jekyll-remote-include (1.0.2) jekyll-sass-converter (3.1.0) sass-embedded (~> 1.75) - jekyll-scholar (7.2.0) + jekyll-scholar (7.3.0) bibtex-ruby (~> 6.0) - citeproc-ruby (~> 2.0) + citeproc-ruby (>= 2.1.6) csl-styles (~> 2.0) jekyll (~> 4.0) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) + jekyll-socials (0.0.7) + jekyll (>= 3.6, < 5.0) jekyll-tabs (1.2.1) jekyll (>= 3.0, < 5.0) jekyll-toc (0.19.0) @@ -155,34 +242,46 @@ GEM gemoji (>= 3, < 5) html-pipeline (~> 2.2) jekyll (>= 3.0, < 5.0) - json (2.11.3) + json (2.19.9) json-minify (0.0.3) json (> 0) - kramdown (2.5.1) - rexml (>= 3.3.9) + kramdown (2.5.2) + rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - latex-decode (0.4.0) + latex-decode (0.4.2) liquid (4.0.4) - listen (3.9.0) + listen (3.10.0) + logger rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) logger (1.7.0) - loofah (2.24.0) + loofah (2.25.2) crass (~> 1.0.2) nokogiri (>= 1.12.0) - matrix (0.4.2) + matrix (0.4.3) mercenary (0.4.0) mini_mime (1.1.5) - mini_portile2 (2.8.8) - minitest (6.0.1) - prism (~> 1.5) - multi_xml (0.7.2) - bigdecimal (~> 3.1) + minitest (5.27.0) + multi_xml (0.9.1) + bigdecimal (>= 3.1, < 5) namae (1.2.0) racc (~> 1.7) - nokogiri (1.18.8) - mini_portile2 (~> 2.8.2) + nokogiri (1.19.4-aarch64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-aarch64-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-musl) racc (~> 1.4) observer (0.1.2) open-uri (0.5.0) @@ -192,78 +291,83 @@ GEM ostruct (0.6.3) pathutil (0.16.2) forwardable-extended (~> 2.6) - prism (1.7.0) - public_suffix (6.0.2) + public_suffix (7.0.5) racc (1.8.1) - rake (13.2.1) + rake (13.4.2) rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.4.1) - rouge (4.5.2) + rexml (3.4.4) + rouge (4.7.0) safe_yaml (1.0.5) - sass-embedded (1.87.0) - google-protobuf (~> 4.30) - rake (>= 13) - sass-embedded (1.87.0-aarch64-linux-gnu) - google-protobuf (~> 4.30) - sass-embedded (1.87.0-aarch64-linux-musl) - google-protobuf (~> 4.30) - sass-embedded (1.87.0-arm-linux-gnueabihf) - google-protobuf (~> 4.30) - sass-embedded (1.87.0-arm-linux-musleabihf) - google-protobuf (~> 4.30) - sass-embedded (1.87.0-arm64-darwin) - google-protobuf (~> 4.30) - sass-embedded (1.87.0-x86_64-darwin) - google-protobuf (~> 4.30) - sass-embedded (1.87.0-x86_64-linux-gnu) - google-protobuf (~> 4.30) - sass-embedded (1.87.0-x86_64-linux-musl) - google-protobuf (~> 4.30) + sass-embedded (1.100.0-aarch64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-aarch64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-arm-linux-gnueabihf) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-arm-linux-musleabihf) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-x86_64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-x86_64-linux-musl) + google-protobuf (~> 4.31) sax-machine (1.3.2) securerandom (0.4.1) - set (1.1.1) + set (1.1.3) singleton (0.3.0) - stringio (3.1.7) + stringio (3.2.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - terser (1.2.6) + terser (1.2.7) execjs (>= 0.3.0, < 3) - time (0.4.1) + time (0.4.2) date tzinfo (2.0.6) concurrent-ruby (~> 1.0) - uglifier (4.2.1) - execjs (>= 0.3.0, < 3) unicode-display_width (2.6.0) - uri (1.0.3) - webrick (1.9.1) + uri (1.1.1) + webrick (1.9.2) PLATFORMS - aarch64-linux aarch64-linux-gnu aarch64-linux-musl - arm-linux arm-linux-gnu arm-linux-gnueabihf arm-linux-musl arm-linux-musleabihf arm64-darwin - x86-linux - x86-linux-gnu - x86-linux-musl x86_64-darwin x86_64-linux-gnu x86_64-linux-musl DEPENDENCIES + al_analytics (= 1.0.2) + al_charts (= 1.0.1) + al_citations (= 1.0.1) + al_comments (= 1.0.0) + al_cookie (= 1.0.0) + al_ext_posts (= 1.0.3) + al_folio_bootstrap_compat (= 1.0.0) + al_folio_core (= 1.0.12) + al_folio_cv (= 1.0.2) + al_folio_distill (= 1.0.3) + al_folio_upgrade (= 1.0.3) + al_icons (= 1.0.0) + al_img_tools (= 1.0.3) + al_math (= 1.0.2) + al_newsletter (= 1.0.0) + al_search (= 1.0.3) classifier-reborn css_parser - feedjira - httparty jekyll + jekyll-3rd-party-libraries jekyll-archives-v2 + jekyll-cache-bust jekyll-email-protect jekyll-feed jekyll-get-json @@ -276,6 +380,7 @@ DEPENDENCIES jekyll-remote-include jekyll-scholar jekyll-sitemap + jekyll-socials jekyll-tabs jekyll-terser! jekyll-toc @@ -284,5 +389,151 @@ DEPENDENCIES observer ostruct +CHECKSUMS + activesupport (7.2.3.1) sha256=11ebed516a43a0bb47346227a35ebae4d9427465a7c9eb197a03d5c8d283cb34 + addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af + al_analytics (1.0.2) sha256=0c8e0c029b1a28401d21ed9b56033036697e61722a0d8867f33c30010ad738d6 + al_charts (1.0.1) sha256=ce26374c2b1159ae0d65dc7999730be700a9ee486002ae14cb480eef70580885 + al_citations (1.0.1) sha256=308cfd4cd73c8dc6d24c0214f424b61606b3a393bdb899394fce80dd647cba59 + al_comments (1.0.0) sha256=1da87a29b55e4d9fd62d380200af9671f10ae4a84e3259828588498d8f3210e5 + al_cookie (1.0.0) sha256=0b36310f84c88e758fb18f2217e8fca8a282b8bd7f5ee9793c6d38ca0cc97348 + al_ext_posts (1.0.3) sha256=c4956d36071958d30de14f6c368863d3e4190dfe312dba08ff79aa685292420d + al_folio_bootstrap_compat (1.0.0) sha256=c210ff3087f17344dc864fa9594c737e947b23c6cae9fab3dbd37a87090b98a8 + al_folio_core (1.0.12) sha256=1536807fa257c9e8ca60160dc45414d3792afcf6b674518d8583e783336f324e + al_folio_cv (1.0.2) sha256=d9b8d3624c0c707a04deaa41972fa88395fa164419bccc44e2dc2488400022fa + al_folio_distill (1.0.3) sha256=3feb669dd669effec127e1be5385158c5f98062c510980b5c9c802227ec2c247 + al_folio_upgrade (1.0.3) sha256=434ffddb27705852eae0bcaa01a8d007e0ef65472a989d1a33ae759f910f4709 + al_icons (1.0.0) sha256=7a7b6428d18e77b039aa1ae765a3faed0ae27cb646a08c1009b145c31ca5ef2d + al_img_tools (1.0.3) sha256=c50dfa206bb4459925cbfc0e7d03b326e7cb1c282200d5d110b6595f4d661cf7 + al_math (1.0.2) sha256=c9fa6f3e343c0d35782d77fe386461ceff7d12186d9b51e6c92bb186b3d60781 + al_newsletter (1.0.0) sha256=27c914f5fcd0c7fac51a513ab11de7123f05de7ba834206a68ddf2588ede96d3 + al_search (1.0.3) sha256=70e846081b57a3494dd41e6bc8e1af13997200c5c28744f2449a8ebe07f79a8a + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c + bibtex-ruby (6.2.0) sha256=d610eba78d6adf503a843daf144644449fb34e7c3f4a75e9ab67fae5dfd7c69a + bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd + citeproc (1.1.0) sha256=278e6b8948133e82bef1c8204a1f88ca7adaa8744b9a283fe73e8f4cd0b53b95 + citeproc-ruby (2.1.8) sha256=192ce6525235adaa60d1dbc3f1b10b0839e86d98a94278736b807e234b3572e9 + classifier-reborn (2.3.0) sha256=e2236322de42b9c8d45d88a951cb0d76e210afa3bb8658b7b5802e2df41ef61c + colorator (1.1.0) sha256=e2f85daf57af47d740db2a32191d1bdfb0f6503a0dfbc8327d0c9154d5ddfc38 + concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a + crass (1.0.7) sha256=94868719948664c89ddcaf0a37c65048413dfcb1c869470a5f7a7ceb5390b295 + csl (2.2.1) sha256=624352f1f6f51f1e0b155bd2501ce423f03264495ec259e65c26e00872a195a2 + csl-styles (2.0.2) sha256=a48007d8a60307825de140dc2adaacc0b7186f2d1042f7e839eb47fce051de98 + css_parser (1.22.0) sha256=f274988a40c6178305530d60e7deb5162f7b5538b701b61b5488fc703e5b40c1 + cssminify2 (2.1.0) sha256=406a0b95fdaab60132c6f1fbb47b4a30f9572d2ef523f806fb94a530d78c2bb1 + csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f + date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 + deep_merge (1.2.2) sha256=83ced3a3d7f95f67de958d2ce41b1874e83c8d94fe2ddbff50c8b4b82323563a + drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373 + em-websocket (0.5.3) sha256=f56a92bde4e6cb879256d58ee31f124181f68f8887bd14d53d5d9a292758c6a8 + eventmachine (1.2.7) sha256=994016e42aa041477ba9cff45cbe50de2047f25dd418eba003e84f0d16560972 + execjs (2.10.1) sha256=abe0ae028467eb8e30c10814eb934d07876a691aae7e803d813b7ce5a75e73f1 + fast-stemmer (1.0.2) sha256=d0aa9fd9cfbca836a09d8abb122552ac8234130271a3b0da1cb077323d650819 + feedjira (4.0.2) sha256=3e7a90d24fd66eddc809539e637a86a02de1a7e038cd40157e916ed2f3b5ff71 + ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df + ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39 + ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564 + ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95 + ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b + ffi (1.17.4-x86_64-darwin) sha256=aa70390523cf3235096cf64962b709b4cfbd5c082a2cb2ae714eb0fe2ccda496 + ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d + ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e + forwardable (1.4.0) sha256=f1cd40cc9812937980e1c76f1aa053660990a7c9b6a98fc37d945468afcce838 + forwardable-extended (2.6.0) sha256=1bec948c469bbddfadeb3bd90eb8c85f6e627a412a3e852acfd7eaedbac3ec97 + gemoji (4.1.0) sha256=734434020cbe964ea9d19086798797a47d23a170892de0ce55b74aa65d2ddc1a + google-protobuf (4.35.0) sha256=95346162c792ed78c9a28cbf2d937a53f706de6df36a27471582f63f03c30c0d + google-protobuf (4.35.0-aarch64-linux-gnu) sha256=2cabd61b420918aec1564f9f7414e455bf922d20c5f8139d62783df5558a7aea + google-protobuf (4.35.0-aarch64-linux-musl) sha256=f6b11f3420a4564f68e8233c95eac6924f6a727dfc2f81a56af2e09add551501 + google-protobuf (4.35.0-arm64-darwin) sha256=66ab26d3fc82b8950702e53ab16c198e3c0ea3f2a38aaaf1f32152da45593ac5 + google-protobuf (4.35.0-x86_64-darwin) sha256=05eb5c8bc9899135befff496fc0a3642e7ff3d0943f043841dcc456f5654fea0 + google-protobuf (4.35.0-x86_64-linux-gnu) sha256=999226f3b00cd9fddb1b26851d16060212fa1d90c406aaad47e574682b716059 + google-protobuf (4.35.0-x86_64-linux-musl) sha256=be0218520d77b2aee898b363514b03819f6f63f9c041ae0d0d79b4ce5247bffd + html-pipeline (2.14.3) sha256=8a1d4d7128b2141913387cac0f8ba898bb6812557001acc0c2b46910f59413a0 + htmlcompressor (0.4.0) sha256=4630cf8ed46b563f0b49cc6028a3fe8c17a9067f2becd7c3a2aa5aaacefb1f9e + http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a + httparty (0.24.2) sha256=8fca6a54aa0c4aa4303a0fd33e5e2156175d6a5334f714263b458abd7fda9c38 + i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 + jekyll (4.4.1) sha256=4c1144d857a5b2b80d45b8cf5138289579a9f8136aadfa6dd684b31fe2bc18c1 + jekyll-3rd-party-libraries (0.0.1) sha256=331f8d53adbb532a27705d9d4fb719c7f306247c56531fa22c0178f4a445a692 + jekyll-archives-v2 (0.0.8) sha256=5584088b4bd188a6099a2f6940c223f037ddb30e70890fcca1da299395584a7d + jekyll-cache-bust (0.0.1) sha256=538ffe6d48f56d933b435bf32d4fef19ff1082cae7d6d8bc737fc13a9c86ba8c + jekyll-email-protect (1.1.0) sha256=00d620939c710788ae3f71188ef913e0aa7ff0a5a39f48249213ea6215558c8d + jekyll-feed (0.17.0) sha256=689aab16c877949bb9e7a5c436de6278318a51ecb974792232fd94d8b3acfcc3 + jekyll-get-json (1.0.0) sha256=f6b076a93de9cace89a88617b494bea10e6dbb86331c293d663d37d9b9ae7522 + jekyll-imagemagick (1.4.0) sha256=dcf4ae46ffbeabfac584a5256821e39fc5fae8d651fd5c4a56fef3a2061a7ef4 + jekyll-jupyter-notebook (0.0.6) sha256=33f757eaad9035bebc5309e23ce2274db089ae8a0d002a53c3acbc5265d322cd + jekyll-link-attributes (2.0.1) sha256=e25b12e3c2a2960c8cfd9ab33e8df9aa3c4ba86491dbeec48f3cb11b0a0f216d + jekyll-minifier (0.2.2) sha256=f0a182b98b369492b9d93f1dd064223cf04a10ba31c49e1535f28fe35764ee19 + jekyll-paginate-v2 (3.0.0) sha256=001be6c1963caa41fed9c2f43b0d47201defa0395381eb8830487c1c2fc4f4e3 + jekyll-regex-replace (1.1.0) sha256=3738e6a0aa07dd3f9b7369e6e38e5d245c623bbd70c31b21e7838c654377a00c + jekyll-remote-include (1.0.2) sha256=dbf8f2213244a4de2225f92f74206d71085b6b23e4611733f614587e01d88295 + jekyll-sass-converter (3.1.0) sha256=83925d84f1d134410c11d0c6643b0093e82e3a3cf127e90757a85294a3862443 + jekyll-scholar (7.3.0) sha256=d912e60aa5ab342fb4322772f02674152e2799375612a2aa5f9b2228728fd09b + jekyll-sitemap (1.4.0) sha256=0de08c5debc185ea5a8f980e1025c7cd3f8e0c35c8b6ef592f15c46235cf4218 + jekyll-socials (0.0.7) sha256=813448f79182fa5aa05a87e2b7cfec3d9a55660a323f082e249a47a84f2a7518 + jekyll-tabs (1.2.1) sha256=e7e0f05d1180c9651318fb5834a0c745a613b4253e9699a662b63cc3d39cbc4d + jekyll-terser (0.2.3) + jekyll-toc (0.19.0) sha256=8a8270f7e8e3d849e2035710b1713d0af5e2185a4bfaca70f9192ecf5ac50668 + jekyll-twitter-plugin (2.1.0) sha256=d25ee86813705244dcec3163d9a110a1c0216e157dcf6cf88ab57cf389887acd + jekyll-watch (2.2.1) sha256=bc44ed43f5e0a552836245a54dbff3ea7421ecc2856707e8a1ee203a8387a7e1 + jemoji (0.13.0) sha256=5d4c3e8e2cbbb2b73997c31294f6f70c94e4d4fade039373e86835bcf5529e7c + json (2.19.9) sha256=9b9025b7cdddafa38d316eca0b2358488e42d417045c1b90d216a9fefe46b79a + json-minify (0.0.3) sha256=fd38ef93867332c2340aaf1b57335782ab5958fe6fb3ca7a8aba1469f0bf08ae + kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa + kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 + latex-decode (0.4.2) sha256=e85633406e315e348e0ca6de231dee1bf45a22496b0866059c635f7502c2a592 + liquid (4.0.4) sha256=4fcfebb1a045e47918388dbb7a0925e7c3893e58d2bd6c3b3c73ec17a2d8fdb3 + listen (3.10.0) sha256=c6e182db62143aeccc2e1960033bebe7445309c7272061979bb098d03760c9d2 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + loofah (2.25.2) sha256=2007f746959ac65552456e04b433e83deb22759ab38c838b4445c70e43425918 + matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b + mercenary (0.4.0) sha256=b25a1e4a59adca88665e08e24acf0af30da5b5d859f7d8f38fba52c28f405138 + mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef + minitest (5.27.0) sha256=2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5 + multi_xml (0.9.1) sha256=7ce766b59c17241ed62976caeae1fae9b2431b263398c35396239a68c4a64e57 + namae (1.2.0) sha256=3541ce4b086fd4981d2376630c03e284402bfe1cdbab4e50e2222a72aeb9d59d + nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f + nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af + nokogiri (1.19.4-arm-linux-gnu) sha256=a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca + nokogiri (1.19.4-arm-linux-musl) sha256=588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb + nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 + nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 + nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a + nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b + observer (0.1.2) sha256=d8a3107131ba661138d748e7be3dbafc0d82e732fffba9fccb3d7829880950ac + open-uri (0.5.0) sha256=7b4f06fdac39e6946aed15a8da82531580882fbbec80438adcb7c30d388887ca + ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 + pathutil (0.16.2) sha256=e43b74365631cab4f6d5e4228f812927efc9cb2c71e62976edcb252ee948d589 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 + racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 + rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe + rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739 + safe_yaml (1.0.5) sha256=a6ac2d64b7eb027bdeeca1851fe7e7af0d668e133e8a88066a0c6f7087d9f848 + sass-embedded (1.100.0-aarch64-linux-gnu) sha256=c13187f8eaae7e7e64246b18eb896534a84465a17198829ef65730db4662860e + sass-embedded (1.100.0-aarch64-linux-musl) sha256=1b0945a66cd4e40f505db73b1e790e2561e07e6d9fd04ef6ebbf279835666b3f + sass-embedded (1.100.0-arm-linux-gnueabihf) sha256=a2de272bb02977ea91acaf3fecb6d8e09e4989501efbfc5375da4b5e7bff001d + sass-embedded (1.100.0-arm-linux-musleabihf) sha256=ce19837c10bab5ae6785f10b435a57a64ca027a99875cd701dc6fd3af317cbe5 + sass-embedded (1.100.0-arm64-darwin) sha256=d294b32c3b7bed293ad39bd392713c07f1df5454e65fa0f8d80dadbdba8a0cf4 + sass-embedded (1.100.0-x86_64-darwin) sha256=3db80c837a60712de3461d5aa1be43c7056a0584d7182a8ae7a8996d64ab46d3 + sass-embedded (1.100.0-x86_64-linux-gnu) sha256=58dd0a8a4f0dd78881b90d8b0e4d0eed042d54865b19b71384d91091ade93e18 + sass-embedded (1.100.0-x86_64-linux-musl) sha256=03dbee81bf93e770c725caf0c895e04c7b049ebef56b8a7002fcf21e6bedf7c5 + sax-machine (1.3.2) sha256=a1112678039eea4c402827ca0d377744e0f882fd6386f29f7b0023d938750d3a + securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 + set (1.1.3) sha256=12bbbd31c8b177d55ac0314bcc7f4c473276b06e8a2dcfdc14326e73ce7769ce + singleton (0.3.0) sha256=83ea1bca5f4aa34d00305ab842a7862ea5a8a11c73d362cb52379d94e9615778 + stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 + terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91 + terser (1.2.7) sha256=1b12eb49769dadac44caac3485b38928ff4ab435f1bbbacfe8048cff84c6aa1b + time (0.4.2) sha256=f324e498c3bde9471d45a7d18f874c27980e9867aa5cfca61bebf52262bc3dab + tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b + unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a + uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 + BUNDLED WITH - 2.5.22 + 4.0.6 diff --git a/_bibliography/papers.bib b/_bibliography/papers.bib index b65ef745fe9ee..2cd60c1f5a2f5 100644 --- a/_bibliography/papers.bib +++ b/_bibliography/papers.bib @@ -71,13 +71,13 @@ @article{dogan2025bottom author = {Dogan, Timur and Li, Chengxuan and Tseng, Hung Ming and Su, Amber Jiayu and Kastner, Patrick}, journal = {Journal of Building Performance Simulation}, pages = {1--28}, - year = {2025}, + year = 2025, pdf = {https://www.researchgate.net/publication/393995198_A_bottom-up_urban_building_energy_model_for_evaluating_thermal_load_electrification_measures}, abstract = {Urban Building Energy Modelling offers critical insights for urban decarbonization planning, but its adoption remains limited due to data challenges and model complexity. This paper introduces a fully automated, bottom-up UBEM framework that integrates LiDAR-derived 3D building geometry, tax and permit records, DOE and RECS-informed building templates, and utility data. Building models are generated and auto-calibrated using a computationally efficient 5R1C resistor-capacitor thermal model, augmented with a derivative-free optimization algorithm (BOBYQA) to minimize calibration error against seasonal energy billing data. Applied to the City of Ithaca, NY, the framework simulates over 5,000 buildings within minutes on a standard laptop, achieving sub-20% MAPE in calibrated zones. The model supports scenario-based analysis of electrification, envelope upgrades, rooftop PV adoption, and incentive schemes, incorporating detailed retrofit cost and payback calculations. This workflow demonstrates a scalable pathway for high-resolution, financially aware UBEMs suitable for deployment in small – to mid-sized jurisdictions with limited modelling capacity.}, publisher = {Taylor \& Francis}, bibtex_show = {true}, preview = {jbps-2025.png}, - selected = {true}, + selected = {false}, google_scholar_id = {hFOr9nPyWt4C} } @@ -93,7 +93,7 @@ @article{rahimi2025incorporating abstract = {Accurate microclimate data, obtained through observation or CFD models, is crucial for urban design and environmental improvements. One approach to quantifying microclimate conditions involves the use of isothermal CFD simulations combined with convective heat transfer and relative humidity modeling, implemented via the buoyantHumidityPimpleFoam solver in OpenFOAM. This research investigates the additional complexity when incorporating these factors into unsteady-state modeling for urban microclimate simulations. This study reports the approaches through simulations employing a simplified canyon model. The study site is the campus of the Toronto Metropolitan University campus in Toronto, Ontario, Canada. The simulation data is validated using real-time data collected from the weather station located on the roof of one of the buildings on the downtown campus. By comparing the simulated data with real-time observations, the study assesses the effectiveness of the new features and evaluates their suitability for integration into existing urban microclimate modeling frameworks. The results show that adding humidity not only improves the model realism but also greatly increases its ability to predict complex urban microclimate dynamics. These findings highlight the importance of this approach for applications such as thermal comfort optimization, public health planning, and climate resilience strategies, demonstrating its potential to advance urban microclimate simulations.}, preview = {b-e-2025.jpg}, bibtex_show = {true}, - selected = {true}, + selected = {false}, code = {https://github.com/SustainableUrbanSystemsLab/JP-BE2025-Humidity-Case}, google_scholar_id = {dhFuZR0502QC} } @@ -142,7 +142,8 @@ @inproceedings{vangelova2024sigradi bibtex_show = {true}, preview = {sigradi-2024.jpg}, code = {https://github.com/SustainableUrbanSystemsLab/CP-SIGRADI2024-Assessing-Solar-Potential-of-Buildings-Using-LiDAR-and-Footprint-Data}, - google_scholar_id = {L8Ckcad2t8MC} + google_scholar_id = {L8Ckcad2t8MC}, + code = {https://github.com/SustainableUrbanSystemsLab/CP-SIGRADI2024-Assessing-Solar-Potential-of-Buildings-Using-LiDAR-and-Footprint-Data} } @inproceedings{almaian2024heat, @@ -157,7 +158,8 @@ @inproceedings{almaian2024heat bibtex_show = {true}, preview = {ibpc-2024-ma.png}, code = {https://github.com/SustainableUrbanSystemsLab/CP-IBPC2024-3D-Heat-Transfer-Analysis-in-Architectural-Modeling}, - google_scholar_id = {9ZlFYXVOiuMC} + google_scholar_id = {9ZlFYXVOiuMC}, + code = {https://github.com/SustainableUrbanSystemsLab/CP-IBPC2024-3D-Heat-Transfer-Analysis-in-Architectural-Modeling} } @inproceedings{dogan2024impact, @@ -269,7 +271,7 @@ @inproceedings{DeSimone2021 code = {https://www.eddy3d.com/download/}, preview = {bs-2021.png}, google_scholar_id = {LkGwnXOMwfcC}, - selected = {true} + selected = {false} } @article{DOGAN2021surfer, @@ -369,7 +371,8 @@ @inproceedings{kastner2020solving bibtex_show = {true}, code = {https://github.com/SustainableUrbanSystemsLab/CP-SimAUD-HeatFlux}, google_scholar_id = {qjMakFHDy7sC}, - preview = {sim-aud-2020-02.jpg} + preview = {sim-aud-2020-02.jpg}, + code = {https://github.com/SustainableUrbanSystemsLab/CP-SimAUD-HeatFlux} } @article{natanian2020energy, @@ -465,5 +468,7 @@ @article{KARADAG2026107614 keywords = {Urban wind simulation, Machine learning, Computational fluid dynamics, Pedestrian-level wind, Surrogate modeling}, abstract = {Urban wind simulation plays an important role in pedestrian comfort assessment, wind safety evaluation, air quality analysis, and broader urban environmental planning. Conventional computational fluid dynamics (CFD) approaches, although physically grounded, remain computationally demanding and highly reliant on mesh quality, which makes them impractical for large-scale or iterative urban design workflows. This study reviews recent developments in data-driven, physics-informed, and hybrid machine learning methods for urban wind prediction, with attention to their modeling assumptions, validation strategies, and generalization behavior. The literature is organized along the urban wind simulation pipeline to provide a structured overview of current surrogate modeling approaches and their practical limitations. The review highlights open challenges related to robustness, benchmarking, and uncertainty quantification, and discusses directions for improving the reliability and scalability of ML-based urban wind modeling.}, preview = {karadag_abstract.png}, -bibtex_show = {true} +bibtex_show = {true}, +selected = {true}, +google_scholar_id = {KARADAG2026107614} } diff --git a/_config.yml b/_config.yml index 5b9cd977dc0cd..0f794d74b7f34 100644 --- a/_config.yml +++ b/_config.yml @@ -31,13 +31,50 @@ logo: # ----------------------------------------------------------------------------- # repo color theme -repo_theme_light: default # https://github.com/anuraghazra/github-readme-stats/blob/master/themes/README.md -repo_theme_dark: dark # https://github.com/anuraghazra/github-readme-stats/blob/master/themes/README.md +repo_theme_light: default # https://github.com/stats-organization/github-stats-extended/blob/master/packages/core/src/themes/README.md +repo_theme_dark: dark # https://github.com/stats-organization/github-stats-extended/blob/master/packages/core/src/themes/README.md repo_trophies: enabled: true theme_light: flat # https://github.com/ryo-ma/github-profile-trophy theme_dark: gitdimmed # https://github.com/ryo-ma/github-profile-trophy +# External service URLs for repository page +# To use a different instance or service for displaying GitHub stats and trophies, +# update these URLs. These are used in the repository templates. +external_services: + github_readme_stats_url: https://github-stats-extended.vercel.app + github_profile_trophy_url: https://github-profile-trophy.vercel.app + +# ----------------------------------------------------------------------------- +# al-folio API (v1.x) +# ----------------------------------------------------------------------------- + +al_folio: + api_version: 1 + style_engine: tailwind + tailwind: + version: 4.1.18 + preflight: false + css_entry: assets/tailwind/app.css + distill: + engine: distillpub-template + source: al-org-dev/distill-template#al-folio + allow_remote_loader: false + features: + cv: + enabled: true + distill: + enabled: true + compat: + bootstrap: + enabled: false + support_window: v1.0-v1.2 + deprecates_in: v1.3 + removed_in: v2.0 + upgrade: + channel: stable + auto_apply_safe_fixes: false + # ----------------------------------------------------------------------------- # RSS Feed # ----------------------------------------------------------------------------- @@ -57,8 +94,6 @@ bib_search: true # Dimensions max_width: 930px -# TODO: add layout settings (single page vs. multi-page) - # ----------------------------------------------------------------------------- # Open Graph & Schema.org # ----------------------------------------------------------------------------- @@ -74,12 +109,15 @@ og_image: # The site-wide (default for all links) Open Graph preview image # Analytics and search engine verification # ----------------------------------------------------------------------------- -# 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) +analytics: + # 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: # your Google Analytics measurement ID (format: G-XXXXXXXXXX) + cronitor: # cronitor RUM analytics site ID (format: XXXXXXXXX) + pirsch: # your Pirsch analytics site ID (length 32 characters) + openpanel: # your Openpanel analytics client ID (format: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) + cloudflare: # your Cloudflare Web Analytics beacon token (32 hex characters) +enable_simple_analytics: false # Simple Analytics identifies a site by its domain, so it has no ID to set above # 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) @@ -125,13 +163,15 @@ disqus_shortname: al-folio # put your disqus shortname # External sources. # If you have blog posts published on medium.com or other external sources, # you can display them in your blog by adding a link to the RSS feed. +# Optional: Set default categories and tags for posts from each source. external_sources: + # This site does not syndicate external posts. The upstream template ships + # medium.com / Google Blog examples here; `categories` and `tags` per source + # are supported by al_ext_posts >= 1.0.1 if we ever enable them. #- name: medium.com # rss_url: https://medium.com/@al-folio/feed - #- name: Google Blog - # posts: - # - url: https://blog.google/technology/ai/google-gemini-update-flash-ai-assistant-io-2024/ - # published_date: 2024-05-14 + # categories: [external-posts] + # tags: [medium] # ----------------------------------------------------------------------------- # Newsletter @@ -156,6 +196,9 @@ collections: projects: output: true permalink: /:collection/:title/ + # NOTE: this site uses `teaching` (singular, `_teaching/`), which predates the + # upstream `teachings` collection introduced in v1.x. Renaming would change + # every /teaching/... URL, so the singular collection is kept deliberately. teaching: output: true permalink: /teaching/:path/ @@ -163,7 +206,6 @@ collections: output: true permalink: /:collection/:title/ - announcements: enabled: true scrollable: true # adds a vertical scroll bar if there are more than 3 news items @@ -192,18 +234,18 @@ kramdown: start_line: 1 # Includes & excludes -include: ["_pages", "_scripts"] +include: ["_pages"] exclude: + - AGENTS.md + - al-folio-upgrade-report.md - bin/ - - CONTRIBUTING.md - - CUSTOMIZE.md + - CLAUDE.md - Dockerfile - docker-compose.yml - docker-compose-slim.yml - - FAQ.md + - docs/ - Gemfile - Gemfile.lock - - INSTALL.md - LICENSE - lighthouse_results/ - package.json @@ -212,14 +254,25 @@ exclude: - purgecss.config.js - README.md - readme_preview/ + - gems/ + - migrations/ - vendor + # Upstream's Playwright/integration harness. v1.1 ships `test/` in the starter but + # does not exclude it, so without this the specs and shell scripts get published + # to the live site. Not upstreamed here; drop this line if al-folio adds it. + - test/ keep_files: - CNAME - .nojekyll +# Use al_folio_core as the theme runtime; local files can still override theme files. +theme: al_folio_core + # Plug-ins plugins: + - jekyll-3rd-party-libraries - jekyll-archives-v2 + - jekyll-cache-bust - jekyll-email-protect - jekyll-feed - jekyll-get-json @@ -231,6 +284,7 @@ plugins: - jekyll-regex-replace - jekyll/scholar - jekyll-sitemap + - jekyll-socials - jekyll-tabs - jekyll-terser - jekyll-toc @@ -238,6 +292,24 @@ plugins: - jekyll-remote-include - jemoji + # al-folio plugins + - al_folio_core + - al_icons + - al_folio_cv + - al_folio_distill + - al_folio_upgrade + - al_folio_bootstrap_compat + - al_cookie + - al_analytics + - al_citations + - al_ext_posts + - al_img_tools + - al_search + - al_charts + - al_math + - al_comments + - al_newsletter + # Sitemap settings defaults: - scope: @@ -254,7 +326,13 @@ sass: jekyll-minifier: compress_javascript: false # set to false since we are using terser as the js minifier - exclude: ["robots.txt", "assets/js/search/*.js"] + # CSS is already minified upstream (Tailwind build ships tailwind.css; main.scss is compiled + # with sass `style: compressed`). Re-minifying via cssminify2 mangles Tailwind v4 spacing + # tokens inside calc(), turning `var(--spacing)` into the invalid `var( - - spacing)` and + # breaking every spacing/positioning utility (e.g. .fixed-top -> broken navbar). Disable it. + compress_css: false + # JS minification is delegated to jekyll-terser (compress_javascript above is false). + exclude: ["robots.txt"] # ----------------------------------------------------------------------------- # Terser @@ -332,10 +410,14 @@ filtered_bibtex_keywords: bibtex_show, blog, code, + dimensions, + eprint, google_scholar_id, + hal, html, inspirehep_id, pdf, + pmid, poster, preview, selected, @@ -384,7 +466,7 @@ imagemagick: - ".tiff" #- ".gif" output_formats: - webp: "-quality 85" + webp: "-auto-orient -quality 85" # Lazy loading images # If you enable lazy loading, all images will add the loading="lazy" attribute. @@ -398,12 +480,9 @@ lazy_loading_images: true # enables lazy loading of images (recommended) # Optional Features # ----------------------------------------------------------------------------- -enable_google_analytics: false # enables google analytics -enable_cronitor_analytics: false # enables cronitor RUM analytics -enable_pirsch_analytics: false # enables Pirsch analytics (https://pirsch.io/) -enable_openpanel_analytics: false # enables Openpanel analytics (https://openpanel.dev/) enable_google_verification: false # enables google site verification enable_bing_verification: false # enables bing site verification +enable_cookie_consent: false # enables GDPR-compliant cookie consent dialog (https://github.com/orestbida/cookieconsent) enable_masonry: true # enables automatic project cards arrangement enable_math: true # enables math typesetting (uses MathJax) enable_tooltips: true # enables automatic tooltip links generated for each section titles on pages and posts @@ -431,6 +510,18 @@ third_party_libraries: css: "https://cdn.jsdelivr.net/npm/bootstrap-table@{{version}}/dist/bootstrap-table.min.css" js: "https://cdn.jsdelivr.net/npm/bootstrap-table@{{version}}/dist/bootstrap-table.min.js" version: "1.22.4" + fontawesome: + integrity: + css: "sha256-MVopmdyC2tYTiJ8wlktf0uh0v4NgT+vNdyVFepi7Q0c=" + url: + css: "https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@{{version}}/css/all.min.css" + version: "7.2.0" + academicons: + integrity: + css: "sha256-SzrCOBJbGVFMahewkgjwnApaV2+av1DwMAA+/QGLyZw=" + url: + css: "https://cdn.jsdelivr.net/npm/academicons@{{version}}/css/academicons.min.css" + version: "1.9.5" chartjs: integrity: js: "sha256-0q+JdOlScWOHcunpUk21uab1jW7C1deBQARHtKMcaB4=" @@ -478,18 +569,8 @@ third_party_libraries: integrity: js: "sha256-htrLFfZJ6v5udOG+3kNLINIKh2gvoKqwEhHYfTTMICc=" url: - js: https://cdn.jsdelivr.net/npm/imagesloaded@{{version}}/imagesloaded.pkgd.min.js + js: "https://cdn.jsdelivr.net/npm/imagesloaded@{{version}}/imagesloaded.pkgd.min.js" version: "5.0.0" - img-comparison-slider: - integrity: - css: "sha256-3qTIuuUWIFnnU3LpQMjqiXc0p09rvd0dmj+WkpQXSR8=" - js: "sha256-EXHg3x1K4oIWdyohPeKX2ZS++Wxt/FRPH7Nl01nat1o=" - map: "sha256-3wfqS2WU5kGA/ePcgFzJXl5oSN1QsgZI4/edprTgX8w=" - url: - css: "https://cdn.jsdelivr.net/npm/img-comparison-slider@{{version}}/dist/styles.min.css" - js: "https://cdn.jsdelivr.net/npm/img-comparison-slider@{{version}}/dist/index.min.js" - map: "https://cdn.jsdelivr.net/npm/img-comparison-slider@{{version}}/dist/index.js.map" - version: "8.0.6" jquery: integrity: js: "sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" @@ -509,23 +590,6 @@ third_party_libraries: js: "https://cdn.jsdelivr.net/npm/leaflet@{{version}}/dist/leaflet.min.js" js_map: "https://cdn.jsdelivr.net/npm/leaflet@{{version}}/dist/leaflet.js.map" version: "1.9.4" - lightbox2: - integrity: - css: "sha256-uypRbsAiJcFInM/ndyI/JHpzNe6DtUNXaWEUWEPfMGo=" - js: "sha256-A6jI5V9s1JznkWwsBaRK8kSeXLgIqQfxfnvdDOZEURY=" - url: - css: "https://cdn.jsdelivr.net/npm/lightbox2@{{version}}/dist/css/lightbox.min.css" - js: "https://cdn.jsdelivr.net/npm/lightbox2@{{version}}/dist/js/lightbox.min.js" - version: "2.11.5" - mathjax: - integrity: - js: "sha256-MASABpB4tYktI2Oitl4t+78w/lyA+D7b/s9GEP0JOGI=" - local: - fonts: "output/chtml/fonts/woff-v2/" - url: - fonts: "https://cdn.jsdelivr.net/npm/mathjax@{{version}}/es5/output/chtml/fonts/woff-v2/" - js: "https://cdn.jsdelivr.net/npm/mathjax@{{version}}/es5/tex-mml-chtml.js" - version: "3.2.2" masonry: integrity: js: "sha256-Nn1q/fx0H7SNLZMQ5Hw5JLaTRZp0yILA/FRexe19VdI=" @@ -544,41 +608,43 @@ third_party_libraries: js: "https://cdn.jsdelivr.net/npm/mdbootstrap@{{version}}/js/mdb.min.js" js_map: "https://cdn.jsdelivr.net/npm/mdbootstrap@{{version}}/js/mdb.min.js.map" version: "4.20.0" - medium_zoom: - integrity: - js: "sha256-ZgMyDAIYDYGxbcpJcfUnYwNevG/xi9OHKaR/8GK+jWc=" - url: - js: "https://cdn.jsdelivr.net/npm/medium-zoom@{{version}}/dist/medium-zoom.min.js" - version: "1.1.0" mermaid: integrity: js: "sha256-TtLOdUA8mstPoO6sGvHIGx2ceXrrX4KgIItO06XOn8A=" url: js: "https://cdn.jsdelivr.net/npm/mermaid@{{version}}/dist/mermaid.min.js" version: "10.7.0" - photoswipe: + mathjax: + integrity: + js: "sha256-MASABpB4tYktI2Oitl4t+78w/lyA+D7b/s9GEP0JOGI=" + local: + fonts: "output/chtml/fonts/woff-v2/" + url: + fonts: "https://cdn.jsdelivr.net/npm/mathjax@{{version}}/es5/output/chtml/fonts/woff-v2/" + js: "https://cdn.jsdelivr.net/npm/mathjax@{{version}}/es5/tex-mml-chtml.js" + version: "3.2.2" + tikzjax: integrity: - js: "sha256-VCBpdxvrNNxGHNuTdNqK9kPFkev2XY7DYzHdmgaB69Q=" + css: "sha256-p+CQrhSq3dnLHELDcVBFDf4whOor3w8gzLuc/pwRLyQ=" + js: "sha256-7SCmUR11IG4MkSoeLUq0pombv7oeV7yZuu7Z82e4Uy4=" url: - css: "https://cdn.jsdelivr.net/npm/photoswipe@{{version}}/dist/photoswipe.min.css" - js: "https://cdn.jsdelivr.net/npm/photoswipe@{{version}}/dist/photoswipe.esm.min.js" - version: "5.4.4" - photoswipe-lightbox: + css: "https://cdn.jsdelivr.net/npm/@planktimerr/tikzjax@{{version}}/dist/fonts.css" + js: "https://cdn.jsdelivr.net/npm/@planktimerr/tikzjax@{{version}}/dist/tikzjax.js" + version: "1.0.8" + tocbot: integrity: - js: "sha256-uCw4VgT5DMdwgtjhvU9e98nT2mLZXcw/8WkaTrDd3RI=" + css: "sha256-zTN0r+0OKaIv2xqeNNIYxNk0pWJ6+IqPGc1iDgVzWF0=" + js: "sha256-lo/r+jQ81wWrxdIiiiEEd538z4+dTJTt+leOuAS7GCw=" url: - js: "https://cdn.jsdelivr.net/npm/photoswipe@{{version}}/dist/photoswipe-lightbox.esm.min.js" - version: "5.4.4" + css: "https://cdn.jsdelivr.net/npm/tocbot@{{version}}/dist/tocbot.css" + js: "https://cdn.jsdelivr.net/npm/tocbot@{{version}}/dist/tocbot.min.js" + version: "4.36.4" plotly: integrity: js: "sha256-oy6Be7Eh6eiQFs5M7oXuPxxm9qbJXEtTpfSI93dW16Q=" url: js: "https://cdn.jsdelivr.net/npm/plotly.js@{{version}}/dist/plotly.min.js" version: "3.0.1" - polyfill: - url: - js: "https://cdnjs.cloudflare.com/polyfill/v{{version}}/polyfill.min.js?features=es6" - version: "3" pseudocode: integrity: css: "sha256-VwMV//xgBPDyRFVSOshhRhzJRDyBmIACniLPpeXNUdc=" @@ -587,29 +653,26 @@ third_party_libraries: css: "https://cdn.jsdelivr.net/npm/pseudocode@{{version}}/build/pseudocode.min.css" js: "https://cdn.jsdelivr.net/npm/pseudocode@{{version}}/build/pseudocode.min.js" version: "2.4.1" - spotlight: + scholar-icons: integrity: - css: "sha256-Dsvkx8BU8ntk9Iv+4sCkgHRynYSQQFP6gJfBN5STFLY=" + css: "sha256-VY3hHVj/hNX3fYG6wtbA6TcKJQl7+FthzGSyIB64klY=" url: - css: "https://cdn.jsdelivr.net/npm/spotlight.js@{{version}}/dist/css/spotlight.min.css" - js: "https://cdn.jsdelivr.net/npm/spotlight.js@{{version}}/dist/spotlight.bundle.min.js" - version: "0.7.8" - swiper: + css: "https://cdn.jsdelivr.net/npm/scholar-icons@{{version}}/css/scholar-icons.css" + version: "1.0.3" + vanilla-back-to-top: integrity: - css: "sha256-yUoNxsvX+Vo8Trj3lZ/Y5ZBf8HlBFsB6Xwm7rH75/9E=" - js: "sha256-BPrwikijIybg9OQC5SYFFqhBjERYOn97tCureFgYH1E=" - map: "sha256-lbF5CsospW93otqvWOIbbhj80CjazrZXvamD7nC7TBI=" + js: "sha256-uMJJ3EoTyfRBoTbR+lrfu1uRQ87RZG8AR3cVNuQVeFg=" url: - css: "https://cdn.jsdelivr.net/npm/swiper@{{version}}/swiper-bundle.min.css" - js: "https://cdn.jsdelivr.net/npm/swiper@{{version}}/swiper-element-bundle.min.js" - map: "https://cdn.jsdelivr.net/npm/swiper@{{version}}/swiper-element-bundle.min.js.map" - version: "11.0.5" - swiper-map: + js: "https://cdn.jsdelivr.net/npm/vanilla-back-to-top@{{version}}/dist/vanilla-back-to-top.min.js" + version: "7.2.1" + vanilla-cookieconsent: integrity: - js: "sha256-hlZaH8ySXX97bZaetnrtYlKuhx3oEXFz/s2IXchu6vk=" + css: "sha256-ygRrixsQlBByBZiOcJamh7JByO9fP+/l5UPtKNJmRsE=" + js: "sha256-vG4vLmOB/AJbJ6awr7Wg4fxonG+fxAp4cIrbIFTvRXU=" url: - js: "https://cdn.jsdelivr.net/npm/swiper@11.1.0/swiper-element-bundle.min.js.map" - version: "11.0.5" + css: "https://cdn.jsdelivr.net/npm/vanilla-cookieconsent@{{version}}/dist/cookieconsent.css" + js: "https://cdn.jsdelivr.net/npm/vanilla-cookieconsent@{{version}}/dist/cookieconsent.umd.js" + version: "3.1.0" vega: integrity: js: "sha256-Yot/cfgMMMpFwkp/5azR20Tfkt24PFqQ6IQS+80HIZs=" @@ -634,14 +697,6 @@ third_party_libraries: js: "https://cdn.jsdelivr.net/npm/vega-lite@{{version}}/build/vega-lite.min.js" js_map: "https://cdn.jsdelivr.net/npm/vega-lite@{{version}}/build/vega-lite.min.js.map" version: "5.16.3" - venobox: - integrity: - css: "sha256-ohJEB0/WsBOdBD+gQO/MGfyJSbTUI8OOLbQGdkxD6Cg=" - js: "sha256-LsGXHsHMMmTcz3KqTaWvLv6ome+7pRiic2LPnzTfiSo=" - url: - css: "https://cdn.jsdelivr.net/npm/venobox@{{version}}/dist/venobox.min.css" - js: "https://cdn.jsdelivr.net/npm/venobox@{{version}}/dist/venobox.min.js" - version: "2.1.8" # ----------------------------------------------------------------------------- # Get external JSON data diff --git a/_data/citations.yml b/_data/citations.yml index 3bfbfede363c9..efa348dd2ca38 100644 --- a/_data/citations.yml +++ b/_data/citations.yml @@ -1,8 +1,8 @@ metadata: - last_updated: '2026-06-22' + last_updated: '2026-07-29' papers: XNaNgkwAAAAJ:-f6ydRqryjwC: - citations: 5 + citations: 6 title: 'OpenPyStruct: Open-source toolkit for machine learning-driven structural optimization' year: '2025' XNaNgkwAAAAJ:2osOgNQ5qMEC: @@ -18,7 +18,7 @@ papers: title: A Physics-informed GAN framework for Urban Wind Analysis with Arbitrary Input and Output Channels year: Unknown Year XNaNgkwAAAAJ:4TOpqqG69KYC: - citations: 18 + citations: 20 title: 'Towards auto-calibrated UBEM using readily available, underutilized urban data: a case study for Ithaca, NY' year: '2024' XNaNgkwAAAAJ:7PzlFSSx8tAC: @@ -46,9 +46,13 @@ papers: title: "Towards Safer Work Environments During the COVID-19 Crisis: A Study Of Different Floor Plan Layouts and Ventilation Strategies Coupling Open FOAM and Airborne Pathogen Data for \u2026" year: '2021' XNaNgkwAAAAJ:Se3iqnhoufwC: - citations: 88 + citations: 91 title: 'Eddy3D: A toolkit for decoupled outdoor thermal comfort simulations in urban areas' year: '2022' + XNaNgkwAAAAJ:TFP_iSt0sucC: + citations: 0 + title: 'Establishing a Fire Risk Map Based on Planned Spatial Layouts and Environment in Rural Planning: A Case Study of a Stereotype Village in China' + year: '2025' XNaNgkwAAAAJ:TQgYirikUcIC: citations: 1 title: 'The influence of vegetation structure on urban microclimate: A CFD analysis of urban block and vegetation densities' @@ -58,11 +62,11 @@ papers: title: Fighting Hunger in the Digital Era year: '2018' XNaNgkwAAAAJ:UeHWp8X0CEIC: - citations: 81 + citations: 83 title: 'From energy performative to livable Mediterranean cities: An annual outdoor thermal comfort and energy balance cross-climatic typological study' year: '2020' XNaNgkwAAAAJ:WF5omc3nYNoC: - citations: 41 + citations: 42 title: Streamlined CFD simulation framework to generate wind-pressure coefficients on building facades for airflow network simulations year: '2021' XNaNgkwAAAAJ:Wp0gIr-vW9MC: @@ -74,7 +78,7 @@ papers: title: A Decoupled Framework for Fast and High-resolution Simulations of Annual Outdoor Thermal Comfort year: '2022' XNaNgkwAAAAJ:ZeXyd9-uunAC: - citations: 7 + citations: 8 title: 'Coupled urban physics in microclimate modeling: Validating and enhancing simulation tools' year: '2025' XNaNgkwAAAAJ:_Qo2XoVZTnwC: @@ -82,7 +86,7 @@ papers: title: 'Comparative Modeling of Urban Microclimate and Outdoor Thermal Comfort: A Case Study of Georgia Tech Campus' year: '2026' XNaNgkwAAAAJ:_kc_bZDykSQC: - citations: 113 + citations: 122 title: A GAN-based surrogate model for instantaneous urban wind flow prediction year: '2023' XNaNgkwAAAAJ:d1gkVwhDpl0C: @@ -90,7 +94,7 @@ papers: title: A cylindrical meshing methodology for annual urban computational fluid dynamics simulations year: '2019' XNaNgkwAAAAJ:dhFuZR0502QC: - citations: 16 + citations: 17 title: 'Incorporating convective heat transfer and humidity effects in urban microclimate modeling: Should we care?' year: '2025' XNaNgkwAAAAJ:e5wmG9Sq2KIC: @@ -98,11 +102,11 @@ papers: title: 'Comparative Modeling of Urban Microclimate and Outdoor Thermal Comfort: A Case Study of Georgia Tech Campus' year: '2025' XNaNgkwAAAAJ:eQOLeE2rZwMC: - citations: 26 + citations: 27 title: 'Surfer: A fast simulation algorithm to predict surface temperatures and mean radiant temperatures in large urban models' year: '2021' XNaNgkwAAAAJ:hFOr9nPyWt4C: - citations: 7 + citations: 9 title: A bottom-up urban building energy model for evaluating thermal load electrification measures year: '2026' XNaNgkwAAAAJ:hqOjcs7Dif8C: @@ -113,9 +117,17 @@ papers: citations: 0 title: 'Comparative Modeling of Urban Microclimate and Outdoor Thermal Comfort: A Case Study of Georgia Tech Campus' year: Unknown Year + XNaNgkwAAAAJ:isC4tDSrTZIC: + citations: 0 + title: 'EBuild AI: A Retrieval-Augmented Framework for Generating Global, Simulation-Ready Urban Building Datasets' + year: '2026' XNaNgkwAAAAJ:j3f4tGmQtD8C: citations: 0 - title: 'Machine Learning for Urban Wind Simulation: A Comprehensive Review' + title: 'Machine learning for urban wind simulation: A comprehensive review' + year: '2026' + XNaNgkwAAAAJ:k_IJM867U9cC: + citations: 0 + title: AI-Based Metric for Building and Grid Reliability Assessment via Input Propagation and Stress Testing year: '2026' XNaNgkwAAAAJ:mB3voiENLucC: citations: 0 diff --git a/_data/cv.yml b/_data/cv.yml index 5885b30b63048..080b9df634852 100644 --- a/_data/cv.yml +++ b/_data/cv.yml @@ -1,97 +1,189 @@ -- title: General Information - type: map - contents: - - name: Full Name - value: Albert Einstein - - name: Date of Birth - value: 14th March 1879 - - name: Languages - value: English, German - -- title: Education - type: time_table - contents: - - title: PhD - institution: University of Zurich, Zurich, Switzerland - year: 1905 - description: - - Description 1. - - Description 2. - - title: Description 3. - contents: - - Sub-description 1. - - Sub-description 2. - - title: Federal teaching diploma - institution: Eidgenössische Technische Hochschule, Zurich, Switzerland - year: 1900 - description: - - Description 1. - - Description 2. - -- title: Experience - type: time_table - contents: - - title: Professor of Theoretical Physics - institution: Institute for Advanced Study, Princeton University - year: 1933 - 1955 - description: - - Description 1. - - Description 2. - - title: Description 3. - contents: - - Sub-description 1. - - Sub-description 2. - - title: Visiting Professor - institution: California Institute of Technology, Pasadena, California, US - year: 1933 - description: - - Description 1. - - Description 2. - - - title: Director - institution: Kaiser Wilhelm Institute for Physics, Berlin, Germany. - year: 1917-1933 - - - title: Professor of Theoretical Physics - institution: Karl-Ferdinand University, Prague, Czechoslovakia - year: 1911 - 1917 - description: - - - title: Associate Professor of Theoretical Physics - institution: University of Zurich, Zurich, Switzerland - year: 1909 - 1911 - -- title: Open Source Projects - type: time_table - contents: - - title: al-folio - year: 2015-now - description: A beautiful, simple, clean, and responsive Jekyll theme for academics. - -- title: Honors and Awards - type: time_table - contents: - - year: 1921 - items: - - Nobel Prize in Physics - - Matteucci Medal - - year: 2029 - items: - - Max Planck Medal - -- title: Academic Interests - type: nested_list - contents: - - title: Topic 1. - items: - - Description 1. - - Description 2. - - title: Topic 2. - items: - - Description 1. - - Description 2. - -- title: Other Interests - type: list - contents: - - Hobbies: Hobby 1, Hobby 2, etc. +cv: + name: Albert Einstein + label: Scientist + email: einstein@example.com + location: Princeton, NJ + image: "" + summary: A German-born theoretical physicist, widely ranked among the greatest and most influential scientists of all time + + social_networks: + - network: X + username: AlbertEinstein + - network: GitHub + username: example + - network: LinkedIn + username: example + + address: + street: 2712 Broadway St + city: San Francisco + region: California + postalCode: CA 94115 + countryCode: US + + sections: + Education: + - institution: University of Zurich + location: Zurich, Switzerland + url: https://www.uzh.ch/ + area: Physics + studyType: PhD + start_date: 1900 + end_date: 1905 + score: "" + courses: "Theory of Relativity" + highlights: + - Description 1. + - Description 2. + + - institution: Eidgenössische Technische Hochschule + location: Zurich, Switzerland + area: Physics + studyType: Federal teaching diploma + start_date: 1896 + end_date: 1900 + highlights: + - Description 1. + - Description 2. + + Experience: + - company: Institute for Advanced Study, Princeton University + position: Professor of Theoretical Physics + location: Princeton University, NJ + start_date: 1933 + end_date: 1955 + summary: Teaching at Palmer Physical Laboratory (now 302 Frist Campus Center). While not a professor at Princeton, I associated with the physics professors and continued to give lectures on campus. + highlights: + - Relativity + - Description 2. + + - company: California Institute of Technology + position: Visiting Professor + location: Pasadena, California, US + start_date: 1933 + end_date: 1933 + highlights: + - Description 1. + - Description 2. + + - company: Kaiser Wilhelm Institute for Physics + position: Director + location: Berlin, Germany + start_date: 1917 + end_date: 1933 + + - company: Karl-Ferdinand University + position: Professor of Theoretical Physics + location: Prague, Czechoslovakia + start_date: 1911 + end_date: 1917 + + - company: University of Zurich + position: Associate Professor of Theoretical Physics + location: Zurich, Switzerland + start_date: 1909 + end_date: 1911 + + Volunteer: + - company: People's Climate March + position: Lead Organizer + location: Zurich, Switzerland + start_date: 2014-04-01 + end_date: 2015-07-01 + summary: Lead organizer for the New York City branch of the People's Climate March, the largest climate march in history. + highlights: + - "Awarded 'Climate Hero' award by Greenpeace for my efforts organizing the march." + - "Men of the year 2014 by Time magazine" + + Awards: + - title: Nobel Prize in Physics + authors: + - "Royal Swedish Academy of Sciences" + date: 1921-11-01 + awarder: Royal Swedish Academy of Sciences + url: https://www.nobelprize.org/prizes/physics/1921/einstein/biographical/ + summary: The Nobel Prizes are five separate prizes that, according to Alfred Nobel's will of 1895, are awarded to 'those who, during the preceding year, have conferred the greatest benefit to humankind.' + + - title: Max Planck Medal + authors: + - "German Physical Society" + date: 2029 + awarder: German Physical Society + summary: Awarded for outstanding scientific achievement + + Publications: + - title: Zur Elektrodynamik bewegter Körper + authors: + - Albert Einstein + publisher: Annalen der Physik + releaseDate: 1905-06-30 + url: https://en.wikisource.org/wiki/Translation:On_the_Electrodynamics_of_Moving_Bodies + summary: It concerned an interpretation of the Michelson–Morley experiment and the properties of light and time. Special relativity incorporates the principle that the speed of light is the same for all inertial observers regardless of the state of motion of the source. + + - title: Über einen die Erzeugung und Verwandlung des Lichtes betreffenden heuristischen Gesichtspunkt + authors: + - Albert Einstein + publisher: Annalen der Physik + releaseDate: 1905-03-18 + url: https://de.wikisource.org/wiki/Über_einen_die_Erzeugung_und_Verwandlung_des_Lichtes_betreffenden_heuristischen_Gesichtspunkt + summary: In the second paper, he applied the quantum theory to light to explain the photoelectric effect. In particular, he used the idea of light quanta (photons) to explain experimental results, but stressed the importance of the experimental results. The importance of his work on the photoelectric effect earned him the Nobel Prize in Physics in 1921. + + - title: Die Grundlage der allgemeinen Relativitätstheorie + authors: + - Albert Einstein + publisher: Annalen der Physik + releaseDate: 1916-03-20 + url: https://de.wikisource.org/wiki/Die_Grundlage_der_allgemeinen_Relativitätstheorie + summary: The publication of the theory of general relativity made him internationally famous. He was professor of physics at the universities of Zurich (1909–1911) and Prague (1911–1912), before he returned to ETH Zurich (1912–1914). + + Skills: + - name: Physics + level: Master + icon: fa-solid fa-hashtag + keywords: "Quantum Mechanics, Quantum Computing, Quantum Information, Quantum Cryptography, Quantum Communication, Quantum Teleportation" + + Languages: + - name: German + summary: "Native speaker" + + - name: English + summary: "Fluent" + + Interests: + - name: Physics + icon: fa-solid fa-tag + keywords: "Quantum Mechanics, Quantum Computing, Quantum Information, Quantum Cryptography, Quantum Communication, Quantum Teleportation" + + Certificates: + - name: Machine Learning + date: 2018-01-01 + issuer: Stanford University + icon: fa-solid fa-location-dot + + - name: Quantum Computing + date: 2018-01-01 + issuer: Stanford University + icon: fa-solid fa-tag + + - name: Quantum Information + date: 2018-01-01 + issuer: Stanford University + icon: fa-solid fa-envelope + + Projects: + - name: Quantum Computing + summary: Quantum computing is the use of quantum-mechanical phenomena such as superposition and entanglement to perform computation. Computers that perform quantum computations are known as quantum computers. + highlights: + - Quantum Teleportation + - Quantum Cryptography + start_date: 2018-01-01 + end_date: 2018-01-01 + + References: + - name: Professor John Doe + icon: fa-solid fa-laptop + reference: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit. + + - name: Professor Jane Smith + icon: fa-solid fa-thumbtack + reference: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit. diff --git a/_data/featured_plugins.yml b/_data/featured_plugins.yml new file mode 100644 index 0000000000000..3f745183f8f7d --- /dev/null +++ b/_data/featured_plugins.yml @@ -0,0 +1,223 @@ +- name: al_folio_core + repo_url: https://github.com/al-org-dev/al-folio-core + gem_name: al_folio_core + jekyll_plugin_id: al_folio_core + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /about/ + maintainer_contact: https://github.com/al-org-dev + notes: Core runtime primitives and starter contracts. + +- name: al_folio_distill + repo_url: https://github.com/al-org-dev/al-folio-distill + gem_name: al_folio_distill + jekyll_plugin_id: al_folio_distill + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /blog/2018/distill/ + maintainer_contact: https://github.com/al-org-dev + notes: Distill layout/runtime ownership. + +- name: al_folio_cv + repo_url: https://github.com/al-org-dev/al-folio-cv + gem_name: al_folio_cv + jekyll_plugin_id: al_folio_cv + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /cv/ + maintainer_contact: https://github.com/al-org-dev + notes: CV layouts, includes, and rendering behavior. + +- name: al_folio_upgrade + repo_url: https://github.com/al-org-dev/al-folio-upgrade + gem_name: al_folio_upgrade + jekyll_plugin_id: al_folio_upgrade + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: / + maintainer_contact: https://github.com/al-org-dev + notes: Upgrade audit/codemod/report CLI. + +- name: al_folio_bootstrap_compat + repo_url: https://github.com/al-org-dev/al-folio-bootstrap-compat + gem_name: al_folio_bootstrap_compat + jekyll_plugin_id: al_folio_bootstrap_compat + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.2.x" + status: bundled + demo_path: /blog/2023/tables/ + maintainer_contact: https://github.com/al-org-dev + notes: Transitional compatibility for legacy Bootstrap-marked content. + +- name: al_icons + repo_url: https://github.com/al-org-dev/al-icons + gem_name: al_icons + jekyll_plugin_id: al_icons + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /about/ + maintainer_contact: https://github.com/al-org-dev + notes: Icon runtime loading (Font Awesome, Academicons, Scholar Icons). + +- name: al_cookie + repo_url: https://github.com/al-org-dev/al-cookie + gem_name: al_cookie + jekyll_plugin_id: al_cookie + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: / + maintainer_contact: https://github.com/al-org-dev + notes: Cookie consent runtime and consent-aware analytics gating. + +- name: al_search + repo_url: https://github.com/al-org-dev/al-search + gem_name: al_search + jekyll_plugin_id: al_search + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: / + maintainer_contact: https://github.com/al-org-dev + notes: Search runtime payload and keyboard/modal setup. + +- name: al_img_tools + repo_url: https://github.com/al-org-dev/al-img-tools + gem_name: al_img_tools + jekyll_plugin_id: al_img_tools + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /blog/2024/photo-gallery/ + maintainer_contact: https://github.com/al-org-dev + notes: Image tooling, gallery, and lightbox behavior. + +- name: al_math + repo_url: https://github.com/al-org-dev/al-math + gem_name: al_math + jekyll_plugin_id: al_math + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /blog/2023/tikzjax/ + maintainer_contact: https://github.com/al-org-dev + notes: Math and TikZ runtime integration. + +- name: al_analytics + repo_url: https://github.com/al-org-dev/al-analytics + gem_name: al_analytics + jekyll_plugin_id: al_analytics + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: / + maintainer_contact: https://github.com/al-org-dev + notes: Analytics provider runtime integration. + +- name: al_citations + repo_url: https://github.com/al-org-dev/al-citations + gem_name: al_citations + jekyll_plugin_id: al_citations + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /publications/ + maintainer_contact: https://github.com/al-org-dev + notes: Bibliography rendering and publication runtime behavior. + +- name: al_ext_posts + repo_url: https://github.com/al-org-dev/al-ext-posts + gem_name: al_ext_posts + jekyll_plugin_id: al_ext_posts + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /blog/ + maintainer_contact: https://github.com/al-org-dev + notes: External posts ingestion helpers. + +- name: al_charts + repo_url: https://github.com/al-org-dev/al-charts + gem_name: al_charts + jekyll_plugin_id: al_charts + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /blog/2023/charts/ + maintainer_contact: https://github.com/al-org-dev + notes: Chart runtime integrations. + +- name: al_comments + repo_url: https://github.com/al-org-dev/al-comments + gem_name: al_comments + jekyll_plugin_id: al_comments + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: /blog/ + maintainer_contact: https://github.com/al-org-dev + notes: Comments providers and comment runtime glue. + +- name: al_newsletter + repo_url: https://github.com/al-org-dev/al-newsletter + gem_name: al_newsletter + jekyll_plugin_id: al_newsletter + owner: al-org-dev + license: See plugin repo LICENSE + compat: + al_folio_min: "1.0.0" + al_folio_max: "1.x" + status: bundled + demo_path: / + maintainer_contact: https://github.com/al-org-dev + notes: Newsletter runtime integration. diff --git a/_data/socials.yml b/_data/socials.yml index 156b88ac4283f..e9c38b476be49 100644 --- a/_data/socials.yml +++ b/_data/socials.yml @@ -26,7 +26,15 @@ # lastfm_id: # your lastfm id # lattes_id: # your ID on Lattes (Brazilian Lattes CV) # leetcode_id: # your LeetCode id -linkedin_username: sustainable-urban-systems-lab # your LinkedIn user name +# NOTE: `linkedin_username` is deliberately unset. jekyll-socials hard-codes it to +# linkedin.com/in/ (a personal profile), but the lab's presence is a company +# page. jekyll-socials renders unknown keys from url/title/logo, so the company link +# is declared as a custom entry below. This replaces the old `_includes/social.liquid` +# override, which existed only to change this one URL. +linkedin_company: + url: https://www.linkedin.com/company/sustainable-urban-systems-lab + title: LinkedIn + logo: fa-brands fa-linkedin-in # mastodon_username: # your mastodon instance+username in the format instance.tld/@username # medium_username: # your Medium username orcid_id: 0000-0003-4940-341X # your ORCID ID @@ -34,7 +42,7 @@ orcid_id: 0000-0003-4940-341X # your ORCID ID # pinterest_id: # your pinterest id # publons_id: # your ID on Publons # quora_username: # your Quora username -# research_gate_profile: # your profile on ResearchGate +research_gate_profile: Patrick-Kastner # your profile on ResearchGate rss_icon: true # comment this line to hide the RSS icon scholar_userid: XNaNgkwAAAAJ # your Google Scholar ID # scopus_id: # your profile on Scopus @@ -49,8 +57,8 @@ scholar_userid: XNaNgkwAAAAJ # your Google Scholar ID # wikidata_id: # your wikidata id # wikipedia_id: # your wikipedia id (Case sensitive) # work_url: # work page URL -# x_username: # your X handle -# youtube_id: # your youtube channel id (youtube.com/@) +x_username: sustain_lab # your X handle +youtube_id: SustainableUrbanSystemsLab # your youtube channel id (youtube.com/@) # zotero_username: # your zotero username # custom_social: # can be any name here other than the ones already defined above # logo: https://www.alberteinstein.com/wp-content/uploads/2024/03/cropped-favicon-192x192.png # can be png, svg, jpg diff --git a/_includes/audio.liquid b/_includes/audio.liquid deleted file mode 100644 index 338e2124985dc..0000000000000 --- a/_includes/audio.liquid +++ /dev/null @@ -1,30 +0,0 @@ -
-
diff --git a/_includes/bib_search.liquid b/_includes/bib_search.liquid deleted file mode 100644 index c0ab526c652b8..0000000000000 --- a/_includes/bib_search.liquid +++ /dev/null @@ -1,4 +0,0 @@ -{% if site.bib_search %} - - -{% endif %} diff --git a/_includes/citation.liquid b/_includes/citation.liquid deleted file mode 100644 index 35bd9e378d521..0000000000000 --- a/_includes/citation.liquid +++ /dev/null @@ -1,26 +0,0 @@ -
-
-
- -If you found this useful, please cite this as: - -{% capture citation_quote -%} -> {{ site.last_name }}, {{ site.first_name }}{% if site.middle_name %} {{ site.middle_name }}{% endif %} ({{ page.date | date: "%b %Y" }}). {{ page.title }}. {% if site.title != 'blank' %}{{ site.title }}. {% endif %}{{ site.url }}. -{%- endcapture %} -{{ citation_quote | markdownify }} - -

or as a BibTeX entry:

- -{% capture citation_code -%} -```bibtex -@article{ {{- site.last_name | downcase }}{{ page.date | date: "%Y" }}{{ page.title | slugify }}, - title = { {{- page.title -}} }, - author = { {{- site.last_name }}, {{ site.first_name }}{% if site.middle_name %} {{ site.middle_name }}{% endif -%}}, - {%- if site.title != 'blank' %}journal = { {{- site.title -}} },{% endif %} - year = { {{- page.date | date: "%Y" -}} }, - month = { {{- page.date | date: "%b" -}} }, - url = { {{- site.url }}{{ page.url -}} } -} -``` -{%- endcapture %} -{{ citation_code | markdownify }} diff --git a/_includes/cv/list.liquid b/_includes/cv/list.liquid deleted file mode 100644 index 1cc2598eff775..0000000000000 --- a/_includes/cv/list.liquid +++ /dev/null @@ -1,5 +0,0 @@ -
    - {% for content in entry.contents %} -
  • {{ content }}
  • - {% endfor %} -
diff --git a/_includes/cv/list_groups.liquid b/_includes/cv/list_groups.liquid deleted file mode 100644 index 1ca90e4b23768..0000000000000 --- a/_includes/cv/list_groups.liquid +++ /dev/null @@ -1,51 +0,0 @@ -
- {% for content in entry.contents %} -
- - - - {% if content.icon %} - - {% else %} - - {% endif %} - - {% assign i = 1 %} - {% for item in content.items %} - {% assign i = i | plus: 1 %} - {% endfor %} - - - {% for item in content.items %} - - - - {% if item.level %} - - {% endif %} - {% if item.school %} - - {% else %} - - {% endif %} - {% if item.link %} - - {% endif %} - - {% endfor %} - -
{{ content.category }}
- {{ item.name }} - {{ item.level }}{{ item.school }} - {% endif %} - {% if item.time %} -
- {{ item.time }} -
-
- {% endfor %} -
diff --git a/_includes/cv/map.liquid b/_includes/cv/map.liquid deleted file mode 100644 index aee3419fab619..0000000000000 --- a/_includes/cv/map.liquid +++ /dev/null @@ -1,29 +0,0 @@ - - {% for content in entry.contents %} - - - {% if content.value %} - - {% endif %} - {% if content.links %} - - {% endif %} - - {% endfor %} -
- {{ content.name }} - {{ content.value }} -
- {% for item in content.links %} - {% if item.link %} - - {% endif %} - {% endfor %} -
-
diff --git a/_includes/cv/nested_list.liquid b/_includes/cv/nested_list.liquid deleted file mode 100644 index 72200dec57b68..0000000000000 --- a/_includes/cv/nested_list.liquid +++ /dev/null @@ -1,16 +0,0 @@ -
    - {% for content in entry.contents %} -
  • -
    {{ content.title }}
    - {% if content.items %} -
      - {% for subitem in content.items %} -
    • - {{ subitem }} -
    • - {% endfor %} -
    - {% endif %} -
  • - {% endfor %} -
diff --git a/_includes/cv/time_table.liquid b/_includes/cv/time_table.liquid deleted file mode 100644 index beb1c52e00147..0000000000000 --- a/_includes/cv/time_table.liquid +++ /dev/null @@ -1,118 +0,0 @@ -
    - {% for content in entry.contents %} -
  • -
    - {% if content.year %} -
    - - - - - - {% if content.location %} - - - - {% endif %} - -
    - - {{- content.year -}} - -
    -

    - - {{ content.location }} -

    -
    -
    - {% endif %} -
    - {% if content.title %} -
    {{ content.title }}
    - {% endif %} - {% if content.department or content.institution %} - - - {% if content.institution %} - - - - - {% endif %} - {% if content.department %} - - - - - {% endif %} - -
    - - {{ content.institution }}
    - - {{ content.department }}
    - {% endif %} - {% if content.maindescription %} -
    {{ content.maindescription }}
    - {% endif %} - {% if content.description %} -
      - {% for item in content.description %} -
    • - {% if item.contents %} - {{ item.title }} -
        - {% for subitem in item.contents %} -
      • - {{ subitem }} -
      • - {% endfor %} -
      - {% else %} - {{ item }} - {% endif %} -
    • - {% endfor %} -
    - {% endif %} - {% if content.items %} -
      - {% for item in content.items %} -
    • - {% if item.contents %} - {{ item.title }} -
        - {% for subitem in item.contents %} -
      • - {{ subitem }} -
      • - {% endfor %} -
      - {% else %} - {{ item }} - {% endif %} -
    • - {% endfor %} -
    - {% endif %} - {% if content.linkitems %} - - {% endif %} -
    -
    -
  • - {% endfor %} -
diff --git a/_includes/disqus.liquid b/_includes/disqus.liquid deleted file mode 100644 index 6979a4eced2df..0000000000000 --- a/_includes/disqus.liquid +++ /dev/null @@ -1,13 +0,0 @@ -
- - -
diff --git a/_includes/distill_scripts.liquid b/_includes/distill_scripts.liquid deleted file mode 100644 index 8a8aa1f329486..0000000000000 --- a/_includes/distill_scripts.liquid +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - - - - - -{% if page.mermaid and page.mermaid.enabled %} - - - {% if page.mermaid.zoomable %} - - {% endif %} - -{% endif %} - -{% if page.code_diff %} - - - - -{% endif %} - -{% if page.map %} - - - -{% endif %} - -{% if page.chart and page.chart.chartjs %} - - - -{% endif %} - -{% if page.chart and page.chart.echarts %} - - - {% if site.enable_darkmode %} - - {% endif %} - -{% endif %} - -{% if page.chart and page.chart.plotly %} - - - -{% endif %} - -{% if page.chart and page.chart.vega_lite %} - - - - - -{% endif %} - -{% if page.tikzjax %} - - -{% endif %} - -{% if page.typograms %} - - -{% endif %} - -{% if site.enable_tooltips %} - - -{% endif %} - -{% if site.enable_medium_zoom %} - - - -{% endif %} - -{% if page.toc and page.toc.sidebar %} - - -{% endif %} - -{% if page.pretty_table %} - - - -{% endif %} - - - - - - - - - - - -{% if site.enable_math %} - - - - - -{% endif %} - -{% if site.enable_google_analytics %} - - - - -{% endif %} - -{% if site.enable_cronitor_analytics %} - - - -{% endif %} -{% if site.enable_pirsch_analytics %} - -{% endif %} -{% if site.enable_openpanel_analytics %} - - -{% endif %} - -{% if site.enable_progressbar %} - - -{% endif %} - -{% if page.images %} - - {% if page.images.compare %} - - {% endif %} - {% if page.images.lightbox2 %} - - {% endif %} - {% if page.images.photoswipe %} - - {% endif %} - {% if page.images.slider %} - - {% endif %} - {% if page.images.spotlight %} - - {% endif %} - {% if page.images.venobox %} - - - {% endif %} -{% endif %} - -{% if page.tabs %} - - -{% endif %} - -{% if site.back_to_top %} - - - -{% endif %} - -{% if site.search_enabled %} - - - - - - -{% endif %} diff --git a/_includes/figure.liquid b/_includes/figure.liquid index c146aa16bf22d..dcaa870dd1c68 100644 --- a/_includes/figure.liquid +++ b/_includes/figure.liquid @@ -79,7 +79,7 @@ {% elsif site.lazy_loading_images %} loading="lazy" {% endif %} - onerror="this.onerror=null; $('.responsive-img-srcset').remove();" + onerror="this.onerror=null; document.querySelectorAll('.responsive-img-srcset').forEach(function (n) { n.remove(); });" > diff --git a/_includes/footer.liquid b/_includes/footer.liquid index 3a42dc0fec351..b51eacabbbaaf 100644 --- a/_includes/footer.liquid +++ b/_includes/footer.liquid @@ -20,7 +20,11 @@ {% else %}