- HTML 62%
- Python 12.2%
- CSS 12%
- TeX 11%
- JavaScript 2.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
Build and deploy website / build (push) Successful in 47s
|
||
| .forgejo/workflows | ||
| .github | ||
| assets | ||
| config/_default | ||
| content | ||
| data | ||
| docs | ||
| layouts | ||
| scripts | ||
| .editorconfig | ||
| .gitignore | ||
| .nvmrc | ||
| academic.Rproj | ||
| go.mod | ||
| go.sum | ||
| hugoblox.yaml | ||
| LICENSE.md | ||
| netlify.toml | ||
| package-lock.json | ||
| package.json | ||
| preview.png | ||
| README.md | ||
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-latestlabel and support for Node.js 24 actions. - An Actions secret named
NETLIFY_AUTH_TOKENwith permission to deploy the existing Netlify site. - An Actions variable named
NETLIFY_SITE_IDcontaining 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 usinghugoblox/author/v1.assets/media/authors/xuanli.jpg: active profile photograph. Replace this file to update the photo; the legacycontent/authors/xuanli/avatar.jpgis no longer used by the theme. Rebuild withnpm 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 underhugoblox, schema2.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-summaryview 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 inassets/media/authors/, and author visibility settings incontent/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.