Personal academic website built with Jekyll. Bilingual (EN/ZH), auto-deployed to GitHub Pages.
# Install dependencies (requires Ruby 3.x)
bundle install
# Local development with live reload
bundle exec jekyll serve --livereload
# Build for production
JEKYLL_ENV=production bundle exec jekyll buildSite runs at http://localhost:4000. Push to main branch triggers automatic deployment via GitHub Actions.
.
├── _config.yml # Site metadata, author info, social links, plugins
├── _data/
│ ├── about.yml # ★ Personal info, tagline, bio, career timeline, open source
│ ├── publications.yml # ★ Curated selected publications (manually maintained)
│ ├── publications_all.yml # ★ Auto-synced full publication list (Google Scholar/OpenAlex)
│ ├── news.yml # ★ News/updates on homepage
│ ├── awards.yml # ★ Awards, challenges, services, talks
│ └── i18n.yml # UI text translations (EN/ZH)
├── _includes/
│ ├── hero.html # Hero section (reads from about.yml)
│ ├── timeline.html # Career timeline (reads from about.yml)
│ ├── publication.html # Single publication card component
│ ├── nav.html # Navigation bar
│ ├── head.html # <head> meta, fonts, JSON-LD, theme script
│ ├── footer.html # Site footer
│ ├── social-icon.html # SVG icon component
│ └── awards-content.html
├── _layouts/
│ ├── default.html # Base layout (nav + main + footer + JS)
│ ├── page.html # Generic page layout
│ └── post.html # Blog post layout
├── _sass/
│ ├── _variables.scss # Design tokens (colors, fonts, spacing)
│ ├── _base.scss # Reset, typography, global styles
│ ├── _dark.scss # Dark mode overrides
│ ├── _layout.scss # Nav, footer, container, sections
│ ├── _components.scss # Cards, tags, buttons, news list
│ ├── _home.scss # Hero, timeline, open source, pub grid
│ ├── _blog.scss # Blog list and post page
│ └── _awards.scss # Awards page
├── _posts/ # Blog posts (Markdown)
├── assets/
│ ├── css/main.scss # SCSS entry point
│ ├── js/main.js # Theme toggle, mobile nav, scroll effects
│ └── img/ # Images (bio photo, favicons, timeline logos, pub previews)
├── index.html # English homepage
├── zh/ # Chinese versions of all pages
│ ├── index.html
│ ├── publications.md
│ ├── blog.html
│ └── awards.html
└── .github/workflows/
├── deploy.yml # Auto-deploy on push to main
└── update-citations.yml # Weekly publication sync + citation updates
Edit _data/about.yml:
name:
en: "Your Name"
zh: "你的名字"
tagline:
en: "One-liner about what you do"
zh: "一句话介绍"
bio:
en:
- "A paragraph in **Markdown** with [links](). Rendered via markdownify."
zh:
- "对应的中文段落。"Edit the timeline section in _data/about.yml:
timeline:
- period: "2025 –"
logo: "/assets/img/logos/kuaishou.svg" # optional
logo_alt: "Kuaishou" # optional
en: "Narrative paragraph with **bold** and [links](url)."
zh: "对应的中文叙事。"
- period: "2023 – 2025"
en: "..."
zh: "..."Tips:
- Write in first person, narrative style (not bullet points)
- Bold product names:
**Kling-Image-O1** - Use
[text](url)for links; leave()empty as placeholder - Entries render top-to-bottom; put most recent first
- Timeline logos are loaded from
assets/img/logos/(SVG preferred)
Edit the open_source section in _data/about.yml:
open_source:
- name: "ProjectName"
url: "https://github.com/..."
paper: "https://arxiv.org/..." # optional
desc:
en: "Short description."
zh: "简短描述。"Publication data is split into two files:
_data/publications.yml: curated selected papers (manual, rich metadata, homepage cards)_data/publications_all.yml: full list auto-synced from Google Scholar/OpenAlex (includesbibtex)
Curated entry example (_data/publications.yml):
- key: author2024title # unique ID
title: "Paper Title"
authors: "Author A, <strong>Your Name</strong>, Author B"
venue: CVPR # used for colored tag (tag--cvpr)
venue_full: "CVPR 2024"
year: 2024
selected: true # shows on homepage if true
google_scholar_id: "xxx" # for auto citation updates
citations: 42 # auto-updated weekly by GitHub Action
links:
arxiv: "2401.12345"
code: "https://github.com/..."
paper: "https://..."
preview: filename.png # image in assets/img/publication_preview/Auto-sync command (manual run):
python scripts/sync_publications_from_scholar.py --scholar-id Hv-vj2sAAAAJThis script will:
- Keep
_data/publications.ymlas selected-only - Fetch all papers from OpenAlex (mapped from Google Scholar profile)
- Generate/update
_data/publications_all.ymlwithbibtexand citations
Workflow .github/workflows/update-citations.yml runs weekly to sync publications and refresh citation counts.
Edit _data/news.yml:
- year: 2024
en: 'Plain text or <strong>HTML</strong> with <a href="url">links</a>.'
zh: '对应的中文。'Edit _data/awards.yml. Has four sections: awards, challenges, services, talks. See file for format.
Create a new file in _posts/ named YYYY-MM-DD-slug.md:
---
layout: post
title: "Post Title"
date: 2026-03-26
description: "Short description for preview cards."
tags: [AI, Research]
---
Post content in Markdown.All UI labels (nav items, section titles, button text) are in _data/i18n.yml. Each key has en and zh values.
_config.yml controls:
title,description,url— SEO and meta tagsauthor.name,author.email,author.title— used by jekyll-seo-tagsocial.*— GitHub, Scholar, LinkedIn, Twitter, Zhihu handles
- Create
pagename.html(English) andzh/pagename.html(Chinese) - Add front matter with
layout,title,permalink, andlang(for Chinese) - Add nav link in
_includes/nav.htmland i18n key in_data/i18n.yml - Add the path to the hreflang list in
_includes/head.html - Add the path to
zhPagesarray inassets/js/main.js(for auto language redirect)
Colors are defined as SCSS variables in _sass/_variables.scss and mapped to CSS custom properties in _sass/_base.scss. Dark mode overrides in _sass/_dark.scss.
| Token | Light | Dark |
|---|---|---|
--bg-primary |
#ffffff |
#0f172a |
--text-primary |
#0f172a |
#f1f5f9 |
--accent |
#2563eb |
#60a5fa |
--border |
#e2e8f0 |
#334155 |
- Mobile:
≤ 640px - Tablet:
641px – 960px - Desktop:
> 960px
- Sans: Inter (Google Fonts, with
fonts.loli.netfallback for China) - Mono: JetBrains Mono
Push to main → GitHub Actions builds with Jekyll → deploys to GitHub Pages.
The workflow is defined in .github/workflows/deploy.yml. No manual steps needed.
- No CV/resume file in the repo — intentionally excluded for privacy
- Images: Publication preview images go in
assets/img/publication_preview/; timeline logos go inassets/img/logos/; bio photo isassets/img/bio_pic.jpg - Career timeline is the source of truth: Experience content lives in
_data/about.yml(timelinesection), not in a separate projects page - Language auto-redirect: First-time visitors with Chinese browser locale are redirected to
/zh/for whitelisted pages (configured inmain.js) - Sass compilation:
sass.style: compressedin_config.ymlfor production minification