This issue logs the round of site updates shipped in three commits (now live on main / GitHub Pages). Filing this so the rationale, file layout, and operating instructions are searchable later.
Commits
| SHA |
Title |
cb22d18 |
Add 2026 internship recruitment section |
526eedb |
Scaffold Mentors, Interns, and Leadership people sections |
ba1d9a0 |
Auto-roll program year from year-keyed cohorts data |
1. Recruitment section (#join)
New section added between #interns and #projects consolidating the LinkedIn post + Google-Form recruitment material:
- Three role cards: Mentee →
https://lnkd.in/gTCmQJiV, Mentor → https://lnkd.in/gB5psM_r, Leadership → mailto:internship@cabsweb.org.
- Key-facts strip: program window, application deadline, target cohort size, non-paid / 501(c)(3) / no-CPT.
- Timeline with four dated milestones (Jan 1 open → May 15 deadline → Jun 15 start → Aug 15 end).
- Contact strip:
internship@cabsweb.org, fundraising@cabsweb.org, shicheng.guo@cabsweb.org.
Nav got an Apply link; footer Explore list got the same. The existing "Summer & Winter Internships" learn-card was repointed at #join (was pointing at the GitHub repo).
Normalizations applied at write time:
- Source material was inconsistent on 10-week vs 12-week — went with ~10 weeks to match the public program description (Jun 15 – Aug 15 is ~9 weeks).
- Source had
shihcheng.guo@gmail.com (personal) and shicheng.guo@cabsweb.org (org, different spelling) — used the org address on the public page.
2. People sections (Mentors / Interns / Leadership)
Switched the 2026 cohort from project-centric to person-centric cards.
- New top sections in order:
#mentors → #interns → #leadership (before #join).
- Cards show: avatar, name, affiliation/major/role, interest/expertise tags, project link (interns only), LinkedIn + GitHub icon links.
- Headshots load from
assets/img/people/<firstname-lastname>.jpg. Convention documented in assets/img/people/README.md.
- Initials-avatar fallback drawn in CSS using the brand gradient — page stays presentable even with zero headshots uploaded, and survives 404s via an
<img onerror> handler.
- Empty-state CTAs for each people grid double as recruitment buttons ("Become a mentor →", "Apply as mentee →", "Express interest →") so the page is meaningful before any mentor / leadership data is populated.
- Nav: replaced
2026 Cohort with Mentors + Interns; footer Explore picked up Leadership too.
- 8 existing intern project entries were expanded to 11 person entries (multi-author projects
OpenRepurpose and CausalSentinel were split into individual people). Hero "intern projects" stat now counts distinct projects, not person rows — number is unchanged.
How to populate
Edit assets/js/projects.js → cohorts[<year>].mentors / .interns / .leadership. All fields except name are optional; missing fields are skipped in the rendered card.
{
name: "Jane Doe",
affiliation: "Stanford University",
role: "Postdoc, Computational Biology", // mentors / leadership
major: "MS, Statistics", // interns
interests: ["single-cell genomics", "RWE"],
headshot: "assets/img/people/jane-doe.jpg", // optional
linkedin: "https://www.linkedin.com/in/janedoe",
github: "https://github.com/janedoe",
project: { name: "OpenTrial", // interns only
url: "https://github.com/ds4cabs/OpenTrial",
desc: "Open infrastructure for clinical trial intelligence." },
org_role: "Operations Co-Lead" // leadership only
}
3. Automatic year rollover
The "2026" / dates in titles, key facts, timeline, hero stat label, mailto subjects, and recruitment copy used to be hand-edited. Now they are driven by a single year-keyed config in assets/js/projects.js:
cohorts: {
2026: {
year: 2026,
dates: { open, deadline, start, end, window },
target_size: "20+",
mentors: [...], interns: [...], leadership: [...]
}
}
main.js picks the highest year key in cohorts and substitutes three template attributes throughout the static HTML:
| Attribute |
Resolves to |
<span data-year>2026</span> |
cohort.year |
<span data-cohort="dates.window">Jun 15 – Aug 15, 2026</span> |
Dotted-path lookup against the cohort |
<a data-tpl-href="mailto:...?subject={year}%20..."> |
{year} substituted into the href |
To roll the site to 2027
Add a 2027: { ... } block in cohorts and ship. All of these flip automatically: section titles, chips, hero CTA, intern-projects stat label, key-facts strip, timeline (Jan 1 / May 15 / Jun 15 / Aug 15 of the new year), mailto subjects, and the three people grids.
Intentional non-features
- No calendar-based auto-flip on Jan 1. Rolling over requires populating
cohorts[year] first — avoids the page advertising a year for which there is no data.
- No archive of prior years on the live site yet. When 2027 ships, 2026 will disappear from the page (still in git history). A "past cohorts" archive page is a follow-up if wanted.
- Project descriptions in the
all list are not templated. Strings like "(2026 cohort)" describe specific repos and are permanent provenance markers.
SEO / no-JS behavior
Every templated element keeps its literal 2026 (or full date) as fallback text inside the tag. Crawlers and no-JS visitors see a coherent page that reads as 2026; JS upgrades the text in place when it loads.
Files touched
index.html — three new sections (#mentors, #interns rebuilt, #leadership, #join), nav + footer links, template attributes.
assets/js/projects.js — new cohorts[year] structure with full schema in comments.
assets/js/main.js — pickCohort(), applyTemplates(), personCard() / avatar() / initials(), inline LinkedIn + GitHub SVGs.
assets/css/style.css — .person-card, .avatar*, .person-tags, .person-project, .person-link, .empty-cta, plus the recruitment-section pieces (.facts, .cards-join, .role-list, .timeline, .contact-strip).
assets/img/people/README.md — headshot naming convention + ImageMagick crop snippet.
Open follow-ups
This issue logs the round of site updates shipped in three commits (now live on
main/ GitHub Pages). Filing this so the rationale, file layout, and operating instructions are searchable later.Commits
cb22d18526eedbba1d9a01. Recruitment section (
#join)New section added between
#internsand#projectsconsolidating the LinkedIn post + Google-Form recruitment material:https://lnkd.in/gTCmQJiV, Mentor →https://lnkd.in/gB5psM_r, Leadership →mailto:internship@cabsweb.org.internship@cabsweb.org,fundraising@cabsweb.org,shicheng.guo@cabsweb.org.Nav got an
Applylink; footer Explore list got the same. The existing "Summer & Winter Internships" learn-card was repointed at#join(was pointing at the GitHub repo).Normalizations applied at write time:
shihcheng.guo@gmail.com(personal) andshicheng.guo@cabsweb.org(org, different spelling) — used the org address on the public page.2. People sections (Mentors / Interns / Leadership)
Switched the 2026 cohort from project-centric to person-centric cards.
#mentors→#interns→#leadership(before#join).assets/img/people/<firstname-lastname>.jpg. Convention documented inassets/img/people/README.md.<img onerror>handler.2026 CohortwithMentors+Interns; footer Explore picked upLeadershiptoo.OpenRepurposeandCausalSentinelwere split into individual people). Hero "intern projects" stat now counts distinct projects, not person rows — number is unchanged.How to populate
Edit
assets/js/projects.js→cohorts[<year>].mentors/.interns/.leadership. All fields exceptnameare optional; missing fields are skipped in the rendered card.3. Automatic year rollover
The "2026" / dates in titles, key facts, timeline, hero stat label, mailto subjects, and recruitment copy used to be hand-edited. Now they are driven by a single year-keyed config in
assets/js/projects.js:main.jspicks the highest year key incohortsand substitutes three template attributes throughout the static HTML:<span data-year>2026</span>cohort.year<span data-cohort="dates.window">Jun 15 – Aug 15, 2026</span><a data-tpl-href="mailto:...?subject={year}%20...">{year}substituted into the hrefTo roll the site to 2027
Add a
2027: { ... }block incohortsand ship. All of these flip automatically: section titles, chips, hero CTA, intern-projects stat label, key-facts strip, timeline (Jan 1 / May 15 / Jun 15 / Aug 15 of the new year), mailto subjects, and the three people grids.Intentional non-features
cohorts[year]first — avoids the page advertising a year for which there is no data.alllist are not templated. Strings like"(2026 cohort)"describe specific repos and are permanent provenance markers.SEO / no-JS behavior
Every templated element keeps its literal
2026(or full date) as fallback text inside the tag. Crawlers and no-JS visitors see a coherent page that reads as 2026; JS upgrades the text in place when it loads.Files touched
index.html— three new sections (#mentors,#internsrebuilt,#leadership,#join), nav + footer links, template attributes.assets/js/projects.js— newcohorts[year]structure with full schema in comments.assets/js/main.js—pickCohort(),applyTemplates(),personCard()/avatar()/initials(), inline LinkedIn + GitHub SVGs.assets/css/style.css—.person-card,.avatar*,.person-tags,.person-project,.person-link,.empty-cta, plus the recruitment-section pieces (.facts,.cards-join,.role-list,.timeline,.contact-strip).assets/img/people/README.md— headshot naming convention + ImageMagick crop snippet.Open follow-ups
cohorts[2026].mentorsonce mentor list is collected.cohorts[2026].leadershiponce the org team is finalized.affiliation/major/interests/linkedin/githubfor each of the 11 existing intern entries.assets/img/people/and add theheadshot:field for each person.cohorts[year]blocks once 2027 ships.