Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,8 @@ copyrightable); copying her stylesheets is not.
`hugo.yaml` → `title`.
- Skill progress bars only render `{{ if gt $level 0 }}` — so **omitting `level`** in
the author YAML removes them. No override needed.
- The collection block defaults to **`count: 5`**, which silently hid the trailing
"to be continued" card. It is now explicitly `count: 0` (unlimited). Never let a
default cap hide entries.
- The collection block defaults to **`count: 5`**. It is explicitly `count: 0`
(unlimited), so the synchronized Research list is never silently capped.

## Local toolchain — three version walls (all worked around in scratch)

Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@ Motion is disabled automatically for visitors whose OS asks for reduced motion.

No template assumes how many entries a list holds. Adding a project is one folder
under `content/projects/`; adding a skill is one line in `data/authors/me.yaml`.
Lists end in a **visible** placeholder rather than a silent cap — the research
collection is explicitly set to `count: 0` so nothing is ever hidden behind a
default limit.
The research collection is explicitly set to `count: 0` so all four synchronized
research entries remain visible without a default cap.

The **Publications** section renders even while it is empty ("In preparation"). It
does not get deleted just because there is nothing in it yet.

Upstream truth for all of this lives in `PROFILE.md` (in the private `pw-meta`
repo), projected into `profile-readme/data/profile.json`.
Identity and skill data originate in `PROFILE.md` (in the private `pw-meta` repo),
projected into `profile-readme/data/profile.json`. Public bio, internship, and
research copy are synchronized with the 3D site in `tools/sync-profile.py`.

## The CV

Expand Down
Binary file removed content/projects/more/featured.png
Binary file not shown.
9 changes: 0 additions & 9 deletions content/projects/more/index.md

This file was deleted.

8 changes: 5 additions & 3 deletions content/projects/r1/index.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
---
title: "LLM for Incentive Design in Mobility Systems"
summary: "Can an LLM design the incentives that make shared mobility actually work?"
title: "Scalable Split Learning and Quantization for Vision–Language Models in Medicine"
summary: "Studying multi-server split learning, low-bit representation transfer, and privacy–utility trade-offs in medical visual question answering."
date: 2026-01-01
tags:
- Research
---

An LLM-guided workflow that generates and evaluates interpretable incentive policies for ride-hailing, transit, and shared vehicles — pairing learning-based methods with classical optimization.
**University of Michigan · 2026–present**

Studying multi-server split learning, low-bit representation transfer, and privacy–utility trade-offs in medical visual question answering.
8 changes: 5 additions & 3 deletions content/projects/r2/index.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
---
title: "EPCOT Foundation Model — TSS-to-Expression Data Pipeline"
summary: "Made a genomic foundation model 2–5× faster to train — and found a 50 kb bug that was quietly wrecking its interpretability."
title: "Foundation-Model Fine-Tuning for Regulatory Genomics"
summary: "Fine-tuning EPCOT on single-cell multi-omics data to predict gene expression from chromatin accessibility, with reproducible preprocessing and cell-specific evaluation."
date: 2026-01-01
tags:
- Research
---

Pseudobulk pipeline from raw snMultiome (1 bp sparse ATAC → 600 kb HDF5 windows; CP10K-normalized 19,264-gene RNA vectors across 7 cell types). Five bit-equivalent training optimizations for a 2–5× speedup at identical numerics. Reset-head fine-tuning for small-data generalization. Located and fixed a ~50 kb TSS-bin offset.
**University of Michigan · 2026–present**

Fine-tuning EPCOT on single-cell multi-omics data to predict gene expression from chromatin accessibility, with reproducible preprocessing and cell-specific evaluation.
8 changes: 5 additions & 3 deletions content/projects/r3/index.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
---
title: "AI-Guided Environmental Sensing & Adaptive Monitoring"
summary: "Where should you put the next sensor in Lake Michigan? Let uncertainty decide."
title: "LLM-Assisted Incentive Design for Mobility Systems"
summary: "Using structured LLM simulations, bandits, and budget constraints to study data-driven incentives for heterogeneous travelers."
date: 2026-01-01
tags:
- Research
---

Reproducible ingestion → reconstruction → uncertainty-quantification workflow for the sparse, seasonal Great Lakes, comparing random / grid / uncertainty-aware sensor-placement rules.
**University of Michigan · 2026–present**

Using structured LLM simulations, bandits, and budget constraints to study data-driven incentives for heterogeneous travelers.
8 changes: 5 additions & 3 deletions content/projects/r4/index.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
---
title: "Applets for Data Analytics in Materials Science"
summary: "Turning materials-science analysis into something you can just... upload a CSV to."
title: "AI-Assisted Platform for Scientific Data Analytics"
summary: "Building a full-stack workflow for materials-science data preparation, interactive model fitting, and human-verified AI assistance."
date: 2026-01-01
tags:
- Research
---

JavaScript front end + Python back end serving the materials community: users upload datasets and analyze them with SOTA models and fitting methods, built as reusable FAIR-compliant modules.
**University of Michigan · 2026–present**

Building a full-stack workflow for materials-science data preparation, interactive model fitting, and human-verified AI assistance.
Binary file removed content/projects/r5/featured.png
Binary file not shown.
9 changes: 0 additions & 9 deletions content/projects/r5/index.md

This file was deleted.

12 changes: 5 additions & 7 deletions data/authors/me.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ name:
given: Tianlang
family: Chen
alternate: "陈天朗"
role: "B.S.E. Candidate, Data Science"
role: "B.S.E. Candidate · Data Science"
bio: |
I study Data Science at the University of Michigan, Ann Arbor. I came here through the UM-SJTU dual-degree program: the first half of my undergraduate degree was Mechanical Engineering at Shanghai Jiao Tong University's Joint Institute, the second half is Data Science at Michigan. It was less a change of heart than a change of tools.
I work across machine learning, scientific data, and full-stack tools for research.

affiliations:
- name: "University of Michigan, Ann Arbor"
Expand Down Expand Up @@ -47,14 +47,12 @@ education:
Dynamics & Vibrations.

experience:
- role: WeCom Full-Stack Developer, Intern
org: Mars Asia — Global IT Service Center
- role: WeCom Full-Stack Development
org: Mars Asia · Global IT Service Center
start: 2024-06-01
end: 2025-05-31
summary: |
Full-stack WeCom development in JavaScript, Node.js and Vue.js. API and
interface work, data migration, and cross-platform retrieval. Built the
automation that kept operations continuous through a system migration.
Contributed to internal WeCom tools with JavaScript, Node.js, and Vue.js, supporting APIs, interfaces, data migration, information retrieval, and workflow automation.

skills:
- name: "Languages"
Expand Down
84 changes: 56 additions & 28 deletions tools/sync-profile.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
#!/usr/bin/env python3
"""Regenerate this site's content from the single source of truth.
"""Regenerate this site's profile and synchronized public resume content.

PROFILE.md (in the private pw-meta repo) is the authoritative "who I am". It is
projected into profile-readme/data/profile.json, and this script projects *that*
into the two places Hugo reads:

data/authors/me.yaml the profile: bio, education, internship, skills, ...
content/projects/<id>/ one folder per research project
content/projects/<id>/ the four Research cards shared with the 3D site

Run it after any change to profile.json, then commit the result. Nothing here is
hand-maintained; editing me.yaml directly means the next run overwrites you.

tools/sync-profile.py regenerate
tools/sync-profile.py --check exit non-zero if the checked-in files are stale

Cover images (content/projects/*/featured.png) are NOT touched — they are assets,
and regenerating content must not delete them.
Identity and skills come from profile.json. The public bio, Mars Internship, and
four Research descriptions below intentionally match the 3D website. Cover images
(content/projects/*/featured.png) are not touched.
"""

import argparse
Expand All @@ -26,6 +27,44 @@
HERE = pathlib.Path(__file__).resolve().parent.parent
SRC = HERE.parent / "profile-readme" / "data" / "profile.json"
PUBLIC_GITHUB_USERNAME = "jackiectl2"
PUBLIC_ROLE = "B.S.E. Candidate · Data Science"
PUBLIC_BIO = (
"I work across machine learning, scientific data, and full-stack tools "
"for research."
)
PUBLIC_INTERNSHIP = {
"role": "WeCom Full-Stack Development",
"org": "Mars Asia · Global IT Service Center",
"start": "2024-06-01",
"end": "2025-05-31",
"summary": (
"Contributed to internal WeCom tools with JavaScript, Node.js, and "
"Vue.js, supporting APIs, interfaces, data migration, information "
"retrieval, and workflow automation."
),
}
PUBLIC_RESEARCH = [
{
"id": "r1",
"title": "Scalable Split Learning and Quantization for Vision–Language Models in Medicine",
"summary": "Studying multi-server split learning, low-bit representation transfer, and privacy–utility trade-offs in medical visual question answering.",
},
{
"id": "r2",
"title": "Foundation-Model Fine-Tuning for Regulatory Genomics",
"summary": "Fine-tuning EPCOT on single-cell multi-omics data to predict gene expression from chromatin accessibility, with reproducible preprocessing and cell-specific evaluation.",
},
{
"id": "r3",
"title": "LLM-Assisted Incentive Design for Mobility Systems",
"summary": "Using structured LLM simulations, bandits, and budget constraints to study data-driven incentives for heterogeneous travelers.",
},
{
"id": "r4",
"title": "AI-Assisted Platform for Scientific Data Analytics",
"summary": "Building a full-stack workflow for materials-science data preparation, interactive model fitting, and human-verified AI assistance.",
},
]


def q(s: str) -> str:
Expand Down Expand Up @@ -57,9 +96,9 @@ def build_author(d: dict) -> str:
given: Tianlang
family: Chen
alternate: {q(ident['name_zh'])}
role: {q(ident['role'])}
role: {q(PUBLIC_ROLE)}
bio: |
{d['bio_long'][0]}
{PUBLIC_BIO}

affiliations:
- name: {q(ident['affiliation'])}
Expand Down Expand Up @@ -96,14 +135,12 @@ def build_author(d: dict) -> str:
Dynamics & Vibrations.

experience:
- role: WeCom Full-Stack Developer, Intern
org: Mars Asia — Global IT Service Center
start: 2024-06-01
end: 2025-05-31
- role: {PUBLIC_INTERNSHIP['role']}
org: {PUBLIC_INTERNSHIP['org']}
start: {PUBLIC_INTERNSHIP['start']}
end: {PUBLIC_INTERNSHIP['end']}
summary: |
Full-stack WeCom development in JavaScript, Node.js and Vue.js. API and
interface work, data migration, and cross-platform retrieval. Built the
automation that kept operations continuous through a system migration.
{PUBLIC_INTERNSHIP['summary']}

skills:
{skills}
Expand Down Expand Up @@ -132,29 +169,20 @@ def build_author(d: dict) -> str:


def project_pages(d: dict) -> dict:
"""slug -> index.md. One per research entry, plus the visible placeholder."""
"""Return the four public research pages shared with the 3D website."""
pages = {}
for r in d["research"]:
pages[r["id"].lower()] = f"""---
for r in PUBLIC_RESEARCH:
pages[r["id"]] = f"""---
title: {q(r['title'])}
summary: {q(r['hook'])}
summary: {q(r['summary'])}
date: 2026-01-01
tags:
- Research
---

{r['detail']}
"""
# The trailing card. Headroom the visitor can see, not a silent gap.
pages["more"] = f"""---
title: {q(d['labels']['research_more'])}
summary: More work is on the way — this slot exists so the room to grow is visible.
date: 2025-12-31
tags:
- Research
---
**University of Michigan · 2026–present**

More projects are in progress.
{r['summary']}
"""
return pages

Expand Down
Loading