diff --git a/.claude/skills b/.claude/skills new file mode 100644 index 0000000..2b7a412 --- /dev/null +++ b/.claude/skills @@ -0,0 +1 @@ +../.agents/skills \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..7e82674 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +_site/ +.git/ +assets/ diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000..691dff4 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,24 @@ +# Template taken from https://github.com/v8/v8/blob/master/.git-blame-ignore-revs. +# +# This file contains a list of git hashes of revisions to be ignored by git blame. These +# revisions are considered "unimportant" in that they are unlikely to be what you are +# interested in when blaming. Most of these will probably be commits related to linting +# and code formatting. +# +# Instructions: +# - Only large (generally automated) reformatting or renaming CLs should be +# added to this list. Do not put things here just because you feel they are +# trivial or unimportant. If in doubt, do not put it on this list. +# - Precede each revision with a comment containing the PR title and number. +# For bulk work over many commits, place all commits in a block with a single +# comment at the top describing the work done in those commits. +# - Only put full 40-character hashes on this list (not short hashes or any +# other revision reference). +# - Append to the bottom of the file (revisions should be in chronological order +# from oldest to newest). +# - Because you must use a hash, you need to append to this list in a follow-up +# PR to the actual reformatting PR that you are trying to ignore. + +# Format all the code using prettier.io. (#2048, #2062) +beb6f27d596e753014cb9bff1939e5f78d66431c +2d34024961c3a3d27d6fd18ce06a551657983234 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e785898 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Force LF line endings, needed for Docker to work on Windows +*.sh text eol=lf \ No newline at end of file diff --git a/.github/GIT_WORKFLOW.md b/.github/GIT_WORKFLOW.md new file mode 100644 index 0000000..771a71c --- /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 new file mode 100644 index 0000000..318d1ad --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1_bug_report.yml @@ -0,0 +1,102 @@ +name: πŸ› Report a bug +description: Any errors. +labels: ["needs triage", "bug"] +body: + - type: markdown + attributes: + 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/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). + + - type: checkboxes + id: requirements + attributes: + label: Have you checked that your issue isn't already filed? + description: > + Please check if somebody else has already filed the same issue. + If you find a similar issue, please add a πŸ‘ reaction or comment on the original post. + options: + - label: I read through [FAQ](https://github.com/alshedivat/al-folio/blob/main/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 + + - type: input + attributes: + label: Bug description + description: A description of the πŸ› bug. + placeholder: A clear and concise description of what the bug is. + validations: + required: true + + - type: textarea + attributes: + label: How to reproduce the bug + description: Provide steps to reproduce the πŸ› bug. + placeholder: | + Include steps to reproduce, the expected behaviour, and the actual behaviour. + + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: true + + - type: textarea + attributes: + label: Error messages and logs + description: > + Provide any error messages and/or logs + placeholder: "Copy the complete error messages and logs" + value: | + ``` + The error message you got, with the full traceback if available. Please paste it between these triple backticks. + ``` + validations: + required: false + + - type: dropdown + id: os + attributes: + label: What operating system are you using? + description: select all OSs where you have experienced this issue + multiple: true + options: + - Linux + - Mac + - Windows + - Not applicable (e.g. you're using GitHub Pages or other hosting) + validations: + required: true + + - type: dropdown + id: environment + attributes: + label: Where are you seeing the problem on? + description: select all environments where you have experienced this issue + multiple: true + options: + - "Running locally with Docker (docker compose)" + - "Running locally with Docker (devcontainer)" + - "Running locally without Docker" + - "Deployed site" + validations: + required: true + + - type: textarea + attributes: + label: More info + description: Add any other info about the issue here. + placeholder: | + Add any other context about the problem here, such as versions of the libraries if running without docker, screenshots, links to the deployed site, etc. + validations: + required: false + + - type: markdown + attributes: + value: "**Happy coding!**" diff --git a/.github/ISSUE_TEMPLATE/2_feature_request.yml b/.github/ISSUE_TEMPLATE/2_feature_request.yml new file mode 100644 index 0000000..6b97b1b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2_feature_request.yml @@ -0,0 +1,56 @@ +name: πŸš€ Feature request +description: Propose a feature for this project +labels: ["needs triage", "enhancement"] +body: + - type: markdown + attributes: + 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/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). + + - type: checkboxes + id: requirements + attributes: + label: Have you checked that your feature request isn't already filed? + description: > + Please check if somebody else has already filed the same πŸš€ feature request. + If you find a similar feature request, please add a πŸ‘ reaction or comment on the original post. + options: + - label: I read through [FAQ](https://github.com/alshedivat/al-folio/blob/main/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 + + - type: textarea + attributes: + label: Description & Motivation + description: A clear and concise description of the πŸš€ feature proposal + placeholder: | + Please outline the motivation for the proposal. + Is your feature request related to a problem? e.g., I'm always frustrated when [...]. + If this is related to another GitHub issue, please link it here + + - type: textarea + attributes: + label: Pitch + description: A clear and concise description of what you want to happen. + validations: + required: false + + - type: textarea + attributes: + label: Alternatives + description: A clear and concise description of any alternative solutions or features you've considered, if any. + validations: + required: false + + - type: textarea + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + validations: + required: false 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 0000000..986c0c0 --- /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 new file mode 100644 index 0000000..0195fca --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: ❓ Ask a Question + 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/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 0000000..b97b2b9 --- /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 0000000..6ea1231 --- /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 0000000..9582579 --- /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 0000000..2ade7ef --- /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 0000000..32fa3a5 --- /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 0000000..a990ea0 --- /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 0000000..32379fb --- /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 0000000..fb75385 --- /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 0000000..57b679a --- /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/release.yml b/.github/release.yml new file mode 100644 index 0000000..4fdc27e --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,14 @@ +changelog: + exclude: + labels: + - ignore-for-release + categories: + - title: new features πŸš€ + labels: + - enhancement + - title: bug fixes and improvements ✨ + labels: + - bug-fix + - title: other changes πŸ› οΈ + labels: + - "*" diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..8ec2004 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,18 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security + - enhancement +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..fed1e36 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,92 @@ +name: Deploy site + +# Builds the al-folio site and publishes it via the GitHub Pages artifact API. +# +# This deliberately does NOT use al-folio's stock JamesIves/github-pages-deploy-action, +# which commits the built _site to a gh-pages branch. interactive-visualization/ holds +# ~218 MB of .glb models, so a branch-based deploy would write a quarter-gigabyte of +# binaries into git history on every single build. The artifact API keeps the build +# output out of the repo entirely. +# +# Requires Settings -> Pages -> Build and deployment -> Source = "GitHub Actions". + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +# Let a running deployment finish rather than cancelling it mid-publish. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout πŸ›ŽοΈ + uses: actions/checkout@v4 + + - name: Configure Pages + uses: actions/configure-pages@v5 + + - 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 🧰 + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + + - name: Install JS deps πŸ“¦ + run: npm ci + + - name: Install and Build πŸ”§ + run: | + sudo apt-get update && sudo apt-get install -y imagemagick + pip3 install --upgrade nbconvert + export JEKYLL_ENV=production + bundle exec jekyll build + + - name: Purge unused CSS 🧹 + run: | + npm install -g purgecss + purgecss -c purgecss.config.js + + # Must run AFTER purgecss: the visualizations ship their own CSS, which + # purgecss would strip if it were present in _site during the purge. + - name: Copy interactive visualizations πŸ›©οΈ + run: ./bin/copy-viz.sh _site + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + + deploy: + # Pull requests build only β€” they must not publish over the live site. + if: github.event_name != 'pull_request' + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..865c7fc --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +_site +.bundle +.DS_store +.idea +.jekyll-cache +.jekyll-metadata +.ruby-version +.sass-cache +.tweet-cache +.venv +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 new file mode 100644 index 0000000..9a9837b --- /dev/null +++ b/.lycheeignore @@ -0,0 +1,16 @@ +.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 new file mode 100644 index 0000000..fd7a420 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +**/*.map +**/*.min.css +**/*.min.js +assets/plotly/demo.html +lighthouse_results/** +_posts/2015-10-20-math.md +# Ignore citation YAML file generated by script +_data/citations.yml diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..0163f19 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +plugins: ["@shopify/prettier-plugin-liquid"] +printWidth: 150 +trailingComma: "es5" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..99109cd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,76 @@ +FROM ruby:slim + +# uncomment these if you are having this issue with the build: +# /usr/local/bundle/gems/jekyll-4.3.4/lib/jekyll/site.rb:509:in `initialize': Permission denied @ rb_sysopen - /srv/jekyll/.jekyll-cache/.gitignore (Errno::EACCES) +# ARG GROUPID=901 +# ARG GROUPNAME=ruby +# ARG USERID=901 +# ARG USERNAME=jekyll + +ENV DEBIAN_FRONTEND noninteractive + +LABEL authors="Amir Pourmand,George AraΓΊjo" \ + description="Docker image for al-folio academic template" \ + maintainer="Amir Pourmand" + +# uncomment these if you are having this issue with the build: +# /usr/local/bundle/gems/jekyll-4.3.4/lib/jekyll/site.rb:509:in `initialize': Permission denied @ rb_sysopen - /srv/jekyll/.jekyll-cache/.gitignore (Errno::EACCES) +# add a non-root user to the image with a specific group and user id to avoid permission issues +# RUN groupadd -r $GROUPNAME -g $GROUPID && \ +# useradd -u $USERID -m -g $GROUPNAME $USERNAME + +# install system dependencies +RUN apt-get update -y && \ + apt-get install -y --no-install-recommends \ + build-essential \ + curl \ + git \ + imagemagick \ + inotify-tools \ + locales \ + nodejs \ + procps \ + python3-pip \ + zlib1g-dev && \ + pip --no-cache-dir install --upgrade --break-system-packages nbconvert + +# clean up +RUN apt-get clean && \ + apt-get autoremove && \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* /tmp/* + +# set the locale +RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \ + locale-gen + +# set environment variables +ENV EXECJS_RUNTIME=Node \ + JEKYLL_ENV=production \ + LANG=en_US.UTF-8 \ + LANGUAGE=en_US:en \ + LC_ALL=en_US.UTF-8 + +# create a directory for the jekyll site +RUN mkdir /srv/jekyll + +# copy the Gemfile and Gemfile.lock to the image +ADD Gemfile.lock /srv/jekyll +ADD Gemfile /srv/jekyll + +# set the working directory +WORKDIR /srv/jekyll + +# install jekyll and dependencies +RUN gem install --no-document jekyll bundler +RUN bundle install --no-cache + +EXPOSE 8080 + +COPY bin/entry_point.sh /tmp/entry_point.sh + +# uncomment this if you are having this issue with the build: +# /usr/local/bundle/gems/jekyll-4.3.4/lib/jekyll/site.rb:509:in `initialize': Permission denied @ rb_sysopen - /srv/jekyll/.jekyll-cache/.gitignore (Errno::EACCES) +# set the ownership of the jekyll site directory to the non-root user +# USER $USERNAME + +CMD ["/tmp/entry_point.sh"] diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..e7f6c5c --- /dev/null +++ b/Gemfile @@ -0,0 +1,64 @@ +source 'https://rubygems.org' + +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' + gem 'jekyll-imagemagick' + gem 'jekyll-jupyter-notebook' + gem 'jekyll-link-attributes' + gem 'jekyll-minifier' + gem 'jekyll-paginate-v2' + 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' + gem 'jekyll-twitter-plugin' + gem 'jemoji' + + gem 'classifier-reborn' # used for content categorization during the build +end + +# Gems for development or external data fetching (outside :jekyll_plugins) +group :other_plugins do + gem 'css_parser' + 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.15' + 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.1' + + 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' + + gem 'al_email_protect', '= 1.0.1' + gem 'al_marimo', '= 1.0.0' + gem 'al_rtl', '= 1.0.0' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..75716f7 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,564 @@ +GIT + remote: https://github.com/RobertoJBeltran/jekyll-terser.git + revision: 1085bf66d692799af09fe39f8162a1e6e42a3cc4 + specs: + jekyll-terser (0.2.3) + jekyll (>= 0.10.0) + terser (>= 1.0.0) + +GEM + remote: https://rubygems.org/ + specs: + 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) + logger (>= 1.4.2) + minitest (>= 5.1, < 6) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + 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.1) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_email_protect (1.0.1) + 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.15) + 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_marimo (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + 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_rtl (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 (4.1.2) + citeproc (1.1.0) + date + forwardable + json + namae (~> 1.0) + observer (< 1.0) + open-uri (< 1.0) + citeproc-ruby (2.1.8) + citeproc (~> 1.0, >= 1.0.9) + csl (~> 2.0) + observer (< 1.0) + classifier-reborn (2.3.0) + fast-stemmer (~> 1.0) + matrix (~> 0.4) + colorator (1.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) + rexml (~> 3.0) + set (~> 1.1) + singleton (< 1.0) + time (< 1.0) + csl-styles (2.0.2) + csl (~> 2.0) + css_parser (1.22.0) + addressable + cssminify2 (2.1.0) + csv (3.3.5) + date (3.5.1) + deep_merge (1.2.2) + drb (2.2.3) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + eventmachine (1.2.7) + execjs (2.10.1) + fast-stemmer (1.0.2) + feedjira (4.0.2) + logger (>= 1.0, < 2) + loofah (>= 2.3.1, < 3) + sax-machine (>= 1.0, < 2) + 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-x64-mingw-ucrt) + 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.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-x64-mingw-ucrt) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-x86_64-darwin) + bigdecimal + 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.1) + httparty (0.24.2) + csv + mini_mime (>= 1.0.0) + multi_xml (>= 0.5.2) + 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) + colorator (~> 1.0) + csv (~> 3.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) + jekyll-watch (~> 2.0) + json (~> 2.6) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.3, >= 0.3.6) + pathutil (~> 0.9) + rouge (>= 3.0, < 5.0) + safe_yaml (~> 1.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + 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) + jekyll-get-json (1.0.0) + deep_merge (~> 1.2) + jekyll (>= 3.0) + jekyll-imagemagick (1.4.0) + jekyll (>= 3.4) + jekyll-jupyter-notebook (0.0.6) + jekyll + jekyll-link-attributes (2.0.1) + jekyll-minifier (0.2.2) + cssminify2 (~> 2.1.0) + htmlcompressor (~> 0.4) + jekyll (~> 4.0) + json-minify (~> 0.0.3) + terser (~> 1.2.3) + jekyll-paginate-v2 (3.0.0) + jekyll (>= 3.0, < 5.0) + jekyll-regex-replace (1.1.0) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) + jekyll-scholar (7.3.0) + bibtex-ruby (~> 6.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) + jekyll (>= 3.9) + nokogiri (~> 1.12) + jekyll-twitter-plugin (2.1.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.13.0) + gemoji (>= 3, < 5) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + json (2.19.9) + json-minify (0.0.3) + json (> 0) + kramdown (2.5.2) + rexml (>= 3.4.4) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + latex-decode (0.4.2) + liquid (4.0.4) + 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.25.2) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + matrix (0.4.3) + mercenary (0.4.0) + mini_mime (1.1.5) + minitest (5.27.0) + multi_xml (0.9.1) + bigdecimal (>= 3.1, < 5) + namae (1.2.0) + racc (~> 1.7) + 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-x64-mingw-ucrt) + 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) + stringio + time + uri + ostruct (0.6.3) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (7.0.5) + racc (1.8.1) + rake (13.4.2) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rexml (3.4.4) + rouge (4.7.0) + safe_yaml (1.0.5) + 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-x64-mingw-ucrt) + 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.3) + singleton (0.3.0) + stringio (3.2.0) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + terser (1.2.7) + execjs (>= 0.3.0, < 3) + time (0.4.2) + date + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (2.6.0) + uri (1.1.1) + webrick (1.9.2) + +PLATFORMS + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-gnueabihf + arm-linux-musl + arm-linux-musleabihf + arm64-darwin + x64-mingw-ucrt + 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.1) + al_email_protect (= 1.0.1) + al_ext_posts (= 1.0.3) + al_folio_bootstrap_compat (= 1.0.0) + al_folio_core (= 1.0.15) + 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_marimo (= 1.0.0) + al_math (= 1.0.2) + al_newsletter (= 1.0.0) + al_rtl (= 1.0.0) + al_search (= 1.0.3) + classifier-reborn + css_parser + jekyll + jekyll-3rd-party-libraries + jekyll-archives-v2 + jekyll-cache-bust + jekyll-email-protect + jekyll-feed + jekyll-get-json + jekyll-imagemagick + jekyll-jupyter-notebook + jekyll-link-attributes + jekyll-minifier + jekyll-paginate-v2 + jekyll-regex-replace + jekyll-scholar + jekyll-sitemap + jekyll-socials + jekyll-tabs + jekyll-terser! + jekyll-toc + jekyll-twitter-plugin + jemoji + 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.1) sha256=2420241497b1fb165311ba1c9e059a9025586925b65dbba429aee225bd91a67f + al_email_protect (1.0.1) sha256=04d1e9b19a47d26e6fa238baba197165653002c788b60525fef093ee1a3989e5 + al_ext_posts (1.0.3) sha256=c4956d36071958d30de14f6c368863d3e4190dfe312dba08ff79aa685292420d + al_folio_bootstrap_compat (1.0.0) sha256=c210ff3087f17344dc864fa9594c737e947b23c6cae9fab3dbd37a87090b98a8 + al_folio_core (1.0.15) sha256=eee5d0afefab5d3e8747b615890d760ed0ab01a1210991118709c4e969ad1326 + 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_marimo (1.0.0) sha256=bbd8ce9650c7e8a3b35cbbde8d98eba983f132647f316b3ba2a9bd8abf502434 + al_math (1.0.2) sha256=c9fa6f3e343c0d35782d77fe386461ceff7d12186d9b51e6c92bb186b3d60781 + al_newsletter (1.0.0) sha256=27c914f5fcd0c7fac51a513ab11de7123f05de7ba834206a68ddf2588ede96d3 + al_rtl (1.0.0) sha256=dffed3cb05acf0e4f96e7ee2d51cb05fc83a428e0d5e4d697c5da4b7c3fe0f0b + 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-x64-mingw-ucrt) sha256=f6ff9618cfccc494138bddade27aa06c74c6c7bc367a1ea1103d80c2fcb9ed35 + 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-x64-mingw-ucrt) sha256=18ad683237ab6261b81ea4bb273f03dc5e46f0b1e4e4be0152302733cee0945a + 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-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-x64-mingw-ucrt) sha256=051da97b8eccfdb5444fed40246a35e10d7298b9efe759b4cd25455ea04c587e + 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-x64-mingw-ucrt) sha256=059875f5d4ac1ed98c54041a49bd883c66344295714ff0b54566c49bb874a4dc + 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 + 4.0.6 diff --git a/_bibliography/papers.bib b/_bibliography/papers.bib new file mode 100644 index 0000000..5086804 --- /dev/null +++ b/_bibliography/papers.bib @@ -0,0 +1,443 @@ +@inproceedings{nguyen2026autonomous, + author = {Nguyen, Khoa D. and Hogge, Dylan and Riris, John and Sarojini, Darshan and Denby, Bradley}, + title = {Autonomous Battery Units as an Enabling Technology for Urban Air Mobility}, + booktitle = {AIAA SCITECH 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-1713} +} + +@inproceedings{sarker2026kernelbased, + author = {Sarker, Amit and Batley, Reza T. and Sarojini, Darshan and Saha, Sourav}, + title = {A Kernel-based Resource-efficient Neural Surrogate for Multi-fidelity Prediction of Aerodynamic Field}, + booktitle = {AIAA SCITECH 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-0043} +} + +@inproceedings{gould2026certificationinformed, + author = {Gould, J. and Shune, Nathan and Sarojini, Darshan}, + title = {Certification-Informed Reliability and Performance Assessment of Electrified Aircraft}, + booktitle = {AIAA SCITECH 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-1788} +} + +@inproceedings{prophet2026programmed, + author = {Prophet, Nicholas R. and Wallace, Vincent and Cartwright, James E. and Kapania, Rakesh and Sarojini, Darshan and Schetz, Joseph and Stern, Adam}, + title = {Programmed Disassembly of Unmanned Aerial Vehicles}, + booktitle = {AIAA AVIATION 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-4381} +} + +@inproceedings{lee2026transportation, + author = {Lee, Grant and Wang, Zhou and Hogge, Dylan and Anwar, Aman and Bhatt, Krish and Sarojini, Darshan and Trani, Antonio}, + title = {A Transportation Model for Door-to-Door Regional Air Mobility Applied to West Virginia}, + booktitle = {AIAA AVIATION 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-4065} +} + +@inproceedings{schie2025largescale, + author = {Schie, Sebastiaan P. van and Ruh, Marius L. and Fletcher, Andrew H. and Warner, M. and Sperry, Mark and Scotzniovsky, Luca and Orndorff, Nicholas C. and Xiang, Ru and Yan, Jiayao and Zhao, Han and Krokowski, Joshua and Chen, Jiun‐Shyan and Sarojini, Darshan and Gill, Hyunjune and Lee, Seongkyu and Tagg, Andrew and Anderson, Ryan and Green, Eric and Joseph, Cibin and Ning, Andrew and Cheng, Zeyu and Cao, Zhi and MΔ±, Chris and Guibert, Alexandre T. and Cronk, Ashley and Kim, Hyunsun A. and Meng, Ying Shirley and Silva, Christopher J. and Hwang, John T.}, + title = {Large-Scale Distributed Multidisciplinary Design Optimization of the {NASA} Lift-Plus-Cruise Air Taxi Concept}, + booktitle = {AIAA SCITECH 2025 Forum}, + year = {2025}, + doi = {10.2514/6.2025-0362} +} + +@inproceedings{gould2025performance, + author = {Gould, Joseph and Shune, Nathan and Sarmiento, David Solano and Sarojini, Darshan}, + title = {Performance and Regulatory Assessment Trim Formulations for Conceptual Aircraft Design}, + booktitle = {AIAA AVIATION FORUM AND ASCEND 2025}, + year = {2025}, + doi = {10.2514/6.2025-3624} +} + +@inproceedings{ruh2024largescale, + author = {Ruh, Marius L. and Fletcher, Andrew and Sarojini, Darshan and Sperry, Mark and Yan, Jiayao and Scotzniovsky, Luca and Schie, Sebastiaan P. van and Warner, M. and Orndorff, Nicholas C. and Xiang, Ru and Joshy, Anugrah Jo and Zhao, Han and Krokowski, Joshua and Gill, Hyunjune and Lee, Seongkyu and Cheng, Zeyu and Cao, Zhi and MΔ±, Chris and Silva, Christopher J. and Wolfe, Lauren G. and Chen, Jiun‐Shyan and Hwang, John T.}, + title = {Large-scale multidisciplinary design optimization of a {NASA} air taxi concept using a comprehensive physics-based system model}, + booktitle = {AIAA SCITECH 2024 Forum}, + year = {2024}, + doi = {10.2514/6.2024-0771} +} + +@inproceedings{sarojini2024review, + author = {Sarojini, Darshan and Ruh, Marius L. and Yan, Jiayao and Scotzniovsky, Luca and Orndorff, Nicholas C. and Xiang, Ru and Zhao, Han and Krokowski, Joshua and Warner, M. and Schie, Sebastiaan van and Cronk, Ashley and Guibert, Alexandre T. and Chambers, Jeffrey T. and Wolfe, Lauren G. and Doring, Rachel and Despins, Robin and Joseph, Cibin and Anderson, Ryan and Ning, Andrew and Gill, Hyunjune and Lee, Seongkyu and Cheng, Zeyu and Cao, Zhi and MΔ±, Chris and Meng, Ying Shirley and Silva, Christopher J. and Chen, Jiun‐Shyan and Kim, Alicia A. and Hwang, John T.}, + title = {Review of Computational Models for Large-Scale {MDAO} of Urban Air Mobility Concepts}, + booktitle = {AIAA SCITECH 2024 Forum}, + year = {2024}, + doi = {10.2514/6.2024-0377} +} + +@inproceedings{sarojini2023largescale, + author = {Sarojini, Darshan and Ruh, Marius L. and Joshy, Anugrah Jo and Yan, Jiayao and Ivanov, Alexander K. and Scotzniovsky, Luca and Fletcher, Andrew H. and Orndorff, Nicholas C. and Sperry, Mark and Gandarillas, Victor E. and Asher, Issac and Chambers, Jeffrey T. and Gill, Hyunjune and Lee, Seongkyu and Cheng, Zeyu and Rodriguez, Gabriel and Zhao, Shuofeng and MΔ±, Chris and Nascenzi, Thomas and Cuatt, Timothy and Winter, Tyler and Guibert, Alexandre T. and Cronk, Ashley and Kim, Hyunsun A. and Meng, Ying Shirley and Hwang, John T.}, + title = {Large-Scale Multidisciplinary Design Optimization of an eVTOL Aircraft using Comprehensive Analysis}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-0146}, + selected = {true} +} + +@inproceedings{orndorff2023airtaxi, + author = {Orndorff, Nicholas C. and Sarojini, Darshan and Scotzniovsky, Luca and Gill, Hyunjune and Lee, Seongkyu and Cheng, Zeyu and Zhao, Shuofeng and MΔ±, Chris and Hwang, John T.}, + title = {Air-taxi transition trajectory optimization with physics-based models}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-0324} +} + +@article{xie2023certificationconstrained, + author = {Xie, Jiacheng and Cai, Yu and Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Certification-Constrained Vertical Tail Sizing and Power Split Optimization for Distributed Electric Propulsion Aircraft}, + journal = {Journal of Aircraft}, + year = {2023}, + volume = {60}, + number = {4}, + pages = {1272--1289}, + doi = {10.2514/1.c037239} +} + +@inproceedings{swaminathan2023integrating, + author = {Swaminathan, Rajashekar and Sarojini, Darshan and Hwang, John T.}, + title = {Integrating {MBSE} and {MDO} through an Extended Requirements-Functional-Logical-Physical ({RFLP}) Framework}, + booktitle = {AIAA AVIATION 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-3908} +} + +@inproceedings{anderson2023aerostructural, + author = {Anderson, Ryan and Ning, Andrew and Xiang, Ru and Schie, Sebastiaan P. van and Sperry, Mark and Sarojini, Darshan and Kamensky, David and Hwang, John T.}, + title = {Aerostructural Predictions Combining {FEniCS} and a Viscous Vortex Particle Method}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-1193} +} + +@inproceedings{nascenzi2023physicsbased, + author = {Nascenzi, Thomas and Cuatt, Timothy and Winter, Tyler and Ruh, Marius L. and Sarojini, Darshan and Hwang, John T. and Kiani, Sarina}, + title = {Physics-based Surrogate Models for Urban Air Mobility Vehicle Weight Prediction}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-1360} +} + +@inproceedings{sarojini2023towards, + author = {Sarojini, Darshan and Burrows, Cyd and Thomas, Kimberly and Mizumoto, Claire}, + title = {Towards Developing a Guide to Choosing National High-Performance Computing Resources}, + booktitle = {Practice and Experience in Advanced Research Computing}, + year = {2023}, + pages = {382--385}, + doi = {10.1145/3569951.3597549} +} + +@inproceedings{sabeti2023generating, + author = {Sabeti, Shaadi and Nascenzi, Thomas and Cuatt, Timothy and Winter, Tyler and Ruh, Marius L. and Sarojini, Darshan and Hwang, John T.}, + title = {Generating Structural Weight Estimation Equations for a Category of {UAM} Aircraft}, + booktitle = {AIAA AVIATION 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-4280} +} + +@inproceedings{solano2023computationally, + author = {Solano, David and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Computationally Efficient Analysis and Sizing of the {PEGASUS} and Truss-Braced Wing Structures Subjected to Dynamic Loads}, + booktitle = {AIAA AVIATION 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-3943} +} + +@misc{ruh2023largescale, + author = {Ruh, Marius L. and Sarojini, Darshan and Fletcher, Andrew and Asher, Isaac and Hwang, John T.}, + title = {Large-scale multidisciplinary design optimization of the {NASA} lift-plus-cruise concept using a novel aircraft design framework}, + howpublished = {arXiv (Cornell University)}, + year = {2023}, + doi = {10.48550/arxiv.2304.14889} +} + +@inproceedings{huang2023efficient, + author = {Huang, Zeyu and Sarojini, Darshan and Hwang, John T.}, + title = {Efficient Gradient-Based Optimization of Differential-Algebraic Equation Systems}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-0532} +} + +@article{pokhrel2023conceptual, + author = {Pokhrel, Manish and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Conceptual aero-structural design of a fan stage under distorted flow}, + journal = {Proceedings of the Institution of Mechanical Engineers Part G Journal of Aerospace Engineering}, + year = {2023}, + volume = {237}, + number = {11}, + pages = {2545--2560}, + doi = {10.1177/09544100231153910} +} + +@inproceedings{dietz2023scaling, + author = {Dietz, Daniel T. and Sarojini, Darshan and Gharbi, Aroua and Weakley, Le Mai}, + title = {Scaling Up: Growth of the Indy Student Cluster Competition}, + booktitle = {Practice and Experience in Advanced Research Computing}, + year = {2023}, + pages = {359--362}, + doi = {10.1145/3569951.3597591} +} + +@article{perron2022manifold, + author = {Perron, Christian and Sarojini, Darshan and Rajaram, Dushhyanth and Corman, Jason A. and Mavris, Dimitri N.}, + title = {Manifold alignment-based multi-fidelity reduced-order modeling applied to structural analysis}, + journal = {Structural and Multidisciplinary Optimization}, + year = {2022}, + volume = {65}, + number = {8}, + doi = {10.1007/s00158-022-03274-1} +} + +@article{solano2022adjointbased, + author = {Solano, David and Sarojini, Darshan and Rajaram, Dushhyanth and Mavris, Dimitri N.}, + title = {Adjoint-based analysis and optimization of beam-like structures subjected to dynamic loads}, + journal = {Structural and Multidisciplinary Optimization}, + year = {2022}, + volume = {65}, + number = {2}, + doi = {10.1007/s00158-021-03141-5} +} + +@inproceedings{kallou2022application, + author = {Kallou, Evanthia and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Application of Set-Based Design Principles on Multi-Level Aircraft Design Space Exploration}, + booktitle = {AIAA AVIATION 2022 Forum}, + year = {2022}, + doi = {10.2514/6.2022-3848} +} + +@inproceedings{xie2022vertical, + author = {Xie, Jiacheng and Cai, Yu and Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Vertical Tail Sizing and Power Split Optimization for the {PEGASUS} Concept Considering Certification Requirements}, + booktitle = {AIAA AVIATION 2022 Forum}, + year = {2022}, + doi = {10.2514/6.2022-3204} +} + +@inproceedings{sarojini2022structural, + author = {Sarojini, Darshan and Solano, David and Mavris, Dimitri N.}, + title = {Structural Layout Design Space Exploration and Structural Sizing of Aircraft Wingbox}, + booktitle = {AIAA SCITECH 2022 Forum}, + year = {2022}, + doi = {10.2514/6.2022-1026} +} + +@inproceedings{sarojini2022indyscc, + author = {Sarojini, Darshan and Gharbi, Aroua}, + title = {{IndySCC}: A New Student Cluster Competition That Broadens Participation}, + booktitle = {Practice and Experience in Advanced Research Computing}, + year = {2022}, + pages = {1--4}, + doi = {10.1145/3491418.3535153} +} + +@inproceedings{sarojini2022parametric, + author = {Sarojini, Darshan and Solano, David and Corman, Jason A. and Mavris, Dimitri N.}, + title = {Parametric Wingbox Structural Weight Estimation of the {CRM}, {PEGASUS} and Truss-Braced Wing Concepts}, + booktitle = {AIAA AVIATION 2022 Forum}, + year = {2022}, + doi = {10.2514/6.2022-4054} +} + +@article{bendarkar2021offnominal, + author = {Bendarkar, Mayank V. and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Off-Nominal Performance and Reliability of Novel Aircraft Concepts During Early Design}, + journal = {Journal of Aircraft}, + year = {2021}, + volume = {59}, + number = {2}, + pages = {400--414}, + doi = {10.2514/1.c036395} +} + +@article{sarojini2021structural, + author = {Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Structural Analysis and Optimization of Wings Subjected to Dynamic Loads}, + journal = {AIAA Journal}, + year = {2021}, + volume = {60}, + number = {2}, + pages = {1013--1023}, + doi = {10.2514/1.j060931} +} + +@article{xie2021certificationdriven, + author = {Xie, Jiacheng and Sarojini, Darshan and Cai, Yu and Corman, Jason A. and Mavris, Dimitri N.}, + title = {Certification-Driven Platform for Multidisciplinary Design Space Exploration in Airframe Preliminary Design}, + journal = {Journal of Aircraft}, + year = {2021}, + volume = {59}, + number = {2}, + pages = {329--349}, + doi = {10.2514/1.c036328} +} + +@inproceedings{bendarkar2021evaluation, + author = {Bendarkar, Mayank V. and Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Evaluation of Off-Nominal Performance and Reliability of a Distributed Electric Propulsion Aircraft during Early Design}, + booktitle = {AIAA Scitech 2021 Forum}, + year = {2021}, + doi = {10.2514/6.2021-1723} +} + +@inproceedings{sarojini2021dynamic, + author = {Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Dynamic Environment for Loads Prediction and Handling Investigation ({DELPHI})}, + booktitle = {AIAA Scitech 2021 Forum}, + year = {2021}, + doi = {10.2514/6.2021-0326} +} + +@inproceedings{solano2021parametric, + author = {Solano, David and Sarojini, Darshan and Corman, Jason A.}, + title = {Parametric Structural Weight Estimation for the {PEGASUS} Concept Considering Dynamic Aeroelastic Effects}, + booktitle = {AIAA AVIATION 2021 FORUM}, + year = {2021}, + doi = {10.2514/6.2021-3086} +} + +@inproceedings{sarojini2020certificationdriven, + author = {Sarojini, Darshan and Xie, Jiacheng and Cai, Yu and Corman, Jason A. and Mavris, Dimitri N.}, + title = {A Certification-Driven Platform for Multidisciplinary Design Space Exploration in Airframe Early Preliminary Design}, + booktitle = {AIAA AVIATION 2020 FORUM}, + year = {2020}, + doi = {10.2514/6.2020-3157} +} + +@inproceedings{jing2020dynamic, + author = {Jing, Xiao and Berthon, Benjamin and Somers, Luke and Rairigh, Geoffrey and Morgan, James and Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Dynamic Simulation of Vehicle Maneuvers for Loads Analysis}, + booktitle = {AIAA AVIATION 2020 FORUM}, + year = {2020}, + doi = {10.2514/6.2020-2651} +} + +@inproceedings{sarojini2020adjointbased, + author = {Sarojini, Darshan and Rajaram, Dushhyanth and Solano, David and Mavris, Dimitri N.}, + title = {Adjoint-Based Structural Optimization for Beam-Like Structures Subjected to Dynamic Loads}, + booktitle = {AIAA Scitech 2020 Forum}, + year = {2020}, + doi = {10.2514/6.2020-0273} +} + +@inproceedings{solano2020structural, + author = {Solano, David and Sarojini, Darshan and Corman, Jason A. and Mavris, Dimitri N.}, + title = {Structural Sizing of Unconventional Aircraft under Static and Dynamic Aeroelastic Loading}, + booktitle = {AIAA Scitech 2020 Forum}, + year = {2020}, + doi = {10.2514/6.2020-0274} +} + +@inproceedings{pokhrel2020conceptual, + author = {Pokhrel, Manish and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Conceptual Level Optimization of a Fan Stage Under Distortion Considering Aero-structural Constraints}, + booktitle = {AIAA AVIATION 2020 FORUM}, + year = {2020}, + doi = {10.2514/6.2020-3115} +} + +@inproceedings{sarojini2020efficient, + author = {Sarojini, Darshan and Gupta, Mohit and Hodges, Dewey H. and Mavris, Dimitri N.}, + title = {An Efficient Method to Dimensionally Reduce Aperiodic Inhomogeneous 3-D Structures to 1-D Beam-Like Structures}, + booktitle = {AIAA Scitech 2020 Forum}, + year = {2020}, + doi = {10.2514/6.2020-0272} +} + +@article{gupta2019beam, + author = {Gupta, Mohit and Sarojini, Darshan and Shah, Aarohi and Hodges, Dewey H.}, + title = {Beam Theory for Asymptotic Analysis of Aperiodic and Inhomogeneous Structures}, + journal = {AIAA Journal}, + year = {2019}, + volume = {57}, + number = {10}, + pages = {4155--4168}, + doi = {10.2514/1.j057563} +} + +@inproceedings{karagoz2019design, + author = {Karagoz, Esma and Tai, Jimmy C. and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Design Space Reduction using Clustering in Aircraft Engine Design}, + booktitle = {2019 IEEE Aerospace Conference}, + year = {2019}, + pages = {1--8}, + doi = {10.1109/aero.2019.8741654} +} + +@inproceedings{corman2019estimating, + author = {Corman, Jason A. and Sarojini, Darshan and Gharbi, Aroua and Mavris, Dimitri N.}, + title = {Estimating Jig Shape for an Aircraft Wing Determined Through Aerodynamic Shape Optimization with Rigid Body Assumptions}, + booktitle = {AIAA Scitech 2019 Forum}, + year = {2019}, + doi = {10.2514/6.2019-0418} +} + +@inproceedings{sarojini2018framework, + author = {Sarojini, Darshan and Duca, Ruxandra and Solano, David and Chakraborty, Imon and BriceΓ±o, Simon I. and Mavris, Dimitri N.}, + title = {Framework to Assess Effects of Structural Flexibility on Dynamic Loads Developed in Maneuvering Aircraft}, + booktitle = {2018 Aviation Technology, Integration, and Operations Conference}, + year = {2018}, + doi = {10.2514/6.2018-4147} +} + +@inproceedings{gupta2018dimensional, + author = {Gupta, Mohit and Sarojini, Darshan and Shah, Aarohi and Hodges, Dewey H.}, + title = {Dimensional Reduction Technique for Analysis of Aperiodic Inhomogeneous Structures}, + booktitle = {2018 AIAA/ASCE/AHS/ASC Structures, Structural Dynamics, and Materials Conference}, + year = {2018}, + doi = {10.2514/6.2018-0698} +} + +@inproceedings{duca2018effects, + author = {Duca, Ruxandra and Sarojini, Darshan and Bloemer, Sebastian and Chakraborty, Imon and BriceΓ±o, Simon I. and Mavris, Dimitri N.}, + title = {Effects of Epistemic Uncertainty on Empennage Loads During Dynamic Maneuvers}, + booktitle = {2018 AIAA Aerospace Sciences Meeting}, + year = {2018}, + doi = {10.2514/6.2018-0767} +} + +@inproceedings{gharbi2017single, + author = {Gharbi, Aroua and Sarojini, Darshan and Kallou, Evanthia and Harper, Dustin J. and Petitgenet, Victor and Rancourt, David and BriceΓ±o, Simon I. and Mavris, Dimitri N.}, + title = {A Single Digital Thread Approach to Aircraft Detailed Design}, + booktitle = {55th AIAA Aerospace Sciences Meeting}, + year = {2017}, + doi = {10.2514/6.2017-0693} +} + +@inproceedings{goron2017simulationbased, + author = {Goron, Gael and Duca, Ruxandra and Sarojini, Darshan and Shah, Somil and Chakraborty, Imon and BriceΓ±o, Simon I. and Mavris, Dimitri N.}, + title = {A Simulation-Based Framework for Structural Loads Assessment during Dynamic Maneuvers}, + booktitle = {17th AIAA Aviation Technology, Integration, and Operations Conference}, + year = {2017}, + doi = {10.2514/6.2017-3767} +} + +@inproceedings{sarojini2017requirements, + author = {Sarojini, Darshan and Collins, Kyle and Mavris, Dimitri N.}, + title = {Requirements Analysis for Design Optimization of Aerobatic Aircraft}, + booktitle = {55th AIAA Aerospace Sciences Meeting}, + year = {2017}, + doi = {10.2514/6.2017-0462} +} + +@article{sarojini2016statically, + author = {Sarojini, Darshan and Lassche, T.J. and Herder, Just L. and Ananthasuresh, G. K.}, + title = {Statically balanced compliant two-port bistable mechanism}, + journal = {Mechanism and Machine Theory}, + year = {2016}, + volume = {102}, + pages = {1--13}, + doi = {10.1016/j.mechmachtheory.2016.03.016} +} + +@phdthesis{sarojini2021thesis, + author = {Sarojini, Darshan}, + title = {Structural Analysis and Optimization of Aircraft Wings through Dimensional Reduction}, + school = {Georgia Institute of Technology}, + year = {2021} +} diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..b85aee6 --- /dev/null +++ b/_config.yml @@ -0,0 +1,716 @@ +# ----------------------------------------------------------------------------- +# Site settings +# ----------------------------------------------------------------------------- + +title: IDOpt Lab # the website title (if blank, full name will be used instead) +first_name: Darshan +middle_name: +last_name: Sarojini +contact_note: > + Email is the best way to reach me. +description: > # the ">" symbol means to ignore newlines until "footer_text:" + Intelligent Design Optimization Lab β€” advancing the science and practice of engineering design. +footer_text: > + Powered by Jekyll with al-folio theme. + Hosted by GitHub Pages. +keywords: aircraft design, MDAO, MBSE, multidisciplinary design optimization, certification-driven design, Virginia Tech # add your own keywords or leave empty +lang: en # the language of your site (for example: en, fr, cn, ru, etc.) +icon: βš›οΈ # the emoji used as the favicon (alternatively, provide image name in /assets/img/) +apple_touch_icon: # image name in /assets/img/ (or a rooted path / absolute URL) used for iOS home-screen bookmarks; needs a real 180x180 PNG, since Safari ignores the emoji favicon above. Left empty, iOS falls back to a screenshot of the page. + +# Root user site: baseurl MUST stay empty. Swapping to a custom domain later is a +# CNAME file + DNS change plus the url below β€” no content changes needed. +url: https://idopt-lab.github.io # the base hostname & protocol for your site +baseurl: "" # the subpath of your site, e.g. /blog/. Leave blank for root +last_updated: false # set to true if you want to display last updated in the footer +impressum_path: # set to path to include impressum link in the footer, use the same path as permalink in a page, helps to conform with EU GDPR +back_to_top: true # set to false to disable the back to top button + +# ----------------------------------------------------------------------------- +# Theme +# ----------------------------------------------------------------------------- + +# repo color theme +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 +# Off by default: addresses are then split at build time so the HTML contains no +# `user@host` and no `mailto:` for harvesters to scrape, and clicking one copies +# it to the clipboard instead of opening a mail client. +# See "Protecting email addresses from scrapers" in docs/CUSTOMIZE.md. +protect_email: false + +# Off by default: the free public github-profile-trophy instance is disabled +# (its Vercel deployment answers HTTP 402 / DEPLOYMENT_DISABLED), so every trophy +# image 404s. The project itself is still open source and free β€” self-host it and +# point external_services.github_profile_trophy_url at your instance, then set +# enabled: true. See docs/CUSTOMIZE.md. +repo_trophies: + enabled: false + 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: + # Off until there is a real _data/cv.yml β€” the demo file shipped as Einstein's + # record and was removed rather than published as placeholder biography data. + enabled: false + 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 +# ----------------------------------------------------------------------------- +# will use title and url fields +# Take a look to https://github.com/jekyll/jekyll-feed for more customization + +# ----------------------------------------------------------------------------- +# Layout +# ----------------------------------------------------------------------------- + +navbar_fixed: true +footer_fixed: true +search_enabled: true +socials_in_search: true +posts_in_search: true +bib_search: true + +# Dimensions +max_width: 930px + +# ----------------------------------------------------------------------------- +# Open Graph & Schema.org +# ----------------------------------------------------------------------------- +# Display links to the page with a preview object on social media. +# see https://schema.org/docs/faq.html for more information +serve_og_meta: false # Include Open Graph meta tags in the HTML head +serve_schema_org: false # Include Schema.org in the HTML head +og_image: # The site-wide (default for all links) Open Graph preview image + +# ----------------------------------------------------------------------------- +# Analytics and search engine verification +# ----------------------------------------------------------------------------- + +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) +bing_site_verification: # out your bing-site-verification ID (Bing Webmaster) + +# ----------------------------------------------------------------------------- +# Blog +# ----------------------------------------------------------------------------- + +blog_name: al-folio # blog_name will be displayed in your blog page +blog_description: a simple whitespace theme for academics +permalink: /blog/:year/:title/ +lsi: false # produce an index for related posts + +# Pagination +pagination: + enabled: true + +related_blog_posts: + enabled: true + max_related: 5 + +# Giscus comments (RECOMMENDED) +# Follow instructions on https://giscus.app/ to setup for your repo to fill out the information below. +giscus: + repo: # / + repo_id: # leave empty or specify your repo_id (see https://giscus.app/) + category: Comments # name of the category under which discussions will be created + category_id: # leave empty or specify your category_id (see https://giscus.app/) + mapping: title # identify discussions by post title + strict: 1 # use strict identification mode + reactions_enabled: 1 # enable (1) or disable (0) emoji reactions + input_position: bottom # whether to display input form below (bottom) or above (top) the comments + dark_theme: dark # name of the dark color scheme (preferred works well with al-folio dark mode) + light_theme: light # name of the light color scheme (preferred works well with al-folio light mode) + emit_metadata: 0 + lang: en + +# Disqus comments (DEPRECATED) +disqus_shortname: al-folio # put your disqus shortname +# https://help.disqus.com/en/articles/1717111-what-s-a-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. +# Emptied: the al-folio demo shipped its own Medium feed and a Google Blog post +# here, which were being fetched over the network and rendered as our content. +external_sources: [] + +# ----------------------------------------------------------------------------- +# Newsletter +# ----------------------------------------------------------------------------- + +newsletter: + enabled: false + endpoint: # your loops endpoint (e.g., https://app.loops.so/api/newsletter-form/YOUR-ENDPOINT) + # https://loops.so/docs/forms/custom-form + +# ----------------------------------------------------------------------------- +# Collections +# ----------------------------------------------------------------------------- + +collections: + books: + output: true + news: + defaults: + layout: post + output: true + projects: + output: true + teachings: + output: true + +# ----------------------------------------------------------------------------- +# Jekyll settings +# ----------------------------------------------------------------------------- + +# Markdown and syntax highlight +markdown: kramdown +highlighter: rouge +kramdown: + input: GFM + syntax_highlighter_opts: + css_class: "highlight" + span: + line_numbers: false + block: + line_numbers: false + start_line: 1 + +# Includes & excludes +include: ["_pages"] +exclude: + - AGENTS.md + - al-folio-upgrade-report.md + - bin/ + - CLAUDE.md + - Dockerfile + - docker-compose.yml + - docker-compose-slim.yml + - docs/ + - Gemfile + - Gemfile.lock + - LICENSE + - lighthouse_results/ + - package.json + - package-lock.json + - _pages/about_einstein.md + - purgecss.config.js + - README.md + - readme_preview/ + - gems/ + - migrations/ + - vendor + # Hand-written x3dom pages plus ~218 MB of .glb models. Excluded from the + # Jekyll source so that terser/minifier never touch the 3D scene markup and + # Jekyll does not re-copy a quarter-gigabyte on every build. The directory is + # copied into _site verbatim after the build instead β€” see bin/copy-viz.sh, + # which both the deploy workflow and local builds call. + - interactive-visualization/ +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 + - jekyll-imagemagick + - jekyll-jupyter-notebook + - jekyll-link-attributes + - jekyll-minifier + - jekyll-paginate-v2 + - jekyll-regex-replace + - jekyll/scholar + - jekyll-sitemap + - jekyll-socials + - jekyll-tabs + - jekyll-terser + - jekyll-toc + - jekyll-twitter-plugin + - 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 + - al_email_protect + - al_marimo + - al_rtl + +# Sitemap settings +defaults: + - scope: + path: "assets" + values: + sitemap: false + +sass: + style: compressed + +# ----------------------------------------------------------------------------- +# Jekyll Minifier +# ----------------------------------------------------------------------------- + +jekyll-minifier: + compress_javascript: false # set to false since we are using terser as the js minifier + # 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). + # interactive-visualization/ is hand-written x3dom markup copied through as static + # files. Minifying it risks breaking the inline 3D scene markup, so leave it alone. + exclude: ["robots.txt", "interactive-visualization/*"] + +# ----------------------------------------------------------------------------- +# Terser +# ----------------------------------------------------------------------------- + +terser: + compress: + drop_console: true + +# ----------------------------------------------------------------------------- +# Jekyll Archives +# ----------------------------------------------------------------------------- + +jekyll-archives: + posts: + enabled: [year, tags, categories] # enables year, tag and category archives (remove if you need to disable one of them). + permalinks: + year: "/blog/:year/" + tags: "/blog/:type/:name/" + categories: "/blog/:type/:name/" + books: + enabled: [year, tags, categories] # enables year, tag and category archives (remove if you need to disable one of them). + +display_tags: ["formatting", "images", "links", "math", "code", "blockquotes"] # these tags will be displayed on the front page of your blog +display_categories: ["external-services"] # these categories will be displayed on the front page of your blog + +# ----------------------------------------------------------------------------- +# Jekyll Scholar +# ----------------------------------------------------------------------------- + +scholar: + last_name: [Sarojini] + first_name: [Darshan, D.] + + style: apa + locale: en + + source: /_bibliography/ + bibliography: papers.bib + bibliography_template: bib + # Note: if you have latex math in your bibtex, the latex filter + # preprocessing may conflict with MathJAX if the latter is enabled. + # See https://github.com/alshedivat/al-folio/issues/357. + bibtex_filters: [latex, smallcaps, superscript] + + replace_strings: true + join_strings: true + + details_dir: bibliography + details_link: Details + + query: "@*" + group_by: year + group_order: descending + +# Display different badges withs stats for your publications +# Customize badge behavior in _layouts/bib.liquid +enable_publication_badges: + altmetric: true # Altmetric badge (Customization options: https://badge-docs.altmetric.com/index.html) + dimensions: true # Dimensions badge (Customization options: https://badge.dimensions.ai/) + google_scholar: true # Google Scholar badge (https://scholar.google.com/intl/en/scholar/citations.html) + inspirehep: true # Inspire HEP badge (https://help.inspirehep.net/knowledge-base/citation-metrics/) + +# Filter out certain bibtex entry keywords used internally from the bib output +filtered_bibtex_keywords: + [ + abbr, + abstract, + additional_info, + altmetric, + annotation, + arxiv, + award, + award_name, + bibtex_show, + blog, + code, + dimensions, + eprint, + google_scholar_id, + hal, + html, + inspirehep_id, + pdf, + pmid, + poster, + preview, + selected, + slides, + supp, + video, + website, + ] + +# Maximum number of authors to be shown for each publication (more authors are visible on click) +max_author_limit: 3 # leave blank to always show all authors +more_authors_animation_delay: 10 # more authors are revealed on click using animation; smaller delay means faster animation + +# Enables publication thumbnails. If disabled, none of the publications will display thumbnails, even if specified in the bib entry. +enable_publication_thumbnails: true + +# ----------------------------------------------------------------------------- +# Jekyll Link Attributes +# ----------------------------------------------------------------------------- + +# These are the defaults +external_links: + enabled: true + rel: external nofollow noopener + target: _blank + exclude: + +# ----------------------------------------------------------------------------- +# Responsive WebP Images +# ----------------------------------------------------------------------------- + +# MAKE SURE imagemagick is installed and on your PATH before enabling imagemagick. In a terminal, run: +# convert -version +imagemagick: + enabled: true # enables responsive images for your site (recommended, see https://github.com/alshedivat/al-folio/issues/537) + widths: + - 480 + - 800 + - 1400 + input_directories: + - assets/img/ + input_formats: + - ".jpg" + - ".jpeg" + - ".png" + - ".tiff" + - ".gif" + output_formats: + webp: "-auto-orient -quality 85" + +# Lazy loading images +# If you enable lazy loading, all images will add the loading="lazy" attribute. +# This will make your site load faster, but it may not be supported in all browsers. +# You can also set loading="" to other values for specific images to override the default behavior. +# Options: "auto", "eager", "lazy" +# See https://web.dev/browser-level-image-lazy-loading/ for more information. +lazy_loading_images: true # enables lazy loading of images (recommended) + +# ----------------------------------------------------------------------------- +# Optional Features +# ----------------------------------------------------------------------------- + +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: false # enables automatic tooltip links generated for each section titles on pages and posts +enable_darkmode: true # enables switching between light/dark modes +enable_navbar_social: false # enables displaying social links in the navbar on the about page +enable_project_categories: true # enables categorization of projects into multiple categories +enable_medium_zoom: true # enables image zoom feature (as on medium.com) +enable_progressbar: true # enables a horizontal progress bar linked to the vertical scroll position +enable_video_embedding: false # enables video embedding for bibtex entries. If false, the button opens the video link in a new window. + +# ----------------------------------------------------------------------------- +# Library versions +# ----------------------------------------------------------------------------- + +# Add the url, version and integrity hash of the libraries you use in your site. +# The integrity hash is used to ensure that the library is not tampered with. +# Integrity hashes not provided by the libraries were generated using https://www.srihash.org/ +third_party_libraries: + download: false # if true, download the versions of the libraries specified below and use the downloaded files + bootstrap-table: + integrity: + css: "sha256-uRX+PiRTR4ysKFRCykT8HLuRCub26LgXJZym3Yeom1c=" + js: "sha256-4rppopQE9POKfukn2kEvhJ9Um25Cf6+IDVkARD0xh78=" + url: + 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=" + url: + js: "https://cdn.jsdelivr.net/npm/chart.js@{{version}}/dist/chart.umd.min.js" + version: "4.4.1" + d3: + integrity: + js: "sha256-1rA678n2xEx7x4cTZ5x4wpUCj6kUMZEZ5cxLSVSFWxw=" + url: + js: "https://cdn.jsdelivr.net/npm/d3@{{version}}/dist/d3.min.js" + version: "7.8.5" + diff2html: + integrity: + css: "sha256-IMBK4VNZp0ivwefSn51bswdsrhk0HoMTLc2GqFHFBXg=" + js: "sha256-eU2TVHX633T1o/bTQp6iIJByYJEtZThhF9bKz/DcbbY=" + url: + css: "https://cdn.jsdelivr.net/npm/diff2html@{{version}}/bundles/css/diff2html.min.css" + js: "https://cdn.jsdelivr.net/npm/diff2html@{{version}}/bundles/js/diff2html-ui.min.js" + version: "3.4.47" + echarts: + integrity: + js: + library: "sha256-QvgynZibb2U53SsVu98NggJXYqwRL7tg3FeyfXvPOUY=" + dark_theme: "sha256-sm6Ui9w41++ZCWmIWDLC18a6ki72FQpWDiYTDxEPXwU=" + url: + js: + library: "https://cdn.jsdelivr.net/npm/echarts@{{version}}/dist/echarts.min.js" + dark_theme: "https://cdn.jsdelivr.net/npm/echarts@{{version}}/theme/dark-fresh-cut.js" + version: "5.5.0" + google_fonts: + url: + fonts: "https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Roboto+Slab:100,300,400,500,700|Material+Icons&display=swap" + highlightjs: + integrity: + css: + light: "sha256-Oppd74ucMR5a5Dq96FxjEzGF7tTw2fZ/6ksAqDCM8GY=" + dark: "sha256-nyCNAiECsdDHrr/s2OQsp5l9XeY2ZJ0rMepjCT2AkBk=" + url: + css: + light: "https://cdn.jsdelivr.net/npm/highlight.js@{{version}}/styles/github.min.css" + dark: "https://cdn.jsdelivr.net/npm/highlight.js@{{version}}/styles/github-dark.min.css" + version: "11.9.0" + imagesloaded: + integrity: + js: "sha256-htrLFfZJ6v5udOG+3kNLINIKh2gvoKqwEhHYfTTMICc=" + url: + js: "https://cdn.jsdelivr.net/npm/imagesloaded@{{version}}/imagesloaded.pkgd.min.js" + version: "5.0.0" + jquery: + integrity: + js: "sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" + url: + js: "https://cdn.jsdelivr.net/npm/jquery@{{version}}/dist/jquery.min.js" + version: "3.6.0" + leaflet: + integrity: + css: "sha256-q9ba7o845pMPFU+zcAll8rv+gC+fSovKsOoNQ6cynuQ=" + js: "sha256-MgH13bFTTNqsnuEoqNPBLDaqxjGH+lCpqrukmXc8Ppg=" + js_map: "sha256-YAoQ3FzREN4GmVENMir8vgHHypC0xfSK3CAxTHCqx1M=" + local: + images: "images/" + url: + css: "https://cdn.jsdelivr.net/npm/leaflet@{{version}}/dist/leaflet.min.css" + images: "https://cdn.jsdelivr.net/npm/leaflet@{{version}}/dist/images/" + 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" + masonry: + integrity: + js: "sha256-Nn1q/fx0H7SNLZMQ5Hw5JLaTRZp0yILA/FRexe19VdI=" + url: + js: "https://cdn.jsdelivr.net/npm/masonry-layout@{{version}}/dist/masonry.pkgd.min.js" + version: "4.2.2" + mdb: + integrity: + css: "sha256-jpjYvU3G3N6nrrBwXJoVEYI/0zw8htfFnhT9ljN3JJw=" + css_map: "sha256-iYYMNfsJdVZjvsebJulg09miBXM4/GMTJgv1u5EZFFM=" + js: "sha256-NdbiivsvWt7VYCt6hYNT3h/th9vSTL4EDWeGs5SN3DA=" + js_map: "sha256-UPgyn4YNsT0khkBK5553QwhnlbTlU0aa+igyc6qP1bE=" + url: + css: "https://cdn.jsdelivr.net/npm/mdbootstrap@{{version}}/css/mdb.min.css" + css_map: "https://cdn.jsdelivr.net/npm/mdbootstrap@{{version}}/css/mdb.min.css.map" + 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" + mermaid: + integrity: + js: "sha256-TtLOdUA8mstPoO6sGvHIGx2ceXrrX4KgIItO06XOn8A=" + url: + js: "https://cdn.jsdelivr.net/npm/mermaid@{{version}}/dist/mermaid.min.js" + version: "10.7.0" + 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: + css: "sha256-p+CQrhSq3dnLHELDcVBFDf4whOor3w8gzLuc/pwRLyQ=" + js: "sha256-7SCmUR11IG4MkSoeLUq0pombv7oeV7yZuu7Z82e4Uy4=" + url: + 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: + css: "sha256-zTN0r+0OKaIv2xqeNNIYxNk0pWJ6+IqPGc1iDgVzWF0=" + js: "sha256-lo/r+jQ81wWrxdIiiiEEd538z4+dTJTt+leOuAS7GCw=" + url: + 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" + pseudocode: + integrity: + css: "sha256-VwMV//xgBPDyRFVSOshhRhzJRDyBmIACniLPpeXNUdc=" + js: "sha256-aVkDxqyzrB+ExUsOY9PdyelkDhn/DfrjWu08aVpqNlo=" + url: + 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" + scholar-icons: + integrity: + css: "sha256-VY3hHVj/hNX3fYG6wtbA6TcKJQl7+FthzGSyIB64klY=" + url: + css: "https://cdn.jsdelivr.net/npm/scholar-icons@{{version}}/css/scholar-icons.css" + version: "1.0.3" + vanilla-back-to-top: + integrity: + js: "sha256-uMJJ3EoTyfRBoTbR+lrfu1uRQ87RZG8AR3cVNuQVeFg=" + url: + 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: + css: "sha256-ygRrixsQlBByBZiOcJamh7JByO9fP+/l5UPtKNJmRsE=" + js: "sha256-vG4vLmOB/AJbJ6awr7Wg4fxonG+fxAp4cIrbIFTvRXU=" + url: + 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=" + js_map: "sha256-z0x9ICA65dPkZ0JVa9wTImfF6n7AJsKc6WlFE96/wNA=" + url: + js: "https://cdn.jsdelivr.net/npm/vega@{{version}}/build/vega.min.js" + js_map: "https://cdn.jsdelivr.net/npm/vega@{{version}}/build/vega.min.js.map" + version: "5.27.0" + vega-embed: + integrity: + js: "sha256-FPCJ9JYCC9AZSpvC/t/wHBX7ybueZhIqOMjpWqfl3DU=" + js_map: "sha256-VBbfSEFYSMdX/rTdGrONEHNP6BprCB7H/LpMMNt/cPA=" + url: + js: "https://cdn.jsdelivr.net/npm/vega-embed@{{version}}/build/vega-embed.min.js" + js_map: "https://cdn.jsdelivr.net/npm/vega-embed@{{version}}/build/vega-embed.min.js.map" + version: "6.24.0" + vega-lite: + integrity: + js: "sha256-TvBvIS5jUN4BSy009usRjNzjI1qRrHPYv7xVLJyjUyw=" + js_map: "sha256-l2I4D5JC23Ulsu6e3sKVe5AJ+r+DFkzkKnZS8nUGz28=" + url: + 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" + +# ----------------------------------------------------------------------------- +# Get external JSON data +# ----------------------------------------------------------------------------- + +# Emptied along with the CV page: this fed the rΓ©sumΓ© layout from a demo +# assets/json/resume.json that shipped with al-folio. +jekyll_get_json: [] + +jsonresume: + - basics + - work + - education + - publications + - projects + - volunteer + - awards + - certificates + - skills + - languages + - interests + - references diff --git a/_data/coauthors.yml b/_data/coauthors.yml new file mode 100644 index 0000000..b5c15f1 --- /dev/null +++ b/_data/coauthors.yml @@ -0,0 +1,5 @@ +# Maps author surnames to canonical first-name variants and a link. +# Example: +# "sarojini": +# - firstname: ["Darshan", "D."] +# url: https://www.aoe.vt.edu/people/faculty/darshan-sarojini.html diff --git a/_data/people.yml b/_data/people.yml new file mode 100644 index 0000000..1492ffa --- /dev/null +++ b/_data/people.yml @@ -0,0 +1,61 @@ +# Lab roster. Adding a member = appending an entry under the right group. +# Groups render in the order listed in _pages/people.md. +# +# Fields: name (required), topic, grad (expected graduation), note (awards, +# fellowships), url (personal page), email. + +pi: + - name: Darshan Sarojini + role: Assistant Professor, Aerospace and Ocean Engineering + email: sdarshan@vt.edu + url: https://www.aoe.vt.edu/people/faculty/darshan-sarojini.html + +phd: + - name: Grant Lee + topic: Vehicle-Operations Co-Design for Regional Air Mobility + - name: Khoa D. Nguyen + topic: Autonomous Battery Units for Urban Air Mobility + +bsms: + - name: Joseph Gould + topic: Certification-Driven Aircraft Design + grad: Dec 2026 + - name: Nathan M. Shune + topic: Multidisciplinary Aircraft Design and Trajectory Optimization + grad: Dec 2026 + - name: Joel George + topic: Structural Optimization + grad: May 2027 + - name: Krish D. Bhatt + topic: Agent-Based Modeling for Multi-modal Transportation + grad: Dec 2027 + - name: Jeremy John + topic: Ship Design Optimization + grad: May 2027 + note: DoW SMART Scholar; 2025 Fincantieri Scholar + - name: Quinn McIver + topic: Off-Nominal Reliability in Aircraft Design + grad: May 2027 + +ms: + - name: Emma Paulter + topic: Hypersonic Waveriders Optimization + grad: Dec 2026 + - name: Casey Chamberlain + topic: Conceptual Aircraft Design Tools + grad: Dec 2027 + - name: Dylan Hogge + topic: Hybrid-Electric Aircraft Design + grad: Dec 2027 + +undergrad: + - name: Sanjana Anem + topic: Aircraft Design Visualization in VR + grad: May 2028 + +alumni: + - name: Naman Kumar Shetty + topic: Flight Dynamics Framework + note: MS, May 2026 + - name: Ethan J. Phillips + topic: Flight Simulation and VR diff --git a/_data/socials.yml b/_data/socials.yml new file mode 100644 index 0000000..059df0c --- /dev/null +++ b/_data/socials.yml @@ -0,0 +1,11 @@ +# Social links shown in the footer / about page, in the order defined here. +# See https://github.com/george-gca/jekyll-socials for the full field list. +email: sdarshan@vt.edu +scholar_userid: BmotoisAAAAJ # Google Scholar ID +github_username: Idopt-Lab +rss_icon: true # comment this line to hide the RSS icon + +# TODO: add if you want them shown β€” +# orcid_id: +# linkedin_username: +# cv_pdf: /assets/pdf/your_cv.pdf # drop the file in assets/pdf/ first diff --git a/_data/venues.yml b/_data/venues.yml new file mode 100644 index 0000000..0d111c2 --- /dev/null +++ b/_data/venues.yml @@ -0,0 +1 @@ +# Optional per-venue styling for the publications page. diff --git a/_news/2023-01-01-scitech-2023.md b/_news/2023-01-01-scitech-2023.md new file mode 100644 index 0000000..1d8b764 --- /dev/null +++ b/_news/2023-01-01-scitech-2023.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-01-01 +inline: true +related_posts: false +--- + +Darshan presented two papers at the SciTech 2023 Forum: *Large-Scale Multidisciplinary Design Optimization of an eVTOL Aircraft using Comprehensive Analysis* and *Efficient Gradient-Based Optimization of Differential-Algebraic Equation Systems*. diff --git a/_news/2023-07-01-enlace.md b/_news/2023-07-01-enlace.md new file mode 100644 index 0000000..22939cf --- /dev/null +++ b/_news/2023-07-01-enlace.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-07-01 +inline: true +related_posts: false +--- + +Darshan welcomed ENLACE program students to the LSDO lab for mentorship on physics-based software and eVTOL design in collaboration with Aurora Flight Sciences. diff --git a/_news/2023-07-01-pearc23-guide.md b/_news/2023-07-01-pearc23-guide.md new file mode 100644 index 0000000..521ab1c --- /dev/null +++ b/_news/2023-07-01-pearc23-guide.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-07-01 +inline: true +related_posts: false +--- + +Cyd Burrows-Schilling presented *Towards Developing a Guide to Choosing National High-Performance Computing Resources* at PEARC23. diff --git a/_news/2023-07-01-pearc23-indyscc.md b/_news/2023-07-01-pearc23-indyscc.md new file mode 100644 index 0000000..2aee8e8 --- /dev/null +++ b/_news/2023-07-01-pearc23-indyscc.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-07-01 +inline: true +related_posts: false +--- + +Daniel Dietz presented *Scaling Up: Growth of the Indy Student Cluster Competition* at PEARC23. diff --git a/_news/2023-08-01-summer-interns.md b/_news/2023-08-01-summer-interns.md new file mode 100644 index 0000000..b32210e --- /dev/null +++ b/_news/2023-08-01-summer-interns.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-08-01 +inline: true +related_posts: false +--- + +Undergraduate summer interns Omar Ibrahim Alfonseca Navarrete and Ernesto Montano Alvares presented their work at a poster session. diff --git a/_news/2023-08-01-uli-review.md b/_news/2023-08-01-uli-review.md new file mode 100644 index 0000000..d928cb3 --- /dev/null +++ b/_news/2023-08-01-uli-review.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-08-01 +inline: true +related_posts: false +--- + +Darshan presented at the 2023 annual review workshop of the NASA University Leadership Initiative project. diff --git a/_news/2023-10-01-sdsc-workshop.md b/_news/2023-10-01-sdsc-workshop.md new file mode 100644 index 0000000..1e7337d --- /dev/null +++ b/_news/2023-10-01-sdsc-workshop.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-10-01 +inline: true +related_posts: false +--- + +Darshan ran a workshop with the San Diego Supercomputing Center, *Mini-Workshop on HPC CI Onboarding for the UCSD Research Community*. diff --git a/_news/2024-01-01-scitech-2024.md b/_news/2024-01-01-scitech-2024.md new file mode 100644 index 0000000..881a3a4 --- /dev/null +++ b/_news/2024-01-01-scitech-2024.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-01-01 +inline: true +related_posts: false +--- + +Darshan presented *Review of Computational Models for Large-Scale MDAO of Urban Air Mobility Concepts* at the SciTech 2024 Forum, with collaborators from Aurora Flight Sciences, Brigham Young University, UC Davis, San Diego State University, the University of Chicago, and NASA Ames. diff --git a/_news/2024-02-01-archer-aviation.md b/_news/2024-02-01-archer-aviation.md new file mode 100644 index 0000000..993a78d --- /dev/null +++ b/_news/2024-02-01-archer-aviation.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-02-01 +inline: true +related_posts: false +--- + +Darshan worked as Aerodynamic Performance Engineer at Archer Aviation in the Office of the Chief Engineer through July 2024, conducting aircraft-level performance and safety analysis of eVTOL aircraft and optimizing flaperon schedules. diff --git a/_news/2024-08-01-aviation-2024.md b/_news/2024-08-01-aviation-2024.md new file mode 100644 index 0000000..1303867 --- /dev/null +++ b/_news/2024-08-01-aviation-2024.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-08-01 +inline: true +related_posts: false +--- + +Darshan attended the AIAA Aviation 2024 Forum in Las Vegas and helped plan a panel discussion on multi-modal transportation. diff --git a/_news/2024-08-01-byteboost.md b/_news/2024-08-01-byteboost.md new file mode 100644 index 0000000..b1af272 --- /dev/null +++ b/_news/2024-08-01-byteboost.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-08-01 +inline: true +related_posts: false +--- + +Darshan attended the ByteBoost Summer Workshop at the Pittsburgh Supercomputing Center, exploring NSF computing testbeds for aircraft design and multi-modal transportation research. diff --git a/_news/2024-08-01-joined-vt.md b/_news/2024-08-01-joined-vt.md new file mode 100644 index 0000000..59d698c --- /dev/null +++ b/_news/2024-08-01-joined-vt.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-08-01 +inline: true +related_posts: false +--- + +Darshan joined Virginia Tech as Assistant Professor in the Aerospace and Ocean Engineering department. diff --git a/_news/2024-10-01-mason-lecture-mavris.md b/_news/2024-10-01-mason-lecture-mavris.md new file mode 100644 index 0000000..bebc949 --- /dev/null +++ b/_news/2024-10-01-mason-lecture-mavris.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-10-01 +inline: true +related_posts: false +--- + +Darshan hosted Dr. Dimitri Mavris at Virginia Tech for the 2024 William H. Mason Memorial Distinguished Lecture. diff --git a/_news/2024-11-01-sc24-scc.md b/_news/2024-11-01-sc24-scc.md new file mode 100644 index 0000000..5ae0fa4 --- /dev/null +++ b/_news/2024-11-01-sc24-scc.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-11-01 +inline: true +related_posts: false +--- + +Darshan served as vice-chair of the Student Cluster Competition at SuperComputing SC24. diff --git a/_news/2024-12-01-umbridge-workshop.md b/_news/2024-12-01-umbridge-workshop.md new file mode 100644 index 0000000..611d22c --- /dev/null +++ b/_news/2024-12-01-umbridge-workshop.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-12-01 +inline: true +related_posts: false +--- + +Darshan participated in the UM-Bridge workshop and gave a short talk on multifidelity reduced order modeling. diff --git a/_news/2025-01-01-scitech-2025.md b/_news/2025-01-01-scitech-2025.md new file mode 100644 index 0000000..67a12e7 --- /dev/null +++ b/_news/2025-01-01-scitech-2025.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-01-01 +inline: true +related_posts: false +--- + +Darshan attended the AIAA SciTech Forum and served as deputy technical discipline chair for the Modeling and Simulation Technologies technical committee. diff --git a/_news/2025-03-01-aurora-visit.md b/_news/2025-03-01-aurora-visit.md new file mode 100644 index 0000000..604ee31 --- /dev/null +++ b/_news/2025-03-01-aurora-visit.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-03-01 +inline: true +related_posts: false +--- + +Darshan visited Aurora Flight Sciences in Manassas, VA. diff --git a/_news/2025-03-01-nasa-langley-seminar.md b/_news/2025-03-01-nasa-langley-seminar.md new file mode 100644 index 0000000..a71eaa1 --- /dev/null +++ b/_news/2025-03-01-nasa-langley-seminar.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-03-01 +inline: true +related_posts: false +--- + +Darshan visited NASA Langley Research Center and gave a seminar, *MDAO and MBSE for Certification-Driven Aircraft Design*. diff --git a/_news/2025-06-01-boeing-visiting-professor.md b/_news/2025-06-01-boeing-visiting-professor.md new file mode 100644 index 0000000..563f172 --- /dev/null +++ b/_news/2025-06-01-boeing-visiting-professor.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-06-01 +inline: true +related_posts: false +--- + +Darshan participated in the Boeing Visiting Professor Program in Seattle, WA. diff --git a/_news/2025-07-01-aviation-2025.md b/_news/2025-07-01-aviation-2025.md new file mode 100644 index 0000000..2846bbc --- /dev/null +++ b/_news/2025-07-01-aviation-2025.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-07-01 +inline: true +related_posts: false +--- + +Darshan presented *Performance and Regulatory Assessment Trim Formulations for Conceptual Aircraft Design* at AIAA Aviation 2025 in Las Vegas, NV. diff --git a/_news/2025-07-01-caams-irb.md b/_news/2025-07-01-caams-irb.md new file mode 100644 index 0000000..b37f3bb --- /dev/null +++ b/_news/2025-07-01-caams-irb.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-07-01 +inline: true +related_posts: false +--- + +Darshan attended the CAAMS center annual Industry Review Board meeting in Ann Arbor, MI. diff --git a/_news/2025-07-01-nasa-ames-seminar.md b/_news/2025-07-01-nasa-ames-seminar.md new file mode 100644 index 0000000..6a07a78 --- /dev/null +++ b/_news/2025-07-01-nasa-ames-seminar.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-07-01 +inline: true +related_posts: false +--- + +Darshan visited NASA Ames Research Center to give a seminar, *MDAO for Urban Air Mobility*. diff --git a/_news/2025-09-01-break-apart-visit.md b/_news/2025-09-01-break-apart-visit.md new file mode 100644 index 0000000..867ce4e --- /dev/null +++ b/_news/2025-09-01-break-apart-visit.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-09-01 +inline: true +related_posts: false +--- + +Darshan visited Dr. Adam Stern in Livingston, MT to discuss the ongoing project on design of break-apart mechanisms for UAS. diff --git a/_news/2025-09-01-fincantieri-presentation.md b/_news/2025-09-01-fincantieri-presentation.md new file mode 100644 index 0000000..ef7256d --- /dev/null +++ b/_news/2025-09-01-fincantieri-presentation.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-09-01 +inline: true +related_posts: false +--- + +Jeremy John presented *Design Optimization of Ocean Vehicles Using Large-Scale MDAO Methods*, conducted as a Fincantieri scholarship recipient in Summer 2025. diff --git a/_news/2025-11-01-mason-lecture-electra.md b/_news/2025-11-01-mason-lecture-electra.md new file mode 100644 index 0000000..314b6be --- /dev/null +++ b/_news/2025-11-01-mason-lecture-electra.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-11-01 +inline: true +related_posts: false +--- + +Darshan hosted Dr. John S. Langford, JP Stewart, and Melissa Meredith from Electra.aero at Virginia Tech for the William H. Mason Memorial Distinguished Lecture, *The Quest for Electric Airplanes That Make Sense*. diff --git a/_news/2026-01-01-scitech-2026.md b/_news/2026-01-01-scitech-2026.md new file mode 100644 index 0000000..e90a71f --- /dev/null +++ b/_news/2026-01-01-scitech-2026.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-01-01 +inline: true +related_posts: false +--- + +Students presented at AIAA SciTech 2026 in Orlando, FL: Joey Gould and Nate Shune on *Certification-Informed Reliability and Performance Assessment of Electrified Aircraft*; Khoa Nguyen, Dylan Hogge, and John Riris (co-advised by Dr. Brad Denby) on *Autonomous Battery Units as an Enabling Technology for Urban Air Mobility*; Apurba Sarkar and Reza Batley (advisor: Dr. Sourav Saha) on *A Kernel-based Resource-efficient Neural Surrogate for Multi-fidelity Prediction of Aerodynamic Field*. diff --git a/_news/2026-01-01-tvf-meeting.md b/_news/2026-01-01-tvf-meeting.md new file mode 100644 index 0000000..2a4c276 --- /dev/null +++ b/_news/2026-01-01-tvf-meeting.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-01-01 +inline: true +related_posts: false +--- + +Darshan attended the Vertical Flight Society's Transformative Vertical Flight Meeting in San Jose, CA. diff --git a/_news/2026-02-01-caams-winter.md b/_news/2026-02-01-caams-winter.md new file mode 100644 index 0000000..fbeff7b --- /dev/null +++ b/_news/2026-02-01-caams-winter.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-02-01 +inline: true +related_posts: false +--- + +Darshan presented *AI Algorithms for Autonomous Decision Making in Resource-Constrained Environments* at the NSF CAAMS winter meeting in Alexandria, VA. diff --git a/_news/2026-02-01-nasa-rem-workshop.md b/_news/2026-02-01-nasa-rem-workshop.md new file mode 100644 index 0000000..2107f0e --- /dev/null +++ b/_news/2026-02-01-nasa-rem-workshop.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-02-01 +inline: true +related_posts: false +--- + +Darshan participated in the NASA Revolutionary Engineering Methods workshop at NASA Ames. diff --git a/_news/2026-04-01-dbf-flyoff.md b/_news/2026-04-01-dbf-flyoff.md new file mode 100644 index 0000000..dfb8e39 --- /dev/null +++ b/_news/2026-04-01-dbf-flyoff.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-04-01 +inline: true +related_posts: false +--- + +Darshan served as AIAA Design-Build-Fly student competition advisor for the Virginia Tech team at the 2026 Fly-Off in Wichita, KS. diff --git a/_news/2026-06-01-aviation-2026.md b/_news/2026-06-01-aviation-2026.md new file mode 100644 index 0000000..54786cc --- /dev/null +++ b/_news/2026-06-01-aviation-2026.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-06-01 +inline: true +related_posts: false +--- + +Students and collaborators presented at AIAA Aviation 2026 in San Diego, CA: Grant Lee, Dylan Hogge, Aman Anwar, and Krish Bhatt on *A Transportation Model for Door-to-Door Regional Air Mobility Applied to West Virginia*; Nicholas R. Prophet on *Programmed Disassembly of Unmanned Aerial Vehicles*. diff --git a/_news/2026-06-01-capstone-conference.md b/_news/2026-06-01-capstone-conference.md new file mode 100644 index 0000000..d05a42c --- /dev/null +++ b/_news/2026-06-01-capstone-conference.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-06-01 +inline: true +related_posts: false +--- + +Darshan attended the Capstone Design Conference at Texas A&M University. diff --git a/_news/2026-06-01-gooseworks-navair.md b/_news/2026-06-01-gooseworks-navair.md new file mode 100644 index 0000000..fe691de --- /dev/null +++ b/_news/2026-06-01-gooseworks-navair.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-06-01 +inline: true +related_posts: false +--- + +Senior design team GooseWorks presented their carrier-based strike fighter F/A-XX Emperor design to NAVAIR Commander Vice Adm. John Dougherty and his staff. diff --git a/_news/2026-06-01-mathworks-summit.md b/_news/2026-06-01-mathworks-summit.md new file mode 100644 index 0000000..e19fcb5 --- /dev/null +++ b/_news/2026-06-01-mathworks-summit.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-06-01 +inline: true +related_posts: false +--- + +Darshan presented *From Requirements to Flight Simulation: An Integrated Aircraft Design Demo* at the MathWorks Research Summit in Natick, MA. diff --git a/_news/2026-07-01-caams-summer.md b/_news/2026-07-01-caams-summer.md new file mode 100644 index 0000000..fe9be8d --- /dev/null +++ b/_news/2026-07-01-caams-summer.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-07-01 +inline: true +related_posts: false +--- + +Darshan attended the NSF CAAMS summer meeting at Penn State University. diff --git a/_news/2026-07-01-k12-flight-school.md b/_news/2026-07-01-k12-flight-school.md new file mode 100644 index 0000000..cf79acf --- /dev/null +++ b/_news/2026-07-01-k12-flight-school.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-07-01 +inline: true +related_posts: false +--- + +IDOpt Lab collaborated with VT CEED, Marshall University, and the Bill Noe Flight School on a K-12 field trip to the flight school. diff --git a/_news/2026-09-01-oceans.md b/_news/2026-09-01-oceans.md new file mode 100644 index 0000000..b83633d --- /dev/null +++ b/_news/2026-09-01-oceans.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-09-01 +inline: true +related_posts: false +--- + +Attending the OCEANS 2026 conference in Monterey, CA. diff --git a/_pages/404.md b/_pages/404.md new file mode 100644 index 0000000..f0d9804 --- /dev/null +++ b/_pages/404.md @@ -0,0 +1,9 @@ +--- +layout: page +permalink: /404.html +title: "Page not found" +description: "Looks like there has been a mistake. Nothing exists here." +redirect: true +--- + +You will be redirected to the main page within 3 seconds. If not redirected, please go back to the [home page]({{ site.baseurl | prepend: site.url }}). diff --git a/_pages/about.md b/_pages/about.md new file mode 100644 index 0000000..76d11f6 --- /dev/null +++ b/_pages/about.md @@ -0,0 +1,44 @@ +--- +layout: about +title: about +permalink: / +subtitle: Intelligent Design Optimization Lab Β· Aerospace and Ocean Engineering, Virginia Tech + +profile: + align: right + # TODO: drop a photo at assets/img/prof_pic.jpg and uncomment the line below. + # The al-folio demo image that shipped here has been removed. + # image: prof_pic.jpg + image_circular: false + more_info: > +

Darshan Sarojini

+

Assistant Professor

+

sdarshan@vt.edu

+ +selected_papers: true # includes a list of papers marked as "selected={true}" +social: true # includes social icons at the bottom of the page + +announcements: + enabled: true # includes a list of news items + scrollable: true + limit: 5 + +latest_posts: + enabled: false + scrollable: true + limit: 3 +--- + +We work on advancing the science and practice of engineering design β€” improving how complex engineering systems are conceived, analyzed, and optimized. + +Aircraft are the prime example: shaped by the missions they fly and the environments they operate in, spanning aerodynamics, propulsion, structures, and controls at once, and held to rigorous certification standards. Analyzing them well means treating them as multidisciplinary systems rather than a collection of separately optimized parts. We develop the methods, algorithms, and software to address those challenges. + +### Research expertise + +- **Certification-Driven Design** β€” treating certification criteria as constraints that shape the feasible design space, rather than checks applied after the fact. +- **Integration of MDAO and MBSE** β€” connecting multidisciplinary design, analysis, and optimization with model-based systems engineering. +- **Multimodal Transportation Systems** β€” assessing how new air vehicles interact with the wider transportation network. + +### Joining the lab + +I am recruiting students and researchers, including research assistantships, teaching positions, and postdoctoral opportunities. See [openings](/join/) for how to get in touch. diff --git a/_pages/join.md b/_pages/join.md new file mode 100644 index 0000000..73bca40 --- /dev/null +++ b/_pages/join.md @@ -0,0 +1,24 @@ +--- +layout: page +title: join +permalink: /join/ +description: Openings in the Intelligent Design Optimization Lab. +nav: true +nav_order: 6 +--- + +I am actively recruiting students and researchers. Current opportunities include **graduate research assistantships**, **teaching positions**, and **postdoctoral appointments**. + +## Prospective graduate students + +If your interests overlap with [our research](/research/) β€” multidisciplinary design optimization, certification-driven design, model-based systems engineering, or multimodal transportation β€” please get in touch. Include your CV and a short note on what you would like to work on. + + + +**Email:** sdarshan@vt.edu + +## Current Virginia Tech students + +Undergraduate and Master's students at Virginia Tech interested in research are welcome to email directly. Several lab members joined through the accelerated BS/MS program β€” see [people](/people/) for the kinds of projects students take on. diff --git a/_pages/news.md b/_pages/news.md new file mode 100644 index 0000000..6223439 --- /dev/null +++ b/_pages/news.md @@ -0,0 +1,7 @@ +--- +layout: page +title: news +permalink: /news/ +--- + +{% include news.liquid %} diff --git a/_pages/people.md b/_pages/people.md new file mode 100644 index 0000000..c48bea2 --- /dev/null +++ b/_pages/people.md @@ -0,0 +1,49 @@ +--- +layout: page +title: people +permalink: /people/ +description: The Intelligent Design Optimization Lab. +nav: true +nav_order: 4 +--- + + + +{% assign groups = "phd,bsms,ms,undergrad,alumni" | split: "," %} +{% assign labels = "PhD Students,Accelerated BS/MS Students,Master's Students,Undergraduate Researchers,Alumni" | split: "," %} + +{% assign pi = site.data.people.pi %} +{% if pi %} + +## Principal Investigator + +{% for p in pi %} + +**{% if p.url %}[{{ p.name }}]({{ p.url }}){% else %}{{ p.name }}{% endif %}**{% if p.role %} β€” {{ p.role }}{% endif %}{% if p.email %} +
{{ p.email }}{% endif %} +{% endfor %} +{% endif %} + +{% for g in groups %} +{% assign members = site.data.people[g] %} +{% if members and members.size > 0 %} + +## {{ labels[forloop.index0] }} + +
    +{% for p in members %} +
  • + {% if p.url %}{{ p.name }}{% else %}{{ p.name }}{% endif %} + {%- if p.topic %} β€” {{ p.topic }}{% endif -%} + {%- if p.grad %} (expected {{ p.grad }}){% endif -%} + {%- if p.note %}
    {{ p.note }}{% endif -%} +
  • +{% endfor %} +
+{% endif %} +{% endfor %} + +--- + +Interested in joining? See the [openings](/join/). diff --git a/_pages/projects.md b/_pages/projects.md new file mode 100644 index 0000000..0184a70 --- /dev/null +++ b/_pages/projects.md @@ -0,0 +1,65 @@ +--- +layout: page +title: research +permalink: /research/ +description: Projects underway in the Intelligent Design Optimization Lab. +nav: true +nav_order: 2 +display_categories: [ongoing, completed] +horizontal: false +--- + + +
+{% if site.enable_project_categories and page.display_categories %} + + {% for category in page.display_categories %} + +

{{ category }}

+
+ {% assign categorized_projects = site.projects | where: "category", category %} + {% assign sorted_projects = categorized_projects | sort: "importance" %} + + {% if page.horizontal %} +
+
+ {% for project in sorted_projects %} + {% include projects_horizontal.liquid %} + {% endfor %} +
+
+ {% else %} +
+ {% for project in sorted_projects %} + {% include projects.liquid %} + {% endfor %} +
+ {% endif %} + {% endfor %} + +{% else %} + + + +{% assign sorted_projects = site.projects | sort: "importance" %} + + + +{% if page.horizontal %} + +
+
+ {% for project in sorted_projects %} + {% include projects_horizontal.liquid %} + {% endfor %} +
+
+ {% else %} +
+ {% for project in sorted_projects %} + {% include projects.liquid %} + {% endfor %} +
+ {% endif %} +{% endif %} +
diff --git a/_pages/publications.md b/_pages/publications.md new file mode 100644 index 0000000..39ed218 --- /dev/null +++ b/_pages/publications.md @@ -0,0 +1,20 @@ +--- +layout: page +permalink: /publications/ +title: publications +description: publications by categories in reversed chronological order. generated by jekyll-scholar. +nav: true +nav_order: 3 +--- + + + + + +{% include bib_search.liquid %} + +
+ +{% bibliography %} + +
diff --git a/_pages/resources.md b/_pages/resources.md new file mode 100644 index 0000000..983bb0a --- /dev/null +++ b/_pages/resources.md @@ -0,0 +1,47 @@ +--- +layout: page +title: student resources +permalink: /resources/ +description: Funding opportunities and competitions for students. +nav: true +nav_order: 8 +--- + + + +## National fellowships + +- **NSF GRFP** β€” three years of support, including an annual stipend of $37,000 +- **DoD SMART** β€” full tuition, annual stipend, internships, and guaranteed civilian employment +- **DoD NDSEG** β€” competitive fellowship for U.S. citizens pursuing doctoral degrees +- **ACRP Graduate Research Award** β€” stimulating thought, discussion, and research on airport issues +- **Dwight D. Eisenhower Transportation Fellowship (DDETFP)** +- **NSF Postdoctoral Fellowship** +- **John V. Wehausen Graduate Scholarship** +- **Samya Rose Stumo National Air Grant Fellowship** +- **DoE SCGSR Program** + +## Competitions + +- **NASA University Student Research Challenge (USRC)** +- **NASA Blue Skies** +- **ACRP Design Competition** + +## Summer research programs + +**International** β€” TUM PREP (Germany) Β· DAAD RISE Β· Start in France + +**United States** β€” MIT Β· University of Utah Β· Northwestern + +## Virginia Tech + +- **ICTAS Undergraduate Research Fellowship** +- **VSGC STEM Research Scholarship** +- **Tolson and Pratt departmental fellowships** +- **Presidential Postdoctoral Fellowship** +- **First-Year FURF** +- **MAOP Summer Research Internship** + +Virginia Tech also offers several conference travel funding options. diff --git a/_pages/service.md b/_pages/service.md new file mode 100644 index 0000000..67ad8de --- /dev/null +++ b/_pages/service.md @@ -0,0 +1,43 @@ +--- +layout: page +title: service +permalink: /service/ +description: Professional and academic service. +nav: true +nav_order: 7 +--- + +## AIAA + +- **Aircraft Design (AD) Technical Committee** β€” member, 2025–present +- **Aviation in Multimodal Transportation (AiMT) Integration and Outreach Committee** β€” member, 2024–present; chair of the technical papers subcommittee; Aviation 2024 Forum360 planning committee +- **Transformational Flight (TF) Integration and Outreach Committee** β€” member, 2022–present +- **Modeling and Simulation Technologies (MST) Technical Committee** β€” member, 2022–present; technical discipline chair for Aviation 2025; deputy chair for SciTech 2025 + +## SuperComputing Conference + +- **SC 2024** β€” vice-chair, Student Cluster Competition +- **SC 2023** β€” early career committee; reproducibility challenge committee +- **SC 2022** β€” early career committee; vice-chair, IndySCC; student programming committee +- **SC 2021** β€” co-chair of the IndySCC, a new education-focused track of the Student Cluster Competition + +## Campus Champions + +Campus champion for the University of California San Diego, with responsibility for NSF ACCESS allocations. + +## Peer review + +**Journals** β€” Structural and Multidisciplinary Optimization Β· AIAA Journal of Aerospace Information Systems Β· Advances in Materials and Processing Technologies Β· Engineering Computations Β· Proceedings of the Institution of Mechanical Engineers, Part G: Journal of Aerospace Engineering + +**Conferences** β€” AIAA SciTech Forum Β· AIAA Aviation Forum Β· ACM/IEEE SuperComputing Student Cluster Competition + +## Institutional service + +**Virginia Tech** (2024–present) +: Undergraduate Curriculum Committee Β· Mason Memorial Lecture Committee + +**University of California San Diego** +: Student mentoring Β· judge, UC LEADS 2023 poster competition + +**Georgia Institute of Technology** +: Student representative, Institute Graduate Curriculum Committee diff --git a/_pages/teaching.md b/_pages/teaching.md new file mode 100644 index 0000000..db6f053 --- /dev/null +++ b/_pages/teaching.md @@ -0,0 +1,31 @@ +--- +layout: page +title: teaching +permalink: /teaching/ +description: Courses taught and teaching activities. +nav: true +nav_order: 5 +--- + +## Virginia Tech + +- **AOE 4065 β€” Air Vehicle Design I** Β· Fall 2024, Fall 2025 +- **AOE 4066 β€” Air Vehicle Design II** Β· Spring 2025, Spring 2026 + +Reference material for the Air Vehicle Design sequence is published in the [AVD Reference Library](/air-vehicle-design/), organized by design-process phase. + +## University of California San Diego + +- **MAE 155A β€” Aerospace Engineering Design I** Β· Winter 2023 β€” lecture on systems engineering +- **MAE 270 β€” Multidisciplinary Design Optimization** Β· Winter 2023 β€” lecture on topology optimization + +## Georgia Institute of Technology + +- **AE 6344 β€” Aircraft Design II** Β· Spring 2021, Spring 2022 β€” lectures on structural analysis, structural sizing, and multidisciplinary design optimization +- **AE 6394 β€” System of Systems Engineering Applications** Β· Spring 2021 β€” teaching assistant +- **AE 4351 β€” AE Design Project II** Β· Spring 2017 β€” teaching assistant +- **AE 4350 β€” AE Design Project I** Β· Fall 2016 β€” teaching assistant + +## Teaching preparation + +Completed the **Tech to Teaching** certificate through Georgia Tech's Center for Teaching and Learning, comprising two graduate-level pedagogy courses and a capstone teaching experience. diff --git a/_projects/10_fan_stage_distorted_flow.md b/_projects/10_fan_stage_distorted_flow.md new file mode 100644 index 0000000..840f573 --- /dev/null +++ b/_projects/10_fan_stage_distorted_flow.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Aero-Structural Design of a Fan Stage under Distorted Flow +description: Variational Asymptotic Method applied to transient fan rotor blade analysis +importance: 5 +category: completed +--- + +**Role:** Collaborator on the PhD thesis of Manish Pokhrel + +Represents the fan blade as a higher-order beam model through the Variational Asymptotic Method (VAM) β€” the first reported work applying VAM to transient structural analysis of fan rotor blades. Rotor structural analysis covers dynamic stress computation, excitation frequency determination, and resonance margin calculation across vibration modes. The resulting design satisfies structural constraints at a cost of only 0.22% in aerodynamic stage efficiency. diff --git a/_projects/11_rade.md b/_projects/11_rade.md new file mode 100644 index 0000000..82eca2d --- /dev/null +++ b/_projects/11_rade.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Rapid Airframe Design Environment (RADE) +description: Rapid geometry manipulation and automated wingbox layout +importance: 6 +category: completed +--- + +**Role:** Postdoctoral scholar at ASDL, with Dr. Jason Corman + +A tool for rapid geometry manipulation of conventional and unconventional aircraft, covering outer mold line modification and automated wingbox structural layout. It provides an API to interface with physics-based solvers: AVL for low-fidelity aerodynamics, Nastran for structural and aeroelastic analysis, and HyperSizer for structural sizing. diff --git a/_projects/12_delphi.md b/_projects/12_delphi.md new file mode 100644 index 0000000..c10c3cc --- /dev/null +++ b/_projects/12_delphi.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Dynamic Environment for Loads Prediction and Handling Investigation (DELPHI) +description: Six-degree-of-freedom flight dynamics simulation with pluggable models +importance: 7 +category: completed +--- + +**Role:** Postdoctoral scholar at ASDL, with Dr. Evan Harrison + +A six-degree-of-freedom flight dynamics simulation tool whose API accepts any aerodynamic, propulsion, and mass properties model. Aircraft may be defined with arbitrary numbers of propulsion devices and control surfaces. A closed-loop control system supports prediction of regulation-specified dynamic maneuvers and handling qualities. diff --git a/_projects/13_beam_models_wingbox.md b/_projects/13_beam_models_wingbox.md new file mode 100644 index 0000000..7bae738 --- /dev/null +++ b/_projects/13_beam_models_wingbox.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Beam Models for Aircraft Wingbox Structures +description: Physics-based model reduction for wing primary structure +importance: 8 +category: completed +--- + +**Role:** PhD thesis, ASDL, Georgia Tech + +Explores physics-based model reduction to produce a simplified beam representation of aircraft wing primary structure, built on OpenMDAO with CasADi automating derivative computation. It handles arbitrary cross-sections, dynamic loads, both strength and buckling constraints, and multiple beam members connected by joints carrying masses and point loads, with a one-time correction from the higher-order Variational Asymptotic Method. Against higher-fidelity shell models, predicted weight differs by less than 5% with a 12x speed-up, even for configurations as complex as the truss-braced wing. diff --git a/_projects/1_regional_air_mobility.md b/_projects/1_regional_air_mobility.md new file mode 100644 index 0000000..5991555 --- /dev/null +++ b/_projects/1_regional_air_mobility.md @@ -0,0 +1,13 @@ +--- +layout: page +title: Regional Air Mobility in Appalachia +description: A framework for increased accessibility in overburdened communities +importance: 1 +category: ongoing +--- + +**Sponsor:** NASA (September 2025 – August 2028) +**PI:** Darshan Sarojini +**Collaborators:** Dr. Antonio Trani (Virginia Tech), Marshall University, Vertx Partners + +This project develops methods to assess the impact of regional air mobility (RAM) on overburdened regions across the country. diff --git a/_projects/2_certification_driven_design.md b/_projects/2_certification_driven_design.md new file mode 100644 index 0000000..18f44c6 --- /dev/null +++ b/_projects/2_certification_driven_design.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Certification-Driven Aircraft Design +description: Embedding certification criteria directly into conceptual design +importance: 2 +category: ongoing +--- + +Certification criteria shape the feasible design space and, therefore, must be embedded directly into conceptual aircraft design, not simply checked after the fact. + +This work incorporates certification requirements β€” including reliability, handling qualities, and regulatory simulations β€” into multidisciplinary aircraft design frameworks. diff --git a/_projects/3_advanced_visualization.md b/_projects/3_advanced_visualization.md new file mode 100644 index 0000000..c7851a6 --- /dev/null +++ b/_projects/3_advanced_visualization.md @@ -0,0 +1,13 @@ +--- +layout: page +title: Advanced Visualization Methods for Design +description: Web-based tools for 3D geometry and scientific data +importance: 3 +category: ongoing +--- + +**Collaborators:** MathWorks, VT ARC Visionarium + +This initiative creates web-based tools for displaying three-dimensional geometries and scientific data within integrated analytical interfaces. + +Worked examples are published in the lab's [interactive visualization gallery](/interactive-visualization/). diff --git a/_projects/4_ocean_vehicle_mdo.md b/_projects/4_ocean_vehicle_mdo.md new file mode 100644 index 0000000..41f3b9b --- /dev/null +++ b/_projects/4_ocean_vehicle_mdo.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Design Optimization of Ocean Vehicles +description: Large-scale MDO methods applied to maritime vessels +importance: 4 +category: ongoing +--- + +**Sponsor:** Fincantieri (Summer 2025 Fincantieri scholarship; recipient: Jeremy John) + +This research applies multidisciplinary design optimization techniques developed for aerospace to maritime vessel design. diff --git a/_projects/5_break_apart_uas.md b/_projects/5_break_apart_uas.md new file mode 100644 index 0000000..6dc8c73 --- /dev/null +++ b/_projects/5_break_apart_uas.md @@ -0,0 +1,13 @@ +--- +layout: page +title: Break-Apart Mechanisms for UAS +description: Commanded in-flight disassembly of unmanned aerial systems +importance: 5 +category: ongoing +--- + +**Sponsor:** Prius Intelli LLC +**PI:** Dr. Rakesh Kapania +**Phase I:** January 1 – July 15, 2025 Β· **Phase II:** July 16 – December 31, 2025 + +Our group is engaged in developing mechanisms that enable Unmanned Aerial Systems (UAS) to safely disassemble in flight under controlled, commanded conditions. diff --git a/_projects/6_evtol_system_mdo.md b/_projects/6_evtol_system_mdo.md new file mode 100644 index 0000000..1d2fdaf --- /dev/null +++ b/_projects/6_evtol_system_mdo.md @@ -0,0 +1,12 @@ +--- +layout: page +title: Electric Air Taxi Concept System-Level MDO +description: Large-scale MDO with seven disciplines contributing to a system-level optimization +importance: 1 +category: completed +--- + +**Funding:** NASA University Leadership Initiative (ULI) +**Role:** Postdoctoral scholar, with PI Dr. John Hwang + +A first-of-its-kind demonstration of large-scale MDO with seven disciplines contributing design variables to a system-level optimization β€” 102 design variables and 19 constraints. Low-fidelity physics-based analysis kept turnaround to roughly 30 minutes on a standard design computer, yielding 11.4% lower mass than a baseline sized vehicle. diff --git a/_projects/7_pegasus_tbw_structures.md b/_projects/7_pegasus_tbw_structures.md new file mode 100644 index 0000000..a0a5322 --- /dev/null +++ b/_projects/7_pegasus_tbw_structures.md @@ -0,0 +1,12 @@ +--- +layout: page +title: Structural Design Space Exploration of PEGASUS and TBW +description: Effect of outer mold line, engine, and structural layout variables on structural weight +importance: 2 +category: completed +--- + +**Funding:** NASA Transformational Tools and Technologies (TTT) +**Role:** PhD thesis work; collaborator on the PhD thesis of David Solano + +No previous work had examined the effect of high-level outer mold line (OML), engine, and structural layout variables on structural weight. For the PEGASUS concept, this work obtained a structural layout with the least sensitivity to gust loads specified by 14-CFR regulations. For the Truss-Braced Wing (TBW) concept, it identified the strut-wing attachment location giving the least overall primary structure weight. diff --git a/_projects/8_certification_driven_mdo.md b/_projects/8_certification_driven_mdo.md new file mode 100644 index 0000000..eb6009e --- /dev/null +++ b/_projects/8_certification_driven_mdo.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Certification-Driven MDO of Aircraft +description: Trade-offs between performance and certification constraints +importance: 3 +category: completed +--- + +**Role:** Collaborator on the PhD thesis of Jiacheng Xie + +Captures the trade-off between performance and certification constraints, including 14-CFR Part 25 Subpart B (Flight Characteristics) and Subpart C (Structures). Applications include retrofit design of a Boeing 777-type horizontal tail and redesign of the vertical tail for NASA's PEGASUS concept. diff --git a/_projects/9_x57_reliability.md b/_projects/9_x57_reliability.md new file mode 100644 index 0000000..aecdcc1 --- /dev/null +++ b/_projects/9_x57_reliability.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Reliability-Based Design of the X-57 Concept +description: Safety assessment and off-nominal performance for distributed electric propulsion +importance: 4 +category: completed +--- + +**Role:** Collaborator on the PhD thesis of Mayank Bendarkar + +Implements a safety assessment framework for off-nominal performance and reliability, using a Bayesian decision framework for compliance assessment. A case study on the X-57 distributed electric propulsion aircraft identified battery failure as a catastrophic scenario, with loss of the cruise motor or traction power buses the next most critical hazardous failures. diff --git a/assets/bibliography/2018-12-22-distill.bib b/assets/bibliography/2018-12-22-distill.bib new file mode 100644 index 0000000..2b06f3c --- /dev/null +++ b/assets/bibliography/2018-12-22-distill.bib @@ -0,0 +1,7 @@ +@article{gregor2015draw, + title={DRAW: A recurrent neural network for image generation}, + author={Gregor, Karol and Danihelka, Ivo and Graves, Alex and Rezende, Danilo Jimenez and Wierstra, Daan}, + journal={arXiv preprint, arXiv:1502.04623}, + year={2015}, + url={https://arxiv.org/pdf/1502.04623.pdf} +} diff --git a/assets/json/table_data.json b/assets/json/table_data.json new file mode 100644 index 0000000..a44a088 --- /dev/null +++ b/assets/json/table_data.json @@ -0,0 +1,128 @@ +[ + { + "id": 0, + "name": "Item 0", + "price": "$0", + "amount": 3 + }, + { + "id": 1, + "name": "Item 1", + "price": "$1", + "amount": 4 + }, + { + "id": 2, + "name": "Item 2", + "price": "$2", + "amount": 8 + }, + { + "id": 3, + "name": "Item 3", + "price": "$3", + "amount": 2 + }, + { + "id": 4, + "name": "Item 4", + "price": "$4", + "amount": 90 + }, + { + "id": 5, + "name": "Item 5", + "price": "$5", + "amount": 2 + }, + { + "id": 6, + "name": "Item 6", + "price": "$6", + "amount": 3 + }, + { + "id": 7, + "name": "Item 7", + "price": "$7", + "amount": 7 + }, + { + "id": 8, + "name": "Item 8", + "price": "$8", + "amount": 39 + }, + { + "id": 9, + "name": "Item 9", + "price": "$9", + "amount": 78 + }, + { + "id": 10, + "name": "Item 10", + "price": "$10", + "amount": 30 + }, + { + "id": 11, + "name": "Item 11", + "price": "$11", + "amount": 32 + }, + { + "id": 12, + "name": "Item 12", + "price": "$12", + "amount": 12 + }, + { + "id": 13, + "name": "Item 13", + "price": "$13", + "amount": 76 + }, + { + "id": 14, + "name": "Item 14", + "price": "$14", + "amount": 10 + }, + { + "id": 15, + "name": "Item 15", + "price": "$15", + "amount": 9 + }, + { + "id": 16, + "name": "Item 16", + "price": "$16", + "amount": 8 + }, + { + "id": 17, + "name": "Item 17", + "price": "$17", + "amount": 1 + }, + { + "id": 18, + "name": "Item 18", + "price": "$18", + "amount": 99 + }, + { + "id": 19, + "name": "Item 19", + "price": "$19", + "amount": 100 + }, + { + "id": 20, + "name": "Item 20", + "price": "$20", + "amount": 109 + } +] diff --git a/assets/pdf/example_pdf.pdf b/assets/pdf/example_pdf.pdf new file mode 100644 index 0000000..b1f80db Binary files /dev/null and b/assets/pdf/example_pdf.pdf differ diff --git a/bin/al-folio b/bin/al-folio new file mode 100644 index 0000000..7972428 --- /dev/null +++ b/bin/al-folio @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +bundle exec al-folio "$@" diff --git a/bin/capture_screenshots.js b/bin/capture_screenshots.js new file mode 100644 index 0000000..230486b --- /dev/null +++ b/bin/capture_screenshots.js @@ -0,0 +1,124 @@ +#!/usr/bin/env node +// Regenerates the screenshots used by README.md. +// +// Run via `.github/workflows/update-screenshots.yml` rather than locally: the +// pages pull webfonts, FontAwesome, Academicons and the GitHub stat-card +// service from external origins, and a screenshot taken somewhere those are +// unreachable silently loses its icons and emoji. CI has unrestricted egress, +// so the shots match what a visitor actually sees. +// +// node bin/capture_screenshots.js [name ...] +// +// Passing one or more names limits the run to those shots. + +const { chromium } = require("playwright"); +const path = require("path"); + +const BASE = (process.argv[2] || "http://127.0.0.1:4000/al-folio").replace(/\/$/, ""); +const OUT = process.argv[3] || "readme_preview"; +const ONLY = process.argv.slice(4); + +// height is the capture viewport, chosen per page so the shot ends on a +// sensible boundary instead of mid-paragraph. Full-page captures were tried and +// render as unreadable ribbons in the README. +const SHOTS = [ + { name: "al-folio-preview", url: "/", theme: "light", height: 900 }, + { name: "light", url: "/", theme: "light", height: 1000 }, + { name: "dark", url: "/", theme: "dark", height: 1000 }, + { name: "cv", url: "/cv/", theme: "light", height: 1100 }, + { name: "people", url: "/people/", theme: "light", height: 950 }, + { name: "publications", url: "/publications/", theme: "light", height: 1100 }, + { name: "projects", url: "/projects/", theme: "light", height: 1000 }, + { name: "blog", url: "/blog/", theme: "light", height: 1100 }, + { name: "repositories", url: "/repositories/", theme: "light", height: 1100, settle: 9000 }, + { name: "distill", url: "/blog/2021/distill/", theme: "light", height: 1100 }, + { name: "math", url: "/blog/2015/math/", theme: "light", height: 1000, settle: 6000 }, + { name: "code", url: "/blog/2015/code/", theme: "light", height: 1000 }, + { name: "jupyter", url: "/blog/2023/jupyter-notebook/", theme: "light", height: 1000 }, + { name: "photos-screenshot", url: "/projects/1_project/", theme: "light", height: 1100, settle: 6000 }, +]; + +(async () => { + const browser = await chromium.launch({ args: ["--no-sandbox"] }); + let failures = 0; + + for (const shot of SHOTS) { + if (ONLY.length && !ONLY.includes(shot.name)) continue; + + const ctx = await browser.newContext({ + viewport: { width: 1280, height: shot.height }, + // Retina capture; GitHub downscales cleanly and the text stays crisp. + deviceScaleFactor: 2, + colorScheme: shot.theme === "dark" ? "dark" : "light", + reducedMotion: "reduce", + }); + + // The theme is driven by localStorage -> data-theme-setting on . + // Setting it before first paint avoids capturing a flash of the wrong theme. + await ctx.addInitScript((t) => { + try { + localStorage.setItem("theme", t); + } catch (e) { + /* private mode */ + } + }, shot.theme); + + const page = await ctx.newPage(); + const failedRequests = []; + // `requestfailed` only covers transport-level failures. A stylesheet or + // webfont that answers 404 or 503 completes normally and never fires it, + // and a missing CSS file is invisible to the broken-image check below β€” so + // watch response status codes too, or the exact degradation this script + // exists to catch slips through. + page.on("requestfailed", (r) => failedRequests.push(`${r.url()} (${(r.failure() || {}).errorText})`)); + page.on("response", (res) => { + if (res.status() >= 400) failedRequests.push(`${res.url()} (HTTP ${res.status()})`); + }); + + try { + await page.goto(BASE + shot.url, { waitUntil: "load", timeout: 60000 }); + } catch (err) { + console.error(`FAIL ${shot.name}: ${err.message.split("\n")[0]}`); + failures++; + await ctx.close(); + continue; + } + + // Let webfonts, MathJax, charts and lazy images settle. + await page.waitForTimeout(shot.settle || 4000); + try { + await page.evaluate(() => document.fonts && document.fonts.ready); + } catch (e) { + /* older engines */ + } + + // A screenshot missing its icons or emoji is worse than a stale one, so + // surface that here instead of letting it land in the README unnoticed. + const broken = await page.evaluate(() => + Array.from(document.images) + .filter((img) => img.complete && img.naturalWidth === 0) + .map((img) => img.src) + ); + + await page.screenshot({ path: path.join(OUT, `${shot.name}.png`) }); + + const notes = []; + if (broken.length) notes.push(`${broken.length} broken image(s): ${broken.slice(0, 3).join(", ")}`); + if (failedRequests.length) notes.push(`${failedRequests.length} failed request(s): ${failedRequests.slice(0, 3).join(", ")}`); + if (notes.length) { + console.error(`WARN ${shot.name}: ${notes.join(" | ")}`); + failures++; + } else { + console.log(`OK ${shot.name}`); + } + + await ctx.close(); + } + + await browser.close(); + + if (failures) { + console.error(`\n${failures} shot(s) rendered with missing assets. Not treating these as usable.`); + process.exit(1); + } +})(); diff --git a/bin/cibuild b/bin/cibuild new file mode 100644 index 0000000..d5c9e19 --- /dev/null +++ b/bin/cibuild @@ -0,0 +1 @@ +bundle exec jekyll build diff --git a/bin/copy-viz.sh b/bin/copy-viz.sh new file mode 100644 index 0000000..bedd1da --- /dev/null +++ b/bin/copy-viz.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# Copy the interactive visualizations into the built site verbatim. +# +# interactive-visualization/ is excluded from the Jekyll source (see _config.yml) +# because it is hand-written x3dom markup alongside ~218 MB of .glb models: +# terser/minifier would rewrite the 3D scene markup, and Jekyll would re-copy the +# whole tree on every build. Run this AFTER purgecss so it cannot strip the CSS +# those pages rely on. +set -euo pipefail +SITE="${1:-_site}" +mkdir -p "$SITE/interactive-visualization" +cp -r interactive-visualization/. "$SITE/interactive-visualization/" +echo "copied interactive-visualization -> $SITE/" diff --git a/bin/deploy b/bin/deploy new file mode 100644 index 0000000..7e1df85 --- /dev/null +++ b/bin/deploy @@ -0,0 +1,119 @@ +#!/usr/bin/env bash + +# Run this script to deploy the app to Github Pages + +# Parse cmd arguments + +SRC_BRANCH="main" +DEPLOY_BRANCH="gh-pages" + +USAGE_MSG="usage: deploy [-h|--help] [-u|--user] [-s|--src SRC_BRANCH] [-d|--deploy DEPLOY_BRANCH] [--verbose] [--no-push]" + +while [[ $# > 0 ]]; do + key="$1" + + case $key in + -h|--help) + echo $USAGE_MSG + exit 0 + ;; + -u|--user) + ;; + -s|--src) + SRC_BRANCH="$2" + shift + ;; + -d|--deploy) + DEPLOY_BRANCH="$2" + shift + ;; + --verbose) + set -x + ;; + --no-push) + NO_PUSH="--no-push" + ;; + *) + echo "Option $1 is unknown." >&2 + echo $USAGE_MSG >&2 + exit 1 + ;; + esac + shift +done + +# Exit if any subcommand fails +set -e + +echo "Deploying..." +echo "Source branch: $SRC_BRANCH" +echo "Deploy branch: $DEPLOY_BRANCH" + +read -r -p "Do you want to proceed? [y/N] " response +if [[ ! $response =~ ^([yY][eE][sS]|[yY])+$ ]] +then + echo "Aborting." + [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 +fi + +# Check if there are any uncommitted changes +if ! git diff-index --quiet HEAD --; then + echo "Changes to the following files are uncommitted:" + git diff-index --name-only HEAD -- + echo "Please commit the changes before proceeding." + echo "Aborting." + [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 +fi + +# Check if there are any untracked files +if ! test -z "$(git ls-files --exclude-standard --others)"; then + echo "There are untracked files:" + git ls-files --exclude-standard --others + echo "Please commit those files or stash them before proceeding." + echo "Aborting." + [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 +fi + +# Switch to source branch (creates it if necessary from the current branch) +if [ `git branch | grep $SRC_BRANCH | tr ' ' '\n' | tail -1` ] +then + git checkout $SRC_BRANCH +else + git checkout -b $SRC_BRANCH +fi + +# Checkout DEPLOY_BRANCH branch +if [ `git branch | grep $DEPLOY_BRANCH` ] +then + git branch -D $DEPLOY_BRANCH +fi +git checkout -b $DEPLOY_BRANCH + +# Export JEKYLL_ENV=production +export JEKYLL_ENV=production + +# Build site +bundle exec jekyll build + +# Purge unused css +purgecss -c purgecss.config.js + +# Delete and move files +find . -maxdepth 1 ! -name '_site' ! -name '.git' ! -name 'CNAME' ! -name '.gitignore' -exec rm -rf {} \; +mv _site/* . +rm -R _site/ + +# Create `.nojekyll` file (bypass GitHub Pages Jekyll processing) +touch .nojekyll + +# Push to DEPLOY_BRANCH +git add -fA +git commit --allow-empty -m "$(git log -1 --pretty=%B) [ci skip]" +[[ ${NO_PUSH} ]] || git push -f -q origin $DEPLOY_BRANCH + +# Move back to SRC_BRANCH +git checkout $SRC_BRANCH + +echo "Deployed successfully!" + +exit 0 diff --git a/bin/entry_point.sh b/bin/entry_point.sh new file mode 100644 index 0000000..d937f1d --- /dev/null +++ b/bin/entry_point.sh @@ -0,0 +1,50 @@ +#!/bin/bash +set -euo pipefail + +echo "Entry point script running" + +CONFIG_FILE=_config.yml +DOCKER_DESTINATION=/tmp/_site + +# Function to manage Gemfile.lock +manage_gemfile_lock() { + git config --global --add safe.directory /srv/jekyll + if command -v git &> /dev/null && [ -f Gemfile.lock ]; then + if git ls-files --error-unmatch Gemfile.lock &> /dev/null; then + echo "Gemfile.lock is tracked by git, keeping it intact" + git restore Gemfile.lock 2>/dev/null || true + else + echo "Gemfile.lock is not tracked by git, removing it" + rm Gemfile.lock + fi + fi +} + +ensure_bundle_deps() { + if bundle check >/dev/null 2>&1; then + echo "Bundler dependencies already satisfied" + return + fi + + echo "Installing missing bundler dependencies" + bundle install --jobs 4 --retry 3 +} + +start_jekyll() { + manage_gemfile_lock + ensure_bundle_deps + mkdir -p "$DOCKER_DESTINATION" + bundle exec jekyll serve --watch --port=8080 --host=0.0.0.0 --livereload --verbose --trace --force_polling --destination "$DOCKER_DESTINATION" --config "$CONFIG_FILE" & +} + +start_jekyll + +while true; do + inotifywait -q -e modify,move,create,delete $CONFIG_FILE + if [ $? -eq 0 ]; then + echo "Change detected to $CONFIG_FILE, restarting Jekyll" + jekyll_pid=$(pgrep -f jekyll) + kill -KILL $jekyll_pid + start_jekyll + fi +done diff --git a/bin/generate_star_history.py b/bin/generate_star_history.py new file mode 100644 index 0000000..3fd3d76 --- /dev/null +++ b/bin/generate_star_history.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python3 +"""Render the repository's star history to committed SVGs. + +al-folio used to hotlink api.star-history.com. That service began returning +HTTP 500 for every repository, and its UI now asks visitors to paste a GitHub +token with `Contents: read and write` β€” a permission that can push code and is +not required to read public star data. This script removes the dependency: the +stargazer timestamps it needs are public, so the chart is generated here and +committed as a static asset that cannot fail to load or prompt for anything. + +Two files are written, light and dark, because GitHub's README renderer picks +between them with + prefers-color-scheme. A single SVG using an +internal media query does not work reliably through GitHub's image proxy. + +Usage: + python3 bin/generate_star_history.py [--repo owner/name] [--out-dir DIR] + +GITHUB_TOKEN is optional but strongly recommended: unauthenticated API access +is capped at 60 requests/hour, which is not enough for a repository with more +than a few thousand stars. +""" + +from __future__ import annotations + +import argparse +import json +import math +import os +import sys +import urllib.error +import urllib.request +from datetime import datetime, timezone + +API = "https://api.github.com" +PER_PAGE = 100 +# GitHub refuses to paginate past 400 pages on this endpoint. +MAX_PAGE = 400 +# How many pages to sample across the full range. The curve is smooth enough +# that sampling beats fetching all ~160 pages of a 16k-star repo on every push. +SAMPLES = 28 + +THEMES = { + "light": { + "bg": "#ffffff", + "text": "#000000", + "muted": "#828282", + "grid": "rgba(0,0,0,0.10)", + "accent": "#b509ac", + "fill_from": "rgba(181,9,172,0.28)", + "fill_to": "rgba(181,9,172,0.02)", + }, + "dark": { + "bg": "#1c1c1d", + "text": "#e8e8e8", + "muted": "#828282", + "grid": "#424246", + "accent": "#d94fd0", + "fill_from": "rgba(217,79,208,0.32)", + "fill_to": "rgba(217,79,208,0.02)", + }, +} + +FONT = ( + "-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue'," + "Arial,sans-serif" +) + +W, H = 820, 420 +M_L, M_R, M_T, M_B = 68, 28, 64, 48 + + +def _get(url: str, token: str | None, accept: str) -> tuple[object, dict]: + req = urllib.request.Request(url, headers={"Accept": accept, "User-Agent": "al-folio-star-history"}) + if token: + req.add_header("Authorization", f"Bearer {token}") + try: + with urllib.request.urlopen(req, timeout=30) as resp: + return json.loads(resp.read().decode()), dict(resp.headers) + except urllib.error.HTTPError as exc: + detail = exc.read().decode(errors="replace")[:200] + if exc.code == 403 and "rate limit" in detail.lower(): + raise SystemExit( + "GitHub API rate limit hit. Set GITHUB_TOKEN " + "(in Actions, pass secrets.GITHUB_TOKEN) and retry." + ) from exc + raise SystemExit(f"GET {url} failed: HTTP {exc.code}: {detail}") from exc + + +def fetch_points(repo: str, token: str | None) -> tuple[list[tuple[datetime, int]], int, bool]: + """Return ([(date, cumulative_stars)], total, truncated_by_pagination_cap).""" + meta, _ = _get(f"{API}/repos/{repo}", token, "application/vnd.github+json") + total = int(meta.get("stargazers_count", 0)) + if total == 0: + return [], 0, False + + last_page = min(math.ceil(total / PER_PAGE), MAX_PAGE) + if last_page <= SAMPLES: + pages = list(range(1, last_page + 1)) + else: + step = (last_page - 1) / (SAMPLES - 1) + pages = sorted({1, last_page} | {round(1 + i * step) for i in range(SAMPLES)}) + + star_accept = "application/vnd.github.star+json" + points: list[tuple[datetime, int]] = [] + newest: datetime | None = None + + for page in pages: + url = f"{API}/repos/{repo}/stargazers?per_page={PER_PAGE}&page={page}" + batch, _ = _get(url, token, star_accept) + if not isinstance(batch, list) or not batch: + continue + first = batch[0].get("starred_at") + if first: + # Everything on earlier pages was starred before this entry. + points.append((_parse(first), (page - 1) * PER_PAGE + 1)) + if page == last_page: + last = batch[-1].get("starred_at") + if last: + newest = _parse(last) + points.append((newest, (page - 1) * PER_PAGE + len(batch))) + + # GitHub stops paginating this endpoint at page 400, so for a repository + # with more than 40,000 stars we cannot observe when the later ones arrived. + capped = last_page >= MAX_PAGE and total > MAX_PAGE * PER_PAGE + + if capped: + # Back-dating the full total onto the last *observable* star would draw a + # vertical cliff at that old date and freeze the x-axis there, inventing + # history that was never measured. The current total on today's date is a + # fact, so anchor there and let the segment between be interpolated, the + # same approximation already used between every other sampled point. + # Truncated to midnight so reruns within a day stay byte-identical. + now = datetime.now(timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0) + points.append((now, total)) + elif newest and total > points[-1][1]: + # Dated to the most recent star rather than "now", so a run on a day with + # no new stars produces a byte-identical file instead of a junk commit. + points.append((newest, total)) + + points.sort(key=lambda p: p[0]) + deduped: list[tuple[datetime, int]] = [] + for date, count in points: + if deduped and date == deduped[-1][0]: + deduped[-1] = (date, max(count, deduped[-1][1])) + else: + deduped.append((date, count)) + return deduped, total, capped + + +def _parse(value: str) -> datetime: + return datetime.strptime(value, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=timezone.utc) + + +def _nice_ceiling(value: int) -> tuple[int, int]: + """Round an axis maximum up to something a human would pick.""" + if value <= 10: + return max(value, 1), max(value, 1) + magnitude = 10 ** (len(str(value)) - 1) + for mult in (1, 2, 2.5, 5, 10): + step = magnitude * mult / 2 + top = math.ceil(value / step) * step + if top / step <= 5: + return int(top), int(step) + return value, max(1, value // 4) + + +def _fmt_count(n: int) -> str: + if n >= 1000: + text = f"{n / 1000:.1f}".rstrip("0").rstrip(".") + return f"{text}k" + return str(n) + + +def _smooth_path(pts: list[tuple[float, float]]) -> str: + """Catmull-Rom through the points, emitted as cubic beziers.""" + if len(pts) < 2: + return "" + if len(pts) == 2: + return f"M {pts[0][0]:.2f},{pts[0][1]:.2f} L {pts[1][0]:.2f},{pts[1][1]:.2f}" + d = [f"M {pts[0][0]:.2f},{pts[0][1]:.2f}"] + for i in range(len(pts) - 1): + p0 = pts[i - 1] if i > 0 else pts[0] + p1, p2 = pts[i], pts[i + 1] + p3 = pts[i + 2] if i + 2 < len(pts) else p2 + c1 = (p1[0] + (p2[0] - p0[0]) / 6, p1[1] + (p2[1] - p0[1]) / 6) + c2 = (p2[0] - (p3[0] - p1[0]) / 6, p2[1] - (p3[1] - p1[1]) / 6) + d.append(f"C {c1[0]:.2f},{c1[1]:.2f} {c2[0]:.2f},{c2[1]:.2f} {p2[0]:.2f},{p2[1]:.2f}") + return " ".join(d) + + +def render(points: list[tuple[datetime, int]], total: int, repo: str, theme: str, capped: bool = False) -> str: + t = THEMES[theme] + plot_w, plot_h = W - M_L - M_R, H - M_T - M_B + t0, t1 = points[0][0].timestamp(), points[-1][0].timestamp() + span = max(t1 - t0, 1) + y_max, y_step = _nice_ceiling(total) + + def sx(dt: datetime) -> float: + return M_L + (dt.timestamp() - t0) / span * plot_w + + def sy(count: int) -> float: + return M_T + plot_h - (count / y_max) * plot_h + + xy = [(sx(d), sy(c)) for d, c in points] + line = _smooth_path(xy) + area = f"{line} L {xy[-1][0]:.2f},{M_T + plot_h:.2f} L {xy[0][0]:.2f},{M_T + plot_h:.2f} Z" + + grid, y_labels = [], [] + v = 0 + while v <= y_max: + y = sy(v) + grid.append(f'') + y_labels.append( + f'{_fmt_count(v)}' + ) + v += y_step + + # Tick on calendar years across the whole range, not on sampled points: + # early years are all inside page 1, so point-derived ticks skip them and + # the axis reads as though data were missing. + first_year, last_year = points[0][0].year, points[-1][0].year + every = max(1, math.ceil((last_year - first_year + 1) / 12)) + years = [ + datetime(y, 1, 1, tzinfo=timezone.utc) + for y in range(first_year, last_year + 1) + if (y - first_year) % every == 0 + ] + # Drop a tick that would collide with the axis edges. + years = [d for d in years if M_L - 1 <= sx(d) <= W - M_R + 1] + x_labels = [ + f'{d.year}' + for d in years + ] + + # Say so rather than passing off an interpolated segment as measured data. + subtitle = ( + f"{repo} Β· beyond {MAX_PAGE * PER_PAGE:,} stars the API stops paginating, so the tail is interpolated" + if capped + else repo + ) + + lx, ly = xy[-1] + uid = theme # keeps gradient ids unique if both files are ever inlined together + + return f""" + Star history for {repo} + + + + + + + + + + + + Star History + {subtitle} + β˜… {total:,} + +{chr(10).join(" " + g for g in grid)} + + +{chr(10).join(" " + lbl for lbl in y_labels)} + + +{chr(10).join(" " + lbl for lbl in x_labels)} + + + + + + + + +""" + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--repo", default="alshedivat/al-folio") + ap.add_argument("--out-dir", default="assets/img") + args = ap.parse_args() + + token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN") + if not token: + print("warning: no GITHUB_TOKEN set; 60 req/hour limit may not suffice", file=sys.stderr) + + points, total, capped = fetch_points(args.repo, token) + if len(points) < 2: + print(f"error: not enough stargazer data for {args.repo} (got {len(points)} points)", file=sys.stderr) + return 1 + + os.makedirs(args.out_dir, exist_ok=True) + for theme in THEMES: + path = os.path.join(args.out_dir, f"star-history-{theme}.svg") + with open(path, "w", encoding="utf-8") as fh: + fh.write(render(points, total, args.repo, theme, capped)) + print(f"wrote {path}") + note = " [truncated by API page cap; tail interpolated]" if capped else "" + print(f"{total:,} stars, {len(points)} sampled points, {points[0][0].date()} to {points[-1][0].date()}{note}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/bin/setup-python-deps b/bin/setup-python-deps new file mode 100644 index 0000000..065cceb --- /dev/null +++ b/bin/setup-python-deps @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Installing optional Python deps for jekyll-jupyter-notebook..." +python3 -m pip install --user --break-system-packages jupyter nbconvert + +echo +echo "If your shell cannot find jupyter binaries, add this to your shell profile:" +echo ' export PATH="$HOME/Library/Python/3.14/bin:$PATH"' diff --git a/bin/update_scholar_citations.py b/bin/update_scholar_citations.py new file mode 100644 index 0000000..1c4f57c --- /dev/null +++ b/bin/update_scholar_citations.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python + +import os +import sys +import yaml +from datetime import datetime +from scholarly import scholarly + + +def load_scholar_user_id() -> str: + """Load the Google Scholar user ID from the configuration file.""" + config_file = "_data/socials.yml" + if not os.path.exists(config_file): + print( + f"Configuration file {config_file} not found. Please ensure the file exists and contains your Google Scholar user ID." + ) + sys.exit(1) + try: + with open(config_file, "r") as f: + config = yaml.safe_load(f) + scholar_user_id = config.get("scholar_userid") + if not scholar_user_id: + print( + "No 'scholar_userid' found in the configuration file. Please add 'scholar_userid' to _data/socials.yml." + ) + sys.exit(1) + return scholar_user_id + except yaml.YAMLError as e: + print( + f"Error parsing YAML file {config_file}: {e}. Please check the file for correct YAML syntax." + ) + sys.exit(1) + + +SCHOLAR_USER_ID: str = load_scholar_user_id() +OUTPUT_FILE: str = "_data/citations.yml" + + +def get_scholar_citations() -> None: + """Fetch and update Google Scholar citation data.""" + print(f"Fetching citations for Google Scholar ID: {SCHOLAR_USER_ID}") + today = datetime.now().strftime("%Y-%m-%d") + + # Check if the output file was already updated today + if os.path.exists(OUTPUT_FILE): + try: + with open(OUTPUT_FILE, "r") as f: + existing_data = yaml.safe_load(f) + if ( + existing_data + and "metadata" in existing_data + and "last_updated" in existing_data["metadata"] + ): + print(f"Last updated on: {existing_data['metadata']['last_updated']}") + if existing_data["metadata"]["last_updated"] == today: + print("Citations data is already up-to-date. Skipping fetch.") + return + except Exception as e: + print( + f"Warning: Could not read existing citation data from {OUTPUT_FILE}: {e}. The file may be missing or corrupted." + ) + + citation_data = {"metadata": {"last_updated": today}, "papers": {}} + + scholarly.set_timeout(15) + scholarly.set_retries(3) + try: + author = scholarly.search_author_id(SCHOLAR_USER_ID) + author_data = scholarly.fill(author) + except Exception as e: + print( + f"Error fetching author data from Google Scholar for user ID '{SCHOLAR_USER_ID}': {e}. Please check your internet connection and Scholar user ID." + ) + sys.exit(1) + + if not author_data: + print( + f"Could not fetch author data for user ID '{SCHOLAR_USER_ID}'. Please verify the Scholar user ID and try again." + ) + sys.exit(1) + + if "publications" not in author_data: + print(f"No publications found in author data for user ID '{SCHOLAR_USER_ID}'.") + sys.exit(1) + + for pub in author_data["publications"]: + try: + pub_id = pub.get("pub_id") or pub.get("author_pub_id") + if not pub_id: + print( + f"Warning: No ID found for publication: {pub.get('bib', {}).get('title', 'Unknown')}. This publication will be skipped." + ) + continue + + title = pub.get("bib", {}).get("title", "Unknown Title") + year = pub.get("bib", {}).get("pub_year", "Unknown Year") + citations = pub.get("num_citations", 0) + + print(f"Found: {title} ({year}) - Citations: {citations}") + + citation_data["papers"][pub_id] = { + "title": title, + "year": year, + "citations": citations, + } + except Exception as e: + print( + f"Error processing publication '{pub.get('bib', {}).get('title', 'Unknown')}': {e}. This publication will be skipped." + ) + + # Compare new data with existing data + if existing_data and existing_data.get("papers") == citation_data["papers"]: + print("No changes in citation data. Skipping file update.") + return + + try: + with open(OUTPUT_FILE, "w") as f: + yaml.dump(citation_data, f, width=1000, sort_keys=True) + print(f"Citation data saved to {OUTPUT_FILE}") + except Exception as e: + print( + f"Error writing citation data to {OUTPUT_FILE}: {e}. Please check file permissions and disk space." + ) + sys.exit(1) + + +if __name__ == "__main__": + try: + get_scholar_citations() + except Exception as e: + print(f"Unexpected error: {e}") + sys.exit(1) diff --git a/docker-compose-slim.yml b/docker-compose-slim.yml new file mode 100644 index 0000000..3bd4f46 --- /dev/null +++ b/docker-compose-slim.yml @@ -0,0 +1,12 @@ +# this file uses prebuilt image in dockerhub +services: + jekyll: + image: amirpourmand/al-folio:slim + #build: . + ports: + - 8080:8080 + - 35729:35729 + volumes: + - .:/srv/jekyll + environment: + - JEKYLL_ENV=development diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..28adda3 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +# this file uses prebuilt image in dockerhub +services: + jekyll: + image: amirpourmand/al-folio:latest + build: . + command: /srv/jekyll/bin/entry_point.sh + # uncomment these if you are having this issue with the build: + # /usr/local/bundle/gems/jekyll-4.3.4/lib/jekyll/site.rb:509:in `initialize': Permission denied @ rb_sysopen - /srv/jekyll/.jekyll-cache/.gitignore (Errno::EACCES) + # and fill the args values with the output of the commands on the right + # build: + # args: + # GROUPID: # id -g + # GROUPNAME: # id -gn + # USERID: # id -u + # USERNAME: # echo $USER + ports: + - 8080:8080 + - 35729:35729 + volumes: + - .:/srv/jekyll + environment: + - JEKYLL_ENV=development diff --git a/index.html b/index.html deleted file mode 100644 index 29e70a5..0000000 --- a/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - IDOpt Lab - - - - - - - - -
- -
- -
-

Intelligent Design Optimization Lab

-

IDOpt Lab

-

We work on advancing the science and practice of engineering design — improving how complex engineering systems are conceived, analyzed, and optimized. Aircraft are the prime example: shaped by the missions they fly and the environments they operate in, spanning aerodynamics, propulsion and structures at once, and held to rigorous certification standards. We develop the methods, algorithms, and software to address those challenges.

-
- -
- - -
- - - - - diff --git a/openalex_authors.json b/openalex_authors.json new file mode 100644 index 0000000..237e929 --- /dev/null +++ b/openalex_authors.json @@ -0,0 +1 @@ +{"meta": {"count": 2, "db_response_time_ms": 45, "page": 1, "per_page": 10, "groups_count": null, "x_query": {"oql": "authors where text has (Darshan Sarojini)", "oqo": {"get_rows": "authors", "filter_rows": [{"column_id": "text.search", "value": "Darshan Sarojini", "operator": "has"}]}, "url": "/authors?filter=text.search:Darshan Sarojini&per_page=10"}, "cost_usd": 0.001}, "results": [{"id": "https://openalex.org/A5012988947", "orcid": "https://orcid.org/0000-0003-4910-3505", "display_name": "Darshan Sarojini", "raw_author_names": ["Darshan Sarojini", "Sarojini, Darshan"], "full_name": "Sarojini, Darshan", "relevance_score": 3693.1753, "works_count": 56, "cited_by_count": 348, "summary_stats": {"2yr_mean_citedness": 3.0, "h_index": 12, "i10_index": 16}, "ids": {"openalex": "https://openalex.org/A5012988947", "orcid": "https://orcid.org/0000-0003-4910-3505"}, "affiliations": [{"institution": {"id": "https://openalex.org/I130701444", "ror": "https://ror.org/01zkghx44", "display_name": "Georgia Institute of Technology", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I130701444"]}, "years": [2023, 2022, 2021, 2020, 2019, 2018, 2017]}, {"institution": {"id": "https://openalex.org/I36258959", "ror": "https://ror.org/0168r3w48", "display_name": "University of California San Diego", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I36258959"]}, "years": [2024, 2023]}, {"institution": {"id": "https://openalex.org/I4210150894", "ror": "https://ror.org/05pmj3x43", "display_name": "Jacobs (United States)", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I4210150894"]}, "years": [2023]}, {"institution": {"id": "https://openalex.org/I59270414", "ror": "https://ror.org/04dese585", "display_name": "Indian Institute of Science Bangalore", "country_code": "IN", "type": "education", "lineage": ["https://openalex.org/I59270414"]}, "years": [2016]}, {"institution": {"id": "https://openalex.org/I859038795", "ror": "https://ror.org/02smfhw86", "display_name": "Virginia Tech", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I859038795"]}, "years": [2026, 2025]}], "last_known_institutions": [{"id": "https://openalex.org/I859038795", "ror": "https://ror.org/02smfhw86", "display_name": "Virginia Tech", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I859038795"]}], "topics": [{"id": "https://openalex.org/T11524", "display_name": "Advanced Aircraft Design and Technologies", "count": 28, "subfield": {"id": "https://openalex.org/subfields/2306", "display_name": "Global and Planetary Change"}, "field": {"id": "https://openalex.org/fields/23", "display_name": "Environmental Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T10928", "display_name": "Probabilistic and Robust Engineering Design", "count": 13, "subfield": {"id": "https://openalex.org/subfields/1804", "display_name": "Statistics, Probability and Uncertainty"}, "field": {"id": "https://openalex.org/fields/18", "display_name": "Decision Sciences"}, "domain": {"id": "https://openalex.org/domains/2", "display_name": "Social Sciences"}}, {"id": "https://openalex.org/T12125", "display_name": "Aerospace and Aviation Technology", "count": 10, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T11096", "display_name": "Aeroelasticity and Vibration Control", "count": 9, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T10173", "display_name": "Computational Fluid Dynamics and Aerodynamics", "count": 8, "subfield": {"id": "https://openalex.org/subfields/2206", "display_name": "Computational Mechanics"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}], "topic_share": [{"id": "https://openalex.org/T11524", "display_name": "Advanced Aircraft Design and Technologies", "value": 0.0003777, "subfield": {"id": "https://openalex.org/subfields/2306", "display_name": "Global and Planetary Change"}, "field": {"id": "https://openalex.org/fields/23", "display_name": "Environmental Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T11096", "display_name": "Aeroelasticity and Vibration Control", "value": 0.000158, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T12125", "display_name": "Aerospace and Aviation Technology", "value": 9.99e-05, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T11489", "display_name": "Air Traffic Management and Optimization", "value": 6.89e-05, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T10928", "display_name": "Probabilistic and Robust Engineering Design", "value": 6.84e-05, "subfield": {"id": "https://openalex.org/subfields/1804", "display_name": "Statistics, Probability and Uncertainty"}, "field": {"id": "https://openalex.org/fields/18", "display_name": "Decision Sciences"}, "domain": {"id": "https://openalex.org/domains/2", "display_name": "Social Sciences"}}], "x_concepts": [{"id": "41008148", "wikidata": "https://www.wikidata.org/wiki/Q21198", "display_name": "Computer science", "score": 0.7001707553863525}, {"id": "66938386", "wikidata": "https://www.wikidata.org/wiki/Q633538", "display_name": "Structural engineering", "score": 0.650162935256958}, {"id": "146978453", "wikidata": "https://www.wikidata.org/wiki/Q3798668", "display_name": "Aerospace engineering", "score": 0.6043165922164917}, {"id": "127413603", "wikidata": "https://www.wikidata.org/wiki/Q11023", "display_name": "Engineering", "score": 0.5659967660903931}, {"id": "33923547", "wikidata": "https://www.wikidata.org/wiki/Q395", "display_name": "Mathematics", "score": 0.3466168940067291}], "counts_by_year": [{"year": 2016, "works_count": 1, "oa_works_count": 0, "cited_by_count": 21}, {"year": 2017, "works_count": 3, "oa_works_count": 0, "cited_by_count": 24}, {"year": 2018, "works_count": 4, "oa_works_count": 0, "cited_by_count": 31}, {"year": 2019, "works_count": 3, "oa_works_count": 0, "cited_by_count": 11}, {"year": 2020, "works_count": 7, "oa_works_count": 2, "cited_by_count": 17}, {"year": 2021, "works_count": 7, "oa_works_count": 0, "cited_by_count": 73}, {"year": 2022, "works_count": 8, "oa_works_count": 2, "cited_by_count": 44}, {"year": 2023, "works_count": 13, "oa_works_count": 4, "cited_by_count": 97}, {"year": 2024, "works_count": 2, "oa_works_count": 0, "cited_by_count": 24}, {"year": 2025, "works_count": 3, "oa_works_count": 1, "cited_by_count": 5}, {"year": 2026, "works_count": 5, "oa_works_count": 0, "cited_by_count": 1}], "display_name_alternatives": ["Darshan Sarojini", "Sarojini, Darshan"], "block_key": "d sarojini", "works_api_url": "https://api.openalex.org/works?filter=author.id:A5012988947", "updated_date": "2026-08-13T12:28:56", "created_date": "2022-06-17T00:00:00"}, {"id": "https://openalex.org/A5054309691", "orcid": null, "display_name": "B. K. Sarojini M .K. Ramakrishna C. G. Darshan Raj", "raw_author_names": ["B. K. Sarojini M .K. Ramakrishna C. G. Darshan Raj"], "full_name": "B. K. Sarojini M .K. Ramakrishna C. G. Darshan Raj", "relevance_score": 141.13535, "works_count": 1, "cited_by_count": 1, "summary_stats": {"2yr_mean_citedness": 0.0, "h_index": 1, "i10_index": 0}, "ids": {"openalex": "https://openalex.org/A5054309691", "orcid": null}, "affiliations": [], "last_known_institutions": null, "topics": [{"id": "https://openalex.org/T10875", "display_name": "Pesticide Exposure and Toxicity", "count": 1, "subfield": {"id": "https://openalex.org/subfields/1110", "display_name": "Plant Science"}, "field": {"id": "https://openalex.org/fields/11", "display_name": "Agricultural and Biological Sciences"}, "domain": {"id": "https://openalex.org/domains/1", "display_name": "Life Sciences"}}, {"id": "https://openalex.org/T11319", "display_name": "Curcumin's Biomedical Applications", "count": 1, "subfield": {"id": "https://openalex.org/subfields/1313", "display_name": "Molecular Medicine"}, "field": {"id": "https://openalex.org/fields/13", "display_name": "Biochemistry, Genetics and Molecular Biology"}, "domain": {"id": "https://openalex.org/domains/1", "display_name": "Life Sciences"}}, {"id": "https://openalex.org/T13023", "display_name": "Synthesis of Organic Compounds", "count": 1, "subfield": {"id": "https://openalex.org/subfields/2736", "display_name": "Pharmacology"}, "field": {"id": "https://openalex.org/fields/27", "display_name": "Medicine"}, "domain": {"id": "https://openalex.org/domains/4", "display_name": "Health Sciences"}}], "topic_share": [{"id": "https://openalex.org/T11319", "display_name": "Curcumin's Biomedical Applications", "value": 1.87e-05, "subfield": {"id": "https://openalex.org/subfields/1313", "display_name": "Molecular Medicine"}, "field": {"id": "https://openalex.org/fields/13", "display_name": "Biochemistry, Genetics and Molecular Biology"}, "domain": {"id": "https://openalex.org/domains/1", "display_name": "Life Sciences"}}, {"id": "https://openalex.org/T13023", "display_name": "Synthesis of Organic Compounds", "value": 8.4e-06, "subfield": {"id": "https://openalex.org/subfields/2736", "display_name": "Pharmacology"}, "field": {"id": "https://openalex.org/fields/27", "display_name": "Medicine"}, "domain": {"id": "https://openalex.org/domains/4", "display_name": "Health Sciences"}}, {"id": "https://openalex.org/T10875", "display_name": "Pesticide Exposure and Toxicity", "value": 7.8e-06, "subfield": {"id": "https://openalex.org/subfields/1110", "display_name": "Plant Science"}, "field": {"id": "https://openalex.org/fields/11", "display_name": "Agricultural and Biological Sciences"}, "domain": {"id": "https://openalex.org/domains/1", "display_name": "Life Sciences"}}], "x_concepts": [{"id": "111337013", "wikidata": "https://www.wikidata.org/wiki/Q2737837", "display_name": "Irradiation", "score": 0.5287938714027405}, {"id": "111771559", "wikidata": "https://www.wikidata.org/wiki/Q66295", "display_name": "Derivative (finance)", "score": 0.51905757188797}, {"id": "120665830", "wikidata": "https://www.wikidata.org/wiki/Q14620", "display_name": "Optics", "score": 0.1700924038887024}, {"id": "104317684", "wikidata": "https://www.wikidata.org/wiki/Q7187", "display_name": "Gene", "score": 0.06107237935066223}, {"id": "106159729", "wikidata": "https://www.wikidata.org/wiki/Q2294553", "display_name": "Financial economics", "score": 0.0}], "counts_by_year": [{"year": 2015, "works_count": 1, "oa_works_count": 1, "cited_by_count": 1}], "display_name_alternatives": ["B. K. Sarojini M .K. Ramakrishna C. G. Darshan Raj"], "block_key": "b raj", "works_api_url": "https://api.openalex.org/works?filter=author.id:A5054309691", "updated_date": "2026-07-16T12:16:06", "created_date": "2025-10-10T00:00:00"}], "group_by": []} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ab1daf4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,191 @@ +{ + "name": "al-folio", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@playwright/test": "^1.56.1", + "@shopify/prettier-plugin-liquid": "^1.10.0", + "pixelmatch": "^7.1.0", + "pngjs": "^7.0.0", + "prettier": "^3.8.0" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@shopify/liquid-html-parser": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@shopify/liquid-html-parser/-/liquid-html-parser-2.9.0.tgz", + "integrity": "sha512-bkI4tLbU47YUxpgbMa9fgeJjFEMvRNEFL644Yk0ZKo5H1IRzU4pPyCQ6PkGvb0JJnt7OZ+RDGvb6ZLCnAR2Z/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "line-column": "^1.0.2", + "ohm-js": "^17.0.0" + } + }, + "node_modules/@shopify/prettier-plugin-liquid": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@shopify/prettier-plugin-liquid/-/prettier-plugin-liquid-1.10.0.tgz", + "integrity": "sha512-csHYjwuT34o8ja6EY0dUBYQS5UVwsKwRYxGiuG816Ov0B8lVd8FUjOwWUk2SnrNx3cGgL0no7z+Byapp7sC1Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shopify/liquid-html-parser": "^2.9.0", + "html-styles": "^1.0.0" + }, + "peerDependencies": { + "prettier": "^2.0.0 || ^3.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/html-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/html-styles/-/html-styles-1.0.0.tgz", + "integrity": "sha512-cDl5dcj73oI4Hy0DSUNh54CAwslNLJRCCoO+RNkVo+sBrjA/0+7E/xzvj3zH/GxbbBLGJhE0hBe1eg+0FINC6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + } + }, + "node_modules/ohm-js": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/ohm-js/-/ohm-js-17.3.0.tgz", + "integrity": "sha512-LySMdjweN1hKBMMV8lM44+1wiewkndDNNJxtgVAscs7y683MXCdQZLsIaw64/p8NuqYbKOWZoHIOA5DU/xchoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.1" + } + }, + "node_modules/pixelmatch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", + "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", + "dev": true, + "license": "ISC", + "dependencies": { + "pngjs": "^7.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/prettier": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f2d223e --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "scripts": { + "lint:prettier": "prettier . --check", + "lint:style-contract": "node test/style_contract.js", + "test:visual": "playwright test --config test/visual/playwright.config.js", + "test:visual:update": "playwright test --config test/visual/playwright.config.js --update-snapshots" + }, + "devDependencies": { + "@playwright/test": "^1.56.1", + "@shopify/prettier-plugin-liquid": "^1.10.0", + "pixelmatch": "^7.1.0", + "pngjs": "^7.0.0", + "prettier": "^3.8.0" + } +} diff --git a/purgecss.config.js b/purgecss.config.js new file mode 100644 index 0000000..207a674 --- /dev/null +++ b/purgecss.config.js @@ -0,0 +1,27 @@ +module.exports = { + content: ["_site/**/*.html", "_site/**/*.js"], + css: ["_site/assets/css/*.css"], + output: "_site/assets/css/", + skippedContentGlobs: ["_site/assets/**/*.html"], + safelist: [ + "collapse", + "collapsing", + "show", + "dropdown-menu", + "dropdown-item", + "table", + "table-dark", + "table-hover", + "table-responsive", + "af-tooltip", + "af-popover", + "font-weight-bold", + "font-weight-medium", + "font-weight-lighter", + // medium-zoom injects these at runtime, so they never appear in the static + // HTML PurgeCSS scans; without them the zoom overlay's z-index rule is purged + // and page chrome (scroll-progress bar, ToC) bleeds through a zoomed image. + "medium-zoom-overlay", + "medium-zoom-image--opened", + ], +}; diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1e9a533 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +nbconvert +pyyaml +rendercv[full] +scholarly diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..a450fbe --- /dev/null +++ b/robots.txt @@ -0,0 +1,7 @@ +--- +permalink: /robots.txt +--- +User-agent: * +Disallow: + +Sitemap: {{ site.baseurl | prepend: site.url }}/sitemap.xml