No description
  • HTML 62%
  • Python 12.2%
  • CSS 12%
  • TeX 11%
  • JavaScript 2.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Xuanli Lin 53dd3ef229
All checks were successful
Build and deploy website / build (push) Successful in 47s
Document the completed Forgejo deployment cutover
2026-09-17 02:08:50 -07:00
.forgejo/workflows Migrate repository and CI deployment to kaze.moe 2026-09-17 01:56:46 -07:00
.github Migrate repository and CI deployment to kaze.moe 2026-09-17 01:56:46 -07:00
assets updated latest publications and author profiles 2026-09-17 01:40:30 -07:00
config/_default Migrate repository and CI deployment to kaze.moe 2026-09-17 01:56:46 -07:00
content updated latest publications and author profiles 2026-09-17 01:40:30 -07:00
data updated latest publications and author profiles 2026-09-17 01:40:30 -07:00
docs updated latest publications and author profiles 2026-09-17 01:40:30 -07:00
layouts updated latest publications and author profiles 2026-09-17 01:40:30 -07:00
scripts updated latest publications and author profiles 2026-09-17 01:40:30 -07:00
.editorconfig Add editor config 2017-12-03 19:11:36 +00:00
.gitignore Migrate repository and CI deployment to kaze.moe 2026-09-17 01:56:46 -07:00
.nvmrc updated the website to the latest hugoblox-kit platform while maintaining the old look 2026-09-16 16:58:31 -07:00
academic.Rproj add RStudio project file for R users 2019-01-30 01:43:03 +00:00
go.mod updated the website to the latest hugoblox-kit platform while maintaining the old look 2026-09-16 16:58:31 -07:00
go.sum updated the website to the latest hugoblox-kit platform while maintaining the old look 2026-09-16 16:58:31 -07:00
hugoblox.yaml updated the website to the latest hugoblox-kit platform while maintaining the old look 2026-09-16 16:58:31 -07:00
LICENSE.md Initial commit 2017-11-23 01:41:58 +00:00
netlify.toml updated the website to the latest hugoblox-kit platform while maintaining the old look 2026-09-16 16:58:31 -07:00
package-lock.json Make deployment lockfile compatible with the CI npm version 2026-09-17 01:59:50 -07:00
package.json Migrate repository and CI deployment to kaze.moe 2026-09-17 01:56:46 -07:00
preview.png starters: update 2022-04-24 03:20:45 +00:00
README.md Document the completed Forgejo deployment cutover 2026-09-17 02:08:50 -07:00

Xuanli Lin's academic website

Source for xlin.io, migrated to the current HugoBlox Academic CV template.

The canonical repository is kaz/xlin-io on kaze.moe. Clone it with:

git clone ssh://git@kaze.moe/kaz/xlin-io.git

Build and preview

Requirements: Hugo Extended 0.166.0, Node.js 22.13.0 or later, and Go (deployment uses 1.27.1). Python 3 is used only for the output checker and the static preview below.

Use the Node.js version in .nvmrc when updating dependencies so the npm version matches CI.

npm ci
npm run build
python scripts/check-site.py
python -m http.server 1313 --bind 127.0.0.1 --directory public

Open http://127.0.0.1:1313 to preview the complete production output, including search. npm run build regenerates public/, compiles Tailwind CSS, and indexes pages with Pagefind. Hugo fails on any warning, including path and translation warnings; warnings are not suppressed.

For live content/style editing, use npm run dev. Rebuild and use the static preview to test the production search index after content changes.

The Forgejo Actions workflow builds with warnings treated as errors and checks generated links, metadata, and search coverage on pushes and pull requests. After successful checks, pushes to main and manual runs on main publish public/ to the existing Netlify site using the pinned Netlify CLI. Other branches and pull requests run validation without publishing production.

Deployment setup

In the kaze.moe repository's Settings → Actions, configure:

  • An available runner with the ubuntu-latest label and support for Node.js 24 actions.
  • An Actions secret named NETLIFY_AUTH_TOKEN with permission to deploy the existing Netlify site.
  • An Actions variable named NETLIFY_SITE_ID containing the existing Netlify project's ID, available under Project configuration → General → Project details.

Run Build and deploy website on main and verify the resulting production deploy in Netlify. In the existing Netlify project's Project configuration → Build & deploy → Continuous deployment → Build settings, set Build status to Stopped builds. This disables the old GitHub-triggered builds and preserves their settings for recovery. Deploying prebuilt files through the CLI remains available when Netlify builds are stopped, so Forgejo continues to publish the validated site. Keep the existing Netlify project and its domain settings so xlin.io retains its URL and deployment history.

For a manual production deployment, set NETLIFY_AUTH_TOKEN and NETLIFY_SITE_ID in your environment, then run:

npm ci
npm run build
python scripts/check-site.py
npm run deploy:production

The deploy command uploads the already-checked public/ directory without rebuilding. netlify.toml remains available for local Netlify tooling; its branch and deploy-preview contexts do not create Forgejo pull-request previews automatically.

Content and appearance

  • data/authors/xuanli.yaml: profile using hugoblox/author/v1.
  • assets/media/authors/xuanli.jpg: active profile photograph. Replace this file to update the photo; the legacy content/authors/xuanli/avatar.jpg is no longer used by the theme. Rebuild with npm run build, then reload the preview.
  • content/_index.md: homepage blocks and original section anchors.
  • content/publication/: publications and their PDF, BibTeX, and slide bundles.
  • content/event/: talks; existing /talk/<title>/ URLs are preserved.
  • config/_default/params.yaml: site settings under hugoblox, schema 2.0.
  • data/themes/xlin.yaml, data/fonts/xlin.yaml, assets/css/custom.css: original colors, Roboto/Montserrat typography, centered profile, and responsive two-column sections.

The dated biography, education, and teaching history are preserved. Publications and talks were reconciled with the complete Google Scholar profile in September 2026; see publication sources and abstract verification.

Current publication and event fields

Follow the official publication example, event example, and author example.

Publications use structured publication.name / publication.short_name, hugoblox.ids.doi, and typed links. A bundle's <folder-name>.pdf and cite.bib are discovered automatically; avoid declaring the same PDF a second time. Use bundle-relative filenames for slides so Hugo resolves the correct public URL.

Every publication has a concise editorial summary in its front matter and the full original abstract under ## Abstract in its Markdown body. Write the summary from the verified abstract; do not repeat it in an Overview section or store the full abstract in front matter. The summary appears in the page metadata and supplies previews and descriptions; both it and the full abstract are searchable. Source verification and any publisher-access fallbacks are recorded in publication sources, without a separate abstract-source line on the public pages.

Papers without a retrieved local PDF have pdf_status: pending and a visible availability note. To add a missing PDF, place it in the matching bundle, remove the pending status and link, and replace the availability note. Preprints and patent applications retain their own publication types.

Talks use event_name, event_start, event_end, and event_all_day. date is the page publication date, distinct from the talk's start time.

Small local extensions

  • talk-summary view retains talk dates, locations, summaries, and slide buttons.
  • Author metadata highlights Xuanli Lin, preserves author order and contribution notes, and links recurring coauthors to their profiles. Ten coauthors have stored biographies and portraits, with eight currently public; Zhaofeng Zhang and Alena Chang are temporarily hidden. See author sources and visibility settings. Profile data lives in data/authors/, portraits in assets/media/authors/, and author visibility settings in content/authors/. Publication and talk author lists use the matching profile slugs. Hidden or unprofiled authors retain their full names without links, portraits, or bio cards. Article structured data credits every author in order.
  • The publication archive retains text, year, and publication-type filters, with all records available without JavaScript.
  • Publication summaries and body abstracts are indexed directly by Pagefind. A hook also indexes public author/venue/tag metadata and event abstracts.

Upstream baseline

Migration checked against Academic CV commit 3aacb2ac2c3f6aeaecac4febe915c2fb30122903 (2026-09-13). Its module pins use the latest framework module code, Blox v0.0.0-20260527025321-61f41d3667f1.

The template's minimum Hugo version is older than the installed version. Image settings and language configuration also use Hugo 0.166's current schema. Keep go.sum and package-lock.json committed for reproducible dependency resolution.