CV Timeline Cards Implementation Plan
CV Timeline Cards Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Redesign the Curriculum Vitae page as a polished academic timeline with responsive cards, consistent logos, and compact supporting sections.
Architecture: Keep the existing archive layout and /curriculum vitae/ permalink. Replace table-based CV markup in _pages/curriculum vitae.md with semantic .cv-* HTML, then add scoped styles in _sass/_archive.scss so other archive pages are not affected.
Tech Stack: Jekyll, Kramdown/Markdown, Liquid, HTML, Sass, Minimal Mistakes/Academic Pages theme.
File Structure
- Modify
_pages/curriculum vitae.md: replace inline table layout with semantic CV timeline, skills, teaching, and service markup. - Modify
_sass/_archive.scss: add CV-scoped styles for.cv-*classes because the page useslayout: archive. - Do not modify
_layouts/archive.html,_data/navigation.yml,assets/css/main.scss, images, JavaScript, or other pages. - Keep the existing permalink
/curriculum vitae/and redirect/resume.
Task 1: Replace CV Page Markup
Files:
Modify:
_pages/curriculum vitae.md:1-139Step 1: Run the legacy CV markup check
Run:
rg -n "<table|style=|<h1>|width=|height=\"" "_pages/curriculum vitae.md"
Expected: The command prints matches for the current table layout, inline styles, fixed widths/heights, and card-level h1 headings.
- Step 2: Replace
_pages/curriculum vitae.mdwith semantic CV markup
Set _pages/curriculum vitae.md to exactly:
---
layout: archive
title: "Curriculum Vitae"
permalink: /curriculum vitae/
author_profile: true
redirect_from:
- /resume
---
<section class="cv-section" aria-labelledby="cv-education">
<h2 id="cv-education" class="cv-section__title">Education</h2>
<ol class="cv-timeline">
<li class="cv-entry">
<div class="cv-date">2023 - 2028 expected</div>
<article class="cv-card">
<div class="cv-card__header">
<div>
<h3 class="cv-card__title">The University of Hong Kong (HKU)</h3>
<p class="cv-card__meta">Department of Electrical and Computer Engineering</p>
</div>
<img class="cv-logo" src="https://haozhengwan.github.io/images/logo/HKU.png" alt="The University of Hong Kong logo">
</div>
<ul class="cv-detail-list">
<li><strong>Doctor of Philosophy</strong></li>
<li>Advised by <a href="https://www.eee.hku.hk/people/canl/">Prof. Can Li</a></li>
<li>Research interests: in-memory computing, security and privacy, hardware-software co-design</li>
<li>GPA: 4.3/4.3</li>
</ul>
</article>
</li>
<li class="cv-entry">
<div class="cv-date">2019 - 2023</div>
<article class="cv-card">
<div class="cv-card__header">
<div>
<h3 class="cv-card__title">Harbin Institute of Technology (HIT)</h3>
<p class="cv-card__meta">School of Astronautics</p>
</div>
<img class="cv-logo" src="https://haozhengwan.github.io/images/logo/HIT.png" alt="Harbin Institute of Technology logo">
</div>
<ul class="cv-detail-list">
<li><strong>B.Eng.</strong> in Microelectronics Science and Engineering</li>
<li>Advised by <a href="http://homepage.hit.edu.cn/Haifeng">Prof. Haifeng Zhang</a></li>
<li>Grade and ranking: 3.92/4, 91.8/100, Rank 1/80 (Top 1.2%) in the Department of Microelectronics</li>
</ul>
</article>
</li>
<li class="cv-entry">
<div class="cv-date">2016 - 2019</div>
<article class="cv-card">
<div class="cv-card__header">
<div>
<h3 class="cv-card__title">Attached Middle School to Jiangxi Normal University</h3>
<p class="cv-card__meta">Jiangxi Normal University High School (江西师大附中)</p>
</div>
<img class="cv-logo" src="https://haozhengwan.github.io/images/logo/JXSDFZ.jpeg" alt="Attached Middle School to Jiangxi Normal University logo">
</div>
<ul class="cv-detail-list">
<li>High school diploma</li>
<li>Science and engineering track</li>
</ul>
</article>
</li>
</ol>
</section>
<section class="cv-section" aria-labelledby="cv-experience">
<h2 id="cv-experience" class="cv-section__title">Research and Exchange Experience</h2>
<ol class="cv-timeline">
<li class="cv-entry">
<div class="cv-date">Summer 2022</div>
<article class="cv-card">
<div class="cv-card__header">
<div>
<h3 class="cv-card__title">Peking University (PKU)</h3>
<p class="cv-card__meta">C9 League Exchange Scholar</p>
</div>
<img class="cv-logo" src="https://haozhengwan.github.io/images/logo/PKU.png" alt="Peking University logo">
</div>
<ul class="cv-detail-list">
<li>Awarded full tuition waiver through the selective C9 inter-university exchange program</li>
<li>Completed advanced coursework on AI computing system architectures, laying the foundation for current research on hardware-algorithm co-design</li>
<li>Explored emerging device technologies through a course on spintronics and superconducting quantum computing</li>
</ul>
</article>
</li>
<li class="cv-entry">
<div class="cv-date">Jan. 2022 - Jun. 2022</div>
<article class="cv-card">
<div class="cv-card__header">
<div>
<h3 class="cv-card__title">University of Macau (UM)</h3>
<p class="cv-card__meta">Exchange Scholar, ECE and <a href="https://ime.um.edu.mo/">SKL-AMSV</a></p>
</div>
<img class="cv-logo" src="https://haozhengwan.github.io/images/logo/UMacau.jpg" alt="University of Macau logo">
</div>
<ul class="cv-detail-list">
<li>Awarded tuition waiver and UM exchange scholarship for a full-semester program at the State Key Laboratory of Analog and Mixed-Signal VLSI</li>
<li>Gained hands-on exposure to analog/mixed-signal IC design flow through courses on analog IC, data converter, and power management IC</li>
</ul>
</article>
</li>
</ol>
</section>
<section class="cv-section" aria-labelledby="cv-skills">
<h2 id="cv-skills" class="cv-section__title">Skills</h2>
<div class="cv-skills">
<div class="cv-skill-group">
<h3>Programming</h3>
<p>Python, C, C++, Rust, Matlab, HTML, Markdown, Shell, LaTeX</p>
</div>
<div class="cv-skill-group">
<h3>Hardware Description</h3>
<p>Verilog, SystemVerilog, Chisel</p>
</div>
<div class="cv-skill-group">
<h3>CAD/EDA</h3>
<p>Cadence Virtuoso, Innovus, Genus, Allegro; Synopsys Design Compiler, Library Compiler, SiliconSmart; Xilinx Vivado (ISE), Mentor Graphics ModelSim, Verilator, Altium Designer</p>
</div>
<div class="cv-skill-group">
<h3>Languages</h3>
<p>Chinese (Mandarin), English (IELTS: 7.0)</p>
</div>
<div class="cv-skill-group">
<h3>Other</h3>
<p>Adobe Illustrator, LaTeX, Microsoft Office, Photography, Swimming</p>
</div>
</div>
</section>
<section class="cv-section" aria-labelledby="cv-teaching">
<h2 id="cv-teaching" class="cv-section__title">Teaching</h2>
<p class="cv-role">Teaching assistant, Department of Electrical and Computer Engineering, The University of Hong Kong</p>
<ul class="cv-course-list">
<li>
<strong>ELEC7086</strong>
<span>Analog and Mixed-Signal IC for AI Circuits</span>
<em>Graduate, 2026 Spring</em>
</li>
<li>
<strong>ELEC6008</strong>
<span>Pattern Recognition and Machine Intelligence</span>
<em>Graduate, 2025 Spring</em>
</li>
<li>
<strong>ELEC3249</strong>
<span>Pattern Recognition and Machine Intelligence</span>
<em>Undergraduate, 2024 Spring</em>
</li>
</ul>
</section>
<section class="cv-section" aria-labelledby="cv-service">
<h2 id="cv-service" class="cv-section__title">Academic Service</h2>
<ul class="cv-service-list">
<li><strong>Conference reviewer:</strong> DAC'24-26, ICCAD'25-26, DATE'25-26, ASP-DAC'25-26</li>
<li><strong>Journal reviewer:</strong> IEEE Transactions on Emerging Topics in Computing</li>
</ul>
</section>
- Step 3: Run the markup cleanup check
Run:
if rg -n "<table|style=|<h1>|width=|height=\"" "_pages/curriculum vitae.md"; then exit 1; else echo "legacy CV table markup removed"; fi
rg -n "cv-section|cv-timeline|cv-entry|cv-card|cv-logo|cv-skills|cv-course-list|cv-service-list" "_pages/curriculum vitae.md"
rg -n "permalink: /curriculum vitae/|author_profile: true|layout: archive" "_pages/curriculum vitae.md"
rg -n "HKU.png|HIT.png|JXSDFZ.jpeg|PKU.png|UMacau.jpg" "_pages/curriculum vitae.md"
Expected:
legacy CV table markup removed
The remaining commands print matches for the CV classes, required front matter, and all five logo files.
- Step 4: Review the CV markup diff
Run:
git diff -- "_pages/curriculum vitae.md"
Expected: The diff replaces the table-based CV body with the semantic CV sections above. No other file appears in this diff.
- Step 5: Commit the CV markup change
Run:
git add "_pages/curriculum vitae.md"
git commit -m "refactor: structure cv timeline content"
Expected: Git creates a commit that includes only _pages/curriculum vitae.md.
Task 2: Add CV Timeline Styles
Files:
Modify:
_sass/_archive.scss:28Step 1: Run the pre-style selector check
Run:
rg -n "cv-section|cv-timeline|cv-entry|cv-card|cv-logo|cv-skills|cv-course-list|cv-service-list" _sass/_archive.scss
Expected: No matches. The command exits with status 1 before the Sass block is added.
- Step 2: Add the CV-scoped Sass block
Insert this block in _sass/_archive.scss immediately after the first .archive { ... } block and before .archive__subtitle:
.archive {
.cv-section {
margin: 0 0 2.25em;
}
.cv-section__title {
margin: 1.4em 0 0.9em;
padding-bottom: 0.45em;
color: $darker-gray;
font-size: $type-size-3;
line-height: 1.2;
border-bottom: 1px solid $border-color;
}
.cv-timeline {
margin: 1em 0 0;
padding: 0;
list-style: none;
}
.cv-entry {
position: relative;
display: grid;
grid-template-columns: 8.5em minmax(0, 1fr);
gap: 1.25em;
margin: 0 0 1.15em;
}
.cv-entry:before {
content: "";
position: absolute;
top: 0.45em;
bottom: -1.2em;
left: 9.06em;
width: 1px;
background: $border-color;
}
.cv-entry:last-child:before {
bottom: 0.45em;
}
.cv-entry:after {
content: "";
position: absolute;
top: 0.45em;
left: 8.78em;
width: 0.6em;
height: 0.6em;
border: 2px solid $link-color;
border-radius: 50%;
background: $background-color;
}
.cv-date {
color: $link-color;
font-size: $type-size-6;
font-weight: 700;
line-height: 1.45;
text-align: right;
}
.cv-card {
min-width: 0;
padding: 1.05em 1.15em;
border: 1px solid $border-color;
border-radius: $border-radius;
background: #fff;
}
.cv-card__header {
display: grid;
grid-template-columns: minmax(0, 1fr) 4.25em;
gap: 1em;
align-items: start;
margin-bottom: 0.75em;
}
.cv-card__title {
margin: 0 0 0.25em;
color: $darker-gray;
font-size: $type-size-4;
line-height: 1.25;
}
.cv-card__meta {
margin: 0;
color: $dark-gray;
font-size: $type-size-6;
line-height: 1.5;
}
.cv-logo {
display: block;
max-width: 4.25em;
max-height: 4.25em;
width: auto;
height: auto;
justify-self: end;
object-fit: contain;
}
.cv-detail-list,
.cv-course-list,
.cv-service-list {
margin: 0;
padding-left: 1.15em;
}
.cv-detail-list li,
.cv-service-list li {
margin-bottom: 0.35em;
line-height: 1.55;
}
.cv-detail-list li:last-child,
.cv-service-list li:last-child {
margin-bottom: 0;
}
.cv-skills {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.85em;
}
.cv-skill-group {
padding: 0.95em 1em;
border: 1px solid $border-color;
border-radius: $border-radius;
background: $code-background-color;
}
.cv-skill-group h3 {
margin: 0 0 0.4em;
color: $darker-gray;
font-size: $type-size-5;
line-height: 1.3;
}
.cv-skill-group p,
.cv-role {
margin: 0;
line-height: 1.55;
}
.cv-course-list {
padding-left: 0;
list-style: none;
}
.cv-course-list li {
display: grid;
grid-template-columns: 6em minmax(0, 1fr) 10em;
gap: 0.75em;
align-items: baseline;
padding: 0.7em 0;
border-bottom: 1px solid $border-color;
line-height: 1.45;
}
.cv-course-list li:first-child {
border-top: 1px solid $border-color;
}
.cv-course-list strong {
color: $link-color;
}
.cv-course-list em {
color: $gray;
font-size: $type-size-6;
font-style: normal;
text-align: right;
}
@include breakpoint(max-width $medium) {
.cv-entry {
grid-template-columns: 1fr;
gap: 0.55em;
}
.cv-entry:before,
.cv-entry:after {
display: none;
}
.cv-date {
text-align: left;
}
.cv-skills,
.cv-course-list li {
grid-template-columns: 1fr;
}
.cv-course-list li {
gap: 0.25em;
}
.cv-course-list em {
text-align: left;
}
}
@include breakpoint(max-width $small) {
.cv-section__title {
font-size: $type-size-4;
}
.cv-card,
.cv-skill-group {
padding: 0.9em;
}
.cv-card__header {
grid-template-columns: minmax(0, 1fr) 3.25em;
gap: 0.75em;
}
.cv-logo {
max-width: 3.25em;
max-height: 3.25em;
}
}
}
- Step 3: Run the post-style selector check
Run:
rg -n "cv-section|cv-timeline|cv-entry|cv-card|cv-logo|cv-skills|cv-course-list|cv-service-list" _sass/_archive.scss
Expected: The command prints matches for all CV selectors added in Step 2.
- Step 4: Review the Sass diff
Run:
git diff -- _sass/_archive.scss
Expected: The diff adds only one .archive { ... } scoped CV styles block. No global table, layout, sidebar, or navigation selectors are changed.
- Step 5: Commit the CV style change
Run:
git add _sass/_archive.scss
git commit -m "style: add cv timeline layout"
Expected: Git creates a commit that includes only _sass/_archive.scss.
Task 3: Static and Build Verification
Files:
- Verify:
_pages/curriculum vitae.md Verify:
_sass/_archive.scss- Step 1: Verify clean working tree before checks
Run:
git status --short
Expected: No output after Tasks 1 and 2 have been committed.
- Step 2: Run CV static checks
Run:
if rg -n "<table|style=|<h1>|width=|height=\"" "_pages/curriculum vitae.md"; then exit 1; else echo "legacy CV table markup removed"; fi
rg -n "cv-section|cv-timeline|cv-entry|cv-card|cv-logo|cv-skills|cv-course-list|cv-service-list" "_pages/curriculum vitae.md" _sass/_archive.scss
rg -n "permalink: /curriculum vitae/|author_profile: true|layout: archive" "_pages/curriculum vitae.md"
rg -n "HKU.png|HIT.png|JXSDFZ.jpeg|PKU.png|UMacau.jpg" "_pages/curriculum vitae.md"
rg -n "https://www.eee.hku.hk/people/canl/|http://homepage.hit.edu.cn/Haifeng|https://ime.um.edu.mo/" "_pages/curriculum vitae.md"
Expected:
legacy CV table markup removed
The remaining commands print matches for class hooks, required front matter, all logo paths, and all preserved links.
- Step 3: Run route smoke metadata checks
Run:
rg -n "url: /curriculum vitae/" _data/navigation.yml
rg -n "permalink:" _pages/about.md "_pages/curriculum vitae.md" _pages/projects.md _pages/Gallery.html
Expected: The CV navigation URL remains /curriculum vitae/, and key page permalinks still print.
- Step 4: Attempt Jekyll build
Run:
bundle exec jekyll build --config _config.yml,_config.dev.yml
Expected in a healthy local Ruby/Jekyll environment: build exits 0 and prints output containing Destination: ./_site and done in.
Known current environment blocker from this repository state: this command may exit 127 with bundler: command not found: jekyll because the local Ruby/Bundler environment lacks the Jekyll executable. If that happens, record the exact output and continue to Step 5. Do not change Gemfile or install dependencies as part of this CV implementation task.
- Step 5: Review final branch diff
Run:
git diff HEAD~2..HEAD --stat
git diff HEAD~2..HEAD -- "_pages/curriculum vitae.md" _sass/_archive.scss
git status --short
Expected: The diff includes only _pages/curriculum vitae.md and _sass/_archive.scss for the CV redesign commits. git status --short prints no output.
