This site is a Hugo website with a Homepage and People pages:
- Homepage sections:
News,Research,Info - Dedicated People page:
/people/, with profile pages at/people/<username>/ - Manual people photos with local WebP assets and WebP placeholders
- Spreadsheet/CSV-driven people, news, publications, and research areas
- Lab branding and logo
- SEO-ready static rendering for homepage and people profile pages (
/people/<username>/)
python3 scripts/sync_sheet.py --fetch --generate-og
hugo serverTo generate all SEO pages/data from current CSV files:
python3 scripts/sync_sheet.py --generate-ogTo fetch latest Google Spreadsheet CSV first:
python3 scripts/sync_sheet.py --fetch --generate-ogGenerated outputs:
content/people/*.md(profile pages routed as/people/<username>/)data/generated/*.json(server-rendered homepage content)static/og/*.webp(people-specific OG images converted to WebP)
SEO coverage now includes:
- Unique
title+descriptionper page og:*+twitter:*tags per page (og:imageuses local WebP assets)- Canonical URLs per page
robots.txt+sitemap.xml- Structured data (
Organization,Person,ItemList/ScholarlyArticle)
Update:
static/data/sources.json
Current spreadsheet:
https://docs.google.com/spreadsheets/d/1_L3tFxWwN1jLGDb94X7ewO4VMo9p0q9jvubQ96vutUI/edit- Sheet tabs /
gid:people→0publications→313564106news→1707205392research→1173471225
Recommended config for this project:
{
"peopleCsvUrl": "https://docs.google.com/spreadsheets/d/1_L3tFxWwN1jLGDb94X7ewO4VMo9p0q9jvubQ96vutUI/export?format=csv&gid=0",
"publicationsCsvUrl": "https://docs.google.com/spreadsheets/d/1_L3tFxWwN1jLGDb94X7ewO4VMo9p0q9jvubQ96vutUI/export?format=csv&gid=313564106",
"newsCsvUrl": "https://docs.google.com/spreadsheets/d/1_L3tFxWwN1jLGDb94X7ewO4VMo9p0q9jvubQ96vutUI/export?format=csv&gid=1707205392",
"researchCsvUrl": "https://docs.google.com/spreadsheets/d/1_L3tFxWwN1jLGDb94X7ewO4VMo9p0q9jvubQ96vutUI/export?format=csv&gid=1173471225",
"peopleLocalCsv": "/data/people.csv",
"publicationsLocalCsv": "/data/publications.csv",
"newsLocalCsv": "/data/news.csv",
"researchLocalCsv": "/data/research.csv"
}If remote CSV fails, the site automatically falls back to local CSV files.
Important:
- Use
.../export?format=csv&gid=...URLs, notgvizURLs. - Keep row 1 as exact header names (for example
name,degree,year,title,authors,date,content). - Spreadsheet must be shared as viewable by the website runtime (for public site, usually "Anyone with the link can view").
Required:
name
Recommended:
degree(e.g., Master, PhD)year(cohort/admission year, e.g., 2024, 2025)roleemailgithuborcidscholar(Google Scholar URL)websitephoto(e.g.,/images/people/alice.webp)descriptiontags(people-defined tags for People filtering; separate multiple tags with,,;,/,|,、, or,)username(URL slug for modal route, e.g.,grace)profile_markdown(popup content, supports new lines, headings#~######, links, lists, and images)
Photo fallback order:
photo/images/people/<username>.webpwhen a matching local file exists/images/people/people-placeholder.webp
People route behavior:
- People list page is available at
/people/ - People profile pages are generated at
/people/<username>/ - Short links
/<username>/are generated as aliases and redirect to/people/<username>/ - Unknown paths still redirect through
static/404.html
Required:
datecontentortitle
Recommended:
titlecontent(supports[label](https://example.com)and plainhttps://...links)link_urllink_text
Required:
title
Recommended:
key(stable identifier, e.g.,omniobserve; do not change when title changes)authorsauthor_usernames(comma-separated People usernames matchingauthors, e.g.,alice,bob,grace)proceedingsyeardoi(raw DOI or full URL)thumbnail(e.g.,/images/publications/paper1.webp)pdfvideo(e.g., YouTube URL)websiteaward
Required:
topic(ortitle)
Recommended:
descriptionorder(numeric sort order, e.g.,1,2,3)
- Lab logo: update
static/images/haix-logo.svg; rendered pages and favicon both use this source vector. Keepstatic/images/haix-logo.webponly as a raster fallback asset. - Group photo: replace
static/images/group-photo.webp - People photos: add files under
static/images/people/and set CSVphotopath - News data: update
static/data/news.csvor setnewsCsvUrlinstatic/data/sources.json - Publication thumbnails: add files under
static/images/publications/and set CSVthumbnailpath - Research data: update
static/data/research.csvor setresearchCsvUrlinstatic/data/sources.json