From 74c9197db49c404af899294c78b3c5077d8df81a Mon Sep 17 00:00:00 2001 From: "Tianlang (Jackie) Chen" <305351710+jackiectl2@users.noreply.github.com> Date: Sat, 26 Sep 2026 18:47:14 -0400 Subject: [PATCH] Align 2D resume content with 3D site --- CLAUDE.md | 5 +- README.md | 10 ++-- content/projects/more/featured.png | Bin 4888 -> 0 bytes content/projects/more/index.md | 9 ---- content/projects/r1/index.md | 8 +-- content/projects/r2/index.md | 8 +-- content/projects/r3/index.md | 8 +-- content/projects/r4/index.md | 8 +-- content/projects/r5/featured.png | Bin 9630 -> 0 bytes content/projects/r5/index.md | 9 ---- data/authors/me.yaml | 12 ++--- tools/sync-profile.py | 84 +++++++++++++++++++---------- 12 files changed, 88 insertions(+), 73 deletions(-) delete mode 100644 content/projects/more/featured.png delete mode 100644 content/projects/more/index.md delete mode 100644 content/projects/r5/featured.png delete mode 100644 content/projects/r5/index.md diff --git a/CLAUDE.md b/CLAUDE.md index 8593f37..84deecb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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) diff --git a/README.md b/README.md index 7eb3572..c184de2 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/content/projects/more/featured.png b/content/projects/more/featured.png deleted file mode 100644 index bde0392ddb9030200e8d6dcf19d4cf233af9ccfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4888 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 K>^z5n*#85^Z@57K diff --git a/content/projects/more/index.md b/content/projects/more/index.md deleted file mode 100644 index 7b8db65..0000000 --- a/content/projects/more/index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "More work coming soon" -summary: More work is on the way — this slot exists so the room to grow is visible. -date: 2025-12-31 -tags: - - Research ---- - -More projects are in progress. diff --git a/content/projects/r1/index.md b/content/projects/r1/index.md index 0e3519f..a70a721 100644 --- a/content/projects/r1/index.md +++ b/content/projects/r1/index.md @@ -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. diff --git a/content/projects/r2/index.md b/content/projects/r2/index.md index 0925a7a..2a40d20 100644 --- a/content/projects/r2/index.md +++ b/content/projects/r2/index.md @@ -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. diff --git a/content/projects/r3/index.md b/content/projects/r3/index.md index ec0ce4f..8618d01 100644 --- a/content/projects/r3/index.md +++ b/content/projects/r3/index.md @@ -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. diff --git a/content/projects/r4/index.md b/content/projects/r4/index.md index 8884f56..f664cc5 100644 --- a/content/projects/r4/index.md +++ b/content/projects/r4/index.md @@ -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. diff --git a/content/projects/r5/featured.png b/content/projects/r5/featured.png deleted file mode 100644 index 714e98574809d81a53a26627e434c22254a67b62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9630 zcmb_ic|4R`+@EfdwMaseJE==omQu(bN!>E(+CsJ%Btya=>&>WJl9ED}A-7V5tTFb= zl6?t-86sOI#*(pn&v`~S-FiRoKkq-!%z2)3&Tl#A{Fd+e-O$76aC2J#qAifmi2e%Ed-=L+_1rw`pIRL6=h7CWDMB?Ymdn zA6>p1czg@*FN6(`6Et73o`{h6_439ex{ZMveJn?R-H@M*K6eVmNAuI*lxX~uHz(<~ z{;2!>-1K_6XZJAt9gz(0nW=@kg)==_%RZmosEZ~GsfR2IYx>0i2cM!(>F67;L!lB9 z1YT_bFF4RYK3?w^3N;5G1H*$G6Zyb*ZO#u>hY8@%p1Dn+f1oDY>Z7!mjNJ+*laPd8 zwGZQgl>aua^L%Tp?S_!Nuehc!^Gydbl@r=sRuzTPII&ZR1%=XM1H2}`d5Lggf(A_e z_(tL#!kaeoS>oNAz7p@GlOSK;1|p*cRfc!~qXtrhPrm|6O_~moXMjKteIdshkjQ@? zRvN$QlWu__t@{X@o@@jhRg1xif2O?keI4vzvPY?q#MXfwn*TN=ppK9S7uD95Niw+c z!2$60khd*RBSJM{3&Px1Y%roegzVQwB?k0mHokFaMW-DA+f6T*M=5G2(D?2!$m!OB zHEgV*9B(5I=D3*&mryUl4XXF~Hcbym>o;T|(%0ZT!X8tIHKVDvpAdnC^{Bf{ zh*bQD&VLj8x@0>A!A|=5lD%fGLuPPe*)&`S&O{|R#l3O3dfx%q)7W^5(Va~=9IN- zmdRQ1!$ZMp-sF@dtonGX=R=`YZB`NhP=~%r#^;y`w8J8YG=U7geh8P!>RawNE zF5fZ27L-?p(Ge`<#w(Tg;xbxzSzUtm9%BpCOy=H%i=F7Q^6bCW!%7miUzG2lDE8-- zja3MhaN`x~_nDs*-=N3V#JV7idm!KO)*&mqO!`>NV{ZKZ&V9IykS4neLFTvQjcc0O z*ZnTozz``Hq~3kb?L46&+#}wtZYbQ{Hzr?vIx2M?bXRs{vR7`q^p<*` zm0a(vp81?(Aq1WH3_mKZ-F(jA-ilB2K$-o)bGsLZy_JXRmZMM0o9w$ue*5g>7W5LcaDZ-J)0hH z`>hY2%>?d0p2BTAAASp-(uBPyl)UcUeersips;T>ZIDtJ<4MMD9N%jlP1aQO=yYOh zsnsIZ_pYdV;HR9aqgc^uY2~e+^s6|X`&9jnQXPZx!nJP(?*a>pf>QtI5xCBkc9iRW zUSb|gi8qjxQdqNzs<%r{Ke!Ro%zKKv*cQ%OM*`n^Umvx#d&TomtgsFXbO|*{7y9$R zM-`sG3${y4@6nz@^oX-C=a=ZWR2&<&0G(d z7e{P2a-=)yHuVlsR|o<{*iOdtQlL9Ci(27=LHq7^#PR_ zLhq4XkPr(<) zXFAUzjNr+t^FKMB7l;alL4e1&BKCN&ahS;6V&g&33tl zbHIEdJM3<6D$lW(Bg>W#M5g9F=C-kSZFj5CF3+uqb-kPMV!!>l-A)&41&Bl!*doro z^gW3as^ltln=CiStGqL0>#IDy#K3p09Eq2o4cQjZRiZLssXR7)-Mh25!E_N9rZ!0= zjmE{e}1KfOkE4B=!JBIzZ{*HdamCo4~qrHAv+b?i3j(A$!N;V z1lGgU=z)Ax3iy<;xBBcGPEYEDgE2Z{c9cNLX=6ThMCa<#NJXzqg?%fuHZRYAaaruI zBA0ZVTwGe9j}nOEsX5Nn=^D>B7UHzD9OrKOl;8PuKF6TOAW@b17-MeFI6dK0w!XdV z82KFgKj$-uZO^WnMXP$oC>dUooDy(0e#+rI5L7v)2Y(~>kXpg#!%L~{@Hd|x-u~=r zY3WSV85X{6k%3*+{z{tSKZ=%%eI-#X=PKNWoZa~WF@6J1&PfqqR~lI#>%)`ccj6d4sf`i4 z4PjI8$wW7!!+;f-giE#8-$_06n>Z;S#g6N11cAMR4E1J6|2lz!{Ml4SehMRl3% z*?-I*VJ*Gi+JIgoqFqv^Ga)kG9X*zfVMnF0DnqKm=U5D7F;ZM-S$tB0*QHpwT>Q`$ zFH$sk(xu`4((vY-8QSo=1($o03vr%#;J@{CC!*v+U7pH&(;B5u_wzFY20B6ix@Oiq zhY50%yHrh9Qlk>&l3x>dX|OUjjXPIy&>ffYcK_3hK~lF5n+rR+){b;qh1k@;8nlb! zv7+x#=6#z@&tMup#t=I_{hS?vzntfQ^yb_{lecPuaG@&wlU8P84X;!>+N$K%ydM8E zMq4w`+HDiMP8TcVJz@)OigIAXo#}r)l=+5-LNykX&DGK*28o7J)0)g;S{oR?+^`XM zcqh-92@TQD>|1kG9K+EE+I|y^jR6*IlEBWd+9h}Hm5cLd#b|oeL#P3 zU|r_JNDQ7_)Pvnf7dr60Nj=Jydp@$r6c|-xyxOUwzoAxhjO(&&U8h=WouOL;u4o+* zUAy~h`f>HiqQca}$ofLyHi37zw#6Iu)rz0lo;7M!chVmEl1LG+F(dP-*+)s9()Zi# zk6-%NoF~|%qgVBJrCAd?6N z)YuXx*YuTD(^A@cu0kFqi@!Vl@OD|scQH(zX_{p@jIH zl7{#OD4)9~Y$RaB4LFa$KkicQyjI6|C?C$>@tA?FFvSWSYG-G-@@AL46M`}Bb5G42J^gSPh#)-t`mDOD&6@WXx5dnP zawVeLxI~Zg*I|tNX`!fwV7j{hm?nk-yv;}LK_hG~+ zGd+K)+MV3qy=*HSChWb-hO!Vy`A%w9M;+XhVI$$?6CWS9ox$|6{ ztWD6Kh#cd(%e=o93*4#@Q+M^>CRNkKE+Ey_eFd;KFihY)U6A*MHY%?c*SAbNAA7O* zZW3SGT*bW?_LhEHw=u8guT`2h6#IIBzrJ5yzpz&y&)leA*pqdu8`pDgsNlf8zbf!cFEFLqS6|#?AEO5LlQ?TeWXbv}sGrEj4t(dT|tKjr#jF=AZ(vZ0KC`M!*ivLsP{ZBe?Fp4W1!orLmIUkiFXg5@DKv`AX zoL}UVH_%n*kJf`HLSrTFlBK}9T~QJ=6sq>PxJoKjDe=pZM=!yQrM0i--ub!Y8n8ik zeE(u%2$HcXp&KP(4$kw4ZzulzU+G)7E#~DF@W#MxeBQlW=BzlO_%Phz8gcXtzLL*M zTpG@}*-*O^J?)O2=go@`{!#<^IyYtZp-7n8a&zW4wk>#Ea-+D1X;M z%6}<;;BRAx$8+`2a^N*{cnV~rJK49P1oy4f3!RnfX59H`xi{9xm+y*jg)~9>$l02P z4%N;(4=kqhfG2&<$+-2vuPHia-aAoPCWc>Xp^KYD8f@*&em7!~lKF6=( z$EbR3cE$C2&ZYM(KF8{dhxtU>%7u+t})^8g9afwBWD1v2>;8CEr183=28MTnXk`e=2sc%F&%TJ~+^J zHP)WRlS9CJ%2cM-qP*8TRcCWAJPa7G8L<2{^e3At`{7|pWz^@9{d!4J*}&k zBK?bsxcvQfC=KBauxs`ah{S0K6Ut&veJhf~nX%X&t z%ggDOfd2SXMr`K4pir4cWwoqEECI?9rcr;xjJT0C=g0`+uUWtB5t4KTQO@C*nnDm6 zK>mn0dfKAyvo~Fia~DWH_=9RNQg8^;YqhlD;u}>-+#LViMrF$88;Iy>W45|5&l>?d z=e^`$wok^2|Ghrv2>4Lr3H0>8Q38u($GHsS9Wa?RsjS6_|Ddj#R@7k_&qU?Rv(+Y7 zw_-BTr{p&KnR<0T!OFyeFeFE9q*gimv+BvV1qEVB%uy@2AUK|z4*?(?*jJWkR4cz% z?+&zS2JR3+-QQ8FJL3p*Uyz(*a(;j1Uext$m|u3}CB#(|BIS|T#UV(82ONOrMgwGb z0Cs3m4mchn`t@GIAe)OD*-#Tn=|Wp#nMzCqI2a5eVVDF$(-_ZLiXmOh z^OYN2C_ET)(dit7ghl_-QM?_;R#xnjSz{r-U;x7%uBLO4(qR)cm-U3bLZrytnIRV> z7asCkOhc06m>A+8(Cep{EZjg|Jn!163tz}Ab!wf+8WK6&`77P20~=viVeJnB1u?jN zKv*a4#=n@%txb&4H*#8D3|IYQz{6()<0{C;#LFA{24b2)P!Q?jxMu-SJRZ4}Jf)Bw z?nfQ*d{Uz}KCNt4y1#A_GQDAX7Ms@8T#_$pKD0|k{b_2) zzP+vz1SRVTSGy5{`7ODV;vfPrQL+~3uWe>03EDrvbi7r}%HD_L!GWOb4Em@z&4)0d zZ0#v_tB0K=yz1&b%g2rhmLUG#{G{+v;nv81Qfw9<*f`_)&lmWP#5Y}Yzif&9l4Ac^ zSZcwNVQAz+nhkUyZyrlY-8p;P80NL!J9K{R6Xu%6*!`wFLQSB=^3u|An9l-KA zn&PqX_)kN@w>#{gI*?snF>d%<48O`x2LSLVk1!^h8(Nv}%5PAn_|wc7;J53I%BYUO zDJO5!JWZ6cAG4I2oDiik4zu)NDph%M|?k;Dr8^;$KSI|OaTs|xi+NHZ>Y-W zt#+THDx=(MLlCr>wRcf_V;JQs;77-u&`}%x5>PymNIW>l9XWJv=Z?^0Sv{GQ`2ery z)h@G+^#f&14({}>mA>3@HS$M=ZhU?0KV$(~QNJ!j!E_&3ll0>c{hs117vG!?pnO!= z@v@=*MArDsO?B^Cof5}M;oC%#Su@S0bL8>L^c$JQ$JcUq6jVy4XcuFrN**$*{&U-8 zMgI*!eP7XgD}RGYoHxKYK?WPm1d9_SDlv@_l#YwcMB4(7BBIwLmOCN&M)S^~75qLD z%_GxH{2paNgzkAyVolyVWdSoXkj&L=>XqBAjwH)4xE1jWfB$fyI9R$B5=ZHWm1E8>2+~5bR~hywIv@hCvLokz_t%B8Jq4l zVjC&q@ObYF%Y~QZpazFW`UnaNqAhUOc=bst9{?<9nKheKHeWZ-^gpz`=YK*kz_7zQXa z!2zA^A*f6CP9J;>oHN9~QIk^;FZ&OajWh$-y{vKI!V~WSCoXBrFcDX#2RNxP?x5dB zd(21;9y9@9oP|W-$02=PEb;CN$@}y}zui7fH2tYfP6Jf8%_5E^lp$JrOwT@;B%nGI z+~G(4k%a(0`ty!_>niBOhko}&%;-~Vi*ZEZ0l?vMz2K{6zSCTi#gQ$@9l__=_ZtM+15;mmfWwd%1K) z^kY8!{`!4VCxtgioG%=0zGxooptiKEs+Cuk?$KeIZjtShBme4csA#-M0k?nJ>$dH_ zLD3kqi*#-~CESZLg{YD2ocQdOQO&$EQqGa#cYgMwMpBc?4MpTaNdnhD+wi6=LG9(# zZL;gz$}uTcbkmNmU+hZ1dnR*S)lBAjAW2Avp;&?dqg|5VBT0CPfVCQD>S5qmkmO8Q zy?LqzaW&Xa6g`FWYk;@vH=Zi%P=U9Th0DI(U?;zUciI~Et)av4FoM6vt)Y#`W?|ko z0=N!bIj8++5Ok|>PzTd4AotS4bq2PYFx>^Wjo%FljHkJl=}vCB39m8}bZo5I-@qL= z{j~m3^Z<0$sN{}_?A1S!*=0v7lw}seQ-B0==cmNCaiwsi?SER$@c{!zX`H~rn|z6P zFp^z!e+8rF)tfBa135Loe{0lfDsI;`2b}}2eiP^$3eJSWf4vj`=4NV=*;s>o z_v#))h$fq`;r6Zv^4` z2Le85oLR%hTFO7EfpA0{Yy<-xk%35GjXkS6fkLbut@{Mo8WPn^>3-S^>0c_VyF&>~ zs+Y~viPTLveyyAM&(#4_X{Qiwfk6~OE|;0=xOsVvCf3O7vbr26{)I)q-8cf(uNGQ3 z9$@OOPILG#qG7)j()5qIrUW) zx0w|H%&XGx)^?3}4M>f_*K(1ctnFH2-?8+4gBd)2=S_i$PH;qLBYR5s8{WOP>SVQ+ z10-e$GgBjcI zhS@%|W@eR%HAM$7rhsQ~wbW!ywZ)IM2?<-)^hIdGt4%;FLW)@uBeA9=<|oBHYs-DK zSL5!ls6FI(wSwq}wT0&Z6*PoYod7so1V|$R+&c7)Kd;h&PzH*tY6X>38uX;bq%{#V OQ75!9N7FQ|uKo`Oq0{#O diff --git a/content/projects/r5/index.md b/content/projects/r5/index.md deleted file mode 100644 index dcd152d..0000000 --- a/content/projects/r5/index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Functional Genomic Representation Learning for Microbial Communities" -summary: "A parameter-free way to turn a whole microbial community into one honest vector." -date: 2026-01-01 -tags: - - Research ---- - -Proteogenic k-mer tokenization yields interpretable, parameter-free genome encodings that plug into both classical statistics and pretrained sequence models (Evo, ESM, ProtT5). Abundance-weighted community embeddings, leakage-safe features, permutation tests and honest cross-validation. diff --git a/data/authors/me.yaml b/data/authors/me.yaml index bb1f10e..a66880a 100644 --- a/data/authors/me.yaml +++ b/data/authors/me.yaml @@ -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" @@ -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" diff --git a/tools/sync-profile.py b/tools/sync-profile.py index e486f9e..95852b5 100755 --- a/tools/sync-profile.py +++ b/tools/sync-profile.py @@ -1,12 +1,12 @@ #!/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// one folder per research project + content/projects// 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. @@ -14,8 +14,9 @@ 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 @@ -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: @@ -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'])} @@ -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} @@ -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