Source for Xiangyu Li's personal website, an academic homepage and long-form blog built with Zola.
The site brings together:
- a research profile, news, awards, and experience;
- publications with Google Scholar citation badges;
- technical writing on on-device AI, efficient inference, and embodied AI, including ordered post series;
- an "Outside" section for photography, personal writing, and music;
- full-site search, light/dark/system themes, Atom feeds, and responsive layouts.
The repository intentionally keeps the stack small: Markdown and TOML hold the
content, Tera templates render it, and Sass provides the presentation. Zola
produces a fully static site in public/.
Install Zola 0.22.1 and uv before starting local development; see the Zola installation guide.
# From the repository root
chmod +x serve.sh
./serve.shMake sure zola.exe is available on PATH, then run:
# From the repository root
.\serve.ps1Both scripts prepare the Chinese search index and then the site's web-font
subsets. One watcher keeps both synchronized after content edits settle, writing
only changed outputs. The wrappers enable live reload, watch data/ in addition
to the normal Zola paths, and forward extra arguments to Zola. For example:
./serve.sh --drafts.\serve.ps1 --draftsThe first run after a fresh clone may spend about a minute generating the local font cache. Later starts normally reuse it and proceed in under a second.
Open the URL printed by Zola (normally http://127.0.0.1:1111). To create a
production build, run ./build.sh on Unix or .\build.ps1 on Windows; generated
output is written to public/. These wrappers use the same asset preparation
step and validate font coverage in the rendered site. Search and font outputs
are generated locally and in CI; do not commit them.
Run the lightweight content and feature checks through uv:
uv run --locked python -m unittest discover -s tests -vThe checks validate multilingual content pairs, translated metadata, search
indexes, content safety conventions, and ordered post-series structure. Run the
platform's build wrapper as a separate production rendering check when
templates, styles, configuration, or content structure change.
For changes to video loading or search, run the browser-behavior regression tests with Node.js 22+ (built-in test runner, no npm dependencies):
node --test tests/js/*.test.cjsCI runs both suites. The JavaScript checks exercise delayed media events, reader preferences, search request ordering, and retry after network failure.
content/ Markdown pages and section front matter
data/ Structured content and generated manifests
templates/ Zola Tera templates and shortcodes
sass/ Site styles
static/ Files copied directly into the built site
scripts/ Content and asset maintenance utilities
tests/ Extensible repository and content checks
docs/ Maintainer documentation
config.toml Zola and site-wide configuration
serve.sh Unix development entry point
serve.ps1 Windows development entry point
build.sh Unix production-build entry point
build.ps1 Windows production-build entry point
See the post series convention before creating or reordering a series, and the asset and gallery workflow before adding large files or publishing an Outside photography collection. Web-font coverage is generated automatically; its design and validation are documented in the font subsetting workflow.
Pushes to main are built and deployed to GitHub Pages by
.github/workflows/deploy.yml. The same workflow refreshes Google Scholar data
on its scheduled and manual runs, falling back to committed values if the
external lookup is unavailable.
See the Scholar citation workflow for cache updates and citation badge rules.
For a new fork, select GitHub Actions as the Pages source under Settings > Pages.
Site code is available under the MIT License. Original Blog and Outside content is licensed under CC BY 4.0 unless a page states otherwise. Other personal content is not included in that grant.
See LICENSE.md for the exact scope and third-party notices for bundled fonts and icons.
- Zola — static site generator
- Design references: Minimal Light for the academic layout and Tabi for the blog layout