feat(site): add Team page and reorganize Community section

- Add new Team page featuring core staff and contributors
- Vijay Janapa Reddi (Nerdy Professor), Andrea Garavagno (Tech Lead),
  Kari Janapareddi (Chief of Staff), Kai Kleinbard (Web Wizard)
- Display community staff side-by-side with fun role titles
- Move Acknowledgments to separate page for MiniTorch/micrograd credits
- Add contributor generator script for future automation
- Update navigation: Team → Ecosystem → Acknowledgments
This commit is contained in:
Vijay Janapa Reddi
2026-02-03 13:41:10 -05:00
parent 0c7509ff35
commit 30a267a793
4 changed files with 551 additions and 14 deletions

View File

@@ -107,7 +107,9 @@ parts:
# Community - Collapsible section
- caption: 🤝 Community
chapters:
- file: team
title: "Team"
- file: community
title: "Ecosystem"
- file: credits
title: "Credits & Acknowledgments"
title: "Acknowledgments"

View File

@@ -1,4 +1,4 @@
# Credits & Acknowledgments
# Acknowledgments
**TinyTorch stands on the shoulders of giants.**
@@ -77,22 +77,132 @@ TinyTorch combines inspiration from these projects into a comprehensive ML syste
## Community Contributors
## ML Systems Book Contributors
TinyTorch is built by students, educators, and ML engineers who believe in accessible systems education.
TinyTorch is part of the broader [ML Systems Book](https://mlsysbook.ai) ecosystem. These contributors have helped build the educational foundation that TinyTorch extends.
**[View all contributors on GitHub](https://github.com/harvard-edge/cs249r_book/graphs/contributors)**
```{raw} html
<style>
.contributor-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(75px, 1fr));
gap: 0.75rem;
margin: 1.5rem 0;
}
.contributor {
display: flex;
flex-direction: column;
align-items: center;
text-decoration: none;
color: inherit;
transition: transform 0.15s;
}
.contributor:hover {
transform: translateY(-2px);
}
.contributor img {
width: 52px;
height: 52px;
border-radius: 50%;
border: 2px solid #e5e7eb;
transition: border-color 0.15s;
}
.contributor:hover img {
border-color: #3b82f6;
}
.contributor .name {
font-size: 0.6rem;
font-weight: 500;
margin-top: 0.35rem;
text-align: center;
max-width: 70px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>
<div class="contributor-grid">
<a href="https://github.com/hzeljko" class="contributor" title="Zeljko Hrcek">
<img src="https://avatars.githubusercontent.com/u/36451783?v=4&s=80" alt="hzeljko" />
<span class="name">Zeljko Hrcek</span>
</a>
<a href="https://github.com/Mjrovai" class="contributor" title="Marcelo Rovai">
<img src="https://avatars.githubusercontent.com/u/17109416?v=4&s=80" alt="Mjrovai" />
<span class="name">Marcelo Rovai</span>
</a>
<a href="https://github.com/jasonjabbour" class="contributor" title="Jason Jabbour">
<img src="https://avatars.githubusercontent.com/u/55008744?v=4&s=80" alt="jasonjabbour" />
<span class="name">Jason Jabbour</span>
</a>
<a href="https://github.com/uchendui" class="contributor" title="Ikechukwu Uchendu">
<img src="https://avatars.githubusercontent.com/u/14854496?v=4&s=80" alt="uchendui" />
<span class="name">Ike Uchendu</span>
</a>
<a href="https://github.com/Naeemkh" class="contributor" title="Naeem Khoshnevis">
<img src="https://avatars.githubusercontent.com/u/6773835?v=4&s=80" alt="Naeemkh" />
<span class="name">Naeem K.</span>
</a>
<a href="https://github.com/Sara-Khosravi" class="contributor" title="Sara Khosravi">
<img src="https://avatars.githubusercontent.com/u/76420116?v=4&s=80" alt="Sara-Khosravi" />
<span class="name">Sara Khosravi</span>
</a>
<a href="https://github.com/didier-durand" class="contributor" title="Didier Durand">
<img src="https://avatars.githubusercontent.com/u/2927957?v=4&s=80" alt="didier-durand" />
<span class="name">Didier Durand</span>
</a>
<a href="https://github.com/18jeffreyma" class="contributor" title="Jeffrey Ma">
<img src="https://avatars.githubusercontent.com/u/29385425?v=4&s=80" alt="18jeffreyma" />
<span class="name">Jeffrey Ma</span>
</a>
<a href="https://github.com/V0XNIHILI" class="contributor" title="Douwe den Blanken">
<img src="https://avatars.githubusercontent.com/u/24796206?v=4&s=80" alt="V0XNIHILI" />
<span class="name">Douwe dB</span>
</a>
<a href="https://github.com/shanzehbatool" class="contributor" title="Shanzeh Batool">
<img src="https://avatars.githubusercontent.com/u/66784337?v=4&s=80" alt="shanzehbatool" />
<span class="name">Shanzeh B.</span>
</a>
<a href="https://github.com/eliasab16" class="contributor" title="Elias">
<img src="https://avatars.githubusercontent.com/u/55062776?v=4&s=80" alt="eliasab16" />
<span class="name">Elias</span>
</a>
<a href="https://github.com/JaredP94" class="contributor" title="Jared Ping">
<img src="https://avatars.githubusercontent.com/u/13906915?v=4&s=80" alt="JaredP94" />
<span class="name">Jared Ping</span>
</a>
<a href="https://github.com/ishapira1" class="contributor" title="Itai Shapira">
<img src="https://avatars.githubusercontent.com/u/122899003?v=4&s=80" alt="ishapira1" />
<span class="name">Itai Shapira</span>
</a>
<a href="https://github.com/jaysonzlin" class="contributor" title="Jayson Lin">
<img src="https://avatars.githubusercontent.com/u/52141513?v=4&s=80" alt="jaysonzlin" />
<span class="name">Jayson Lin</span>
</a>
<a href="https://github.com/sophiacho1" class="contributor" title="Sophia Cho">
<img src="https://avatars.githubusercontent.com/u/67521139?v=4&s=80" alt="sophiacho1" />
<span class="name">Sophia Cho</span>
</a>
<a href="https://github.com/alxrod" class="contributor" title="Alex Rodriguez">
<img src="https://avatars.githubusercontent.com/u/11152802?v=4&s=80" alt="alxrod" />
<span class="name">Alex Rodriguez</span>
</a>
<a href="https://github.com/korneelf1" class="contributor" title="Korneel Van den Berghe">
<img src="https://avatars.githubusercontent.com/u/65716068?v=4&s=80" alt="korneelf1" />
<span class="name">Korneel VdB</span>
</a>
<a href="https://github.com/colbybanbury" class="contributor" title="Colby Banbury">
<img src="https://avatars.githubusercontent.com/u/17261463?v=4&s=80" alt="colbybanbury" />
<span class="name">Colby Banbury</span>
</a>
<a href="https://github.com/zishenwan" class="contributor" title="Zishen Wan">
<img src="https://avatars.githubusercontent.com/u/42975815?v=4&s=80" alt="zishenwan" />
<span class="name">Zishen Wan</span>
</a>
</div>
```
## How to Contribute
TinyTorch is open source and welcomes contributions:
- **Found a bug?** Report it on [GitHub Issues](https://github.com/harvard-edge/cs249r_book/issues)
- **Improved documentation?** Submit a pull request
- **Built something cool?** Share it in [GitHub Discussions](https://github.com/harvard-edge/cs249r_book/discussions)
**[See contribution guidelines](https://github.com/harvard-edge/cs249r_book/blob/main/CONTRIBUTING.md)**
**[View all 40+ contributors on GitHub →](https://github.com/harvard-edge/cs249r_book/graphs/contributors)**
## License

View File

@@ -0,0 +1,119 @@
#!/usr/bin/env python3
"""
Generate contributor data for TinyTorch site.
Fetches contributor info from GitHub API and outputs markdown/JSON for the site.
Run this in CI or manually to update the contributors list.
Usage:
python3 scripts/generate_contributors.py > _data/contributors.json
python3 scripts/generate_contributors.py --markdown >> credits.md
"""
import json
import subprocess
import sys
from dataclasses import dataclass
from typing import Optional
@dataclass
class Contributor:
login: str
contributions: int
avatar_url: str
html_url: str
name: Optional[str] = None
def fetch_contributors(repo: str = "harvard-edge/cs249r_book", limit: int = 50) -> list[Contributor]:
"""Fetch contributors from GitHub API using gh CLI."""
cmd = [
"gh", "api", f"repos/{repo}/contributors",
"--paginate",
"--jq", '.[] | select(.type == "User") | {login, contributions, avatar_url, html_url}'
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print(f"Error fetching contributors: {result.stderr}", file=sys.stderr)
return []
contributors = []
for line in result.stdout.strip().split('\n'):
if line:
data = json.loads(line)
contributors.append(Contributor(**data))
# Sort by contributions and limit
contributors.sort(key=lambda c: c.contributions, reverse=True)
return contributors[:limit]
def fetch_user_names(contributors: list[Contributor]) -> list[Contributor]:
"""Fetch real names for top contributors."""
for c in contributors[:20]: # Only fetch names for top 20 to avoid rate limits
cmd = ["gh", "api", f"users/{c.login}", "--jq", ".name"]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0 and result.stdout.strip():
c.name = result.stdout.strip()
return contributors
def generate_json(contributors: list[Contributor]) -> str:
"""Generate JSON output."""
return json.dumps([
{
"login": c.login,
"name": c.name or c.login,
"contributions": c.contributions,
"avatar_url": c.avatar_url,
"html_url": c.html_url
}
for c in contributors
], indent=2)
def generate_markdown(contributors: list[Contributor]) -> str:
"""Generate markdown contributor grid."""
lines = []
lines.append("<!-- AUTO-GENERATED: Do not edit manually. Run scripts/generate_contributors.py -->")
lines.append("")
lines.append("```{raw} html")
lines.append('<div class="contributor-grid">')
for c in contributors:
display_name = c.name or c.login
lines.append(f''' <a href="{c.html_url}" class="contributor" title="{display_name} ({c.contributions} contributions)">
<img src="{c.avatar_url}&s=80" alt="{c.login}" />
<span class="name">{display_name}</span>
<span class="commits">{c.contributions}</span>
</a>''')
lines.append('</div>')
lines.append("```")
return "\n".join(lines)
def main():
import argparse
parser = argparse.ArgumentParser(description="Generate contributor data")
parser.add_argument("--markdown", action="store_true", help="Output markdown instead of JSON")
parser.add_argument("--limit", type=int, default=50, help="Max contributors to include")
parser.add_argument("--with-names", action="store_true", help="Fetch real names (slower)")
args = parser.parse_args()
contributors = fetch_contributors(limit=args.limit)
if args.with_names:
contributors = fetch_user_names(contributors)
if args.markdown:
print(generate_markdown(contributors))
else:
print(generate_json(contributors))
if __name__ == "__main__":
main()

306
tinytorch/site/team.md Normal file
View File

@@ -0,0 +1,306 @@
# Team
**Meet the people building TinyTorch.**
TinyTorch is built by a passionate community dedicated to making ML systems education accessible to everyone.
```{raw} html
<style>
.team-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
gap: 1.5rem;
margin: 2rem 0;
}
.team-member {
display: flex;
flex-direction: column;
align-items: center;
text-decoration: none;
color: inherit;
transition: transform 0.15s;
}
.team-member:hover {
transform: translateY(-4px);
}
.team-member img {
width: 80px;
height: 80px;
border-radius: 50%;
border: 3px solid #e5e7eb;
transition: border-color 0.2s;
}
.team-member:hover img {
border-color: #f97316;
}
.team-member .name {
font-size: 0.85rem;
font-weight: 600;
margin-top: 0.75rem;
text-align: center;
}
.team-member .roles {
font-size: 0.75rem;
margin-top: 0.25rem;
opacity: 0.8;
}
.team-lead {
grid-column: 1 / -1;
display: flex;
align-items: center;
gap: 1.5rem;
padding: 1.5rem 2rem;
background: linear-gradient(135deg, #fff7ed 0%, #ffedd5 100%);
border: 2px solid #fed7aa;
border-radius: 1rem;
margin-bottom: 1rem;
}
.team-lead img {
width: 100px;
height: 100px;
border-radius: 50%;
border: 4px solid #f97316;
flex-shrink: 0;
}
.team-lead .info {
flex: 1;
}
.team-lead .name {
font-size: 1.35rem;
font-weight: 700;
color: #1f2937;
}
.team-lead .role {
font-size: 1rem;
color: #c2410c;
margin-top: 0.25rem;
font-weight: 500;
}
.team-lead .bio {
font-size: 0.9rem;
color: #57534e;
margin-top: 0.5rem;
line-height: 1.5;
}
.team-lead .roles {
font-size: 0.85rem;
margin-top: 0.5rem;
}
.role-legend {
display: flex;
flex-wrap: wrap;
gap: 0.75rem 1.5rem;
margin: 1.5rem 0;
padding: 1rem 1.25rem;
background: #f8fafc;
border-radius: 0.75rem;
font-size: 0.8rem;
}
.role-legend span {
white-space: nowrap;
}
.staff-row {
grid-column: 1 / -1;
display: flex;
justify-content: center;
gap: 2.5rem;
padding: 1rem 0;
}
.team-staff {
display: flex;
flex-direction: column;
align-items: center;
text-decoration: none;
color: inherit;
transition: transform 0.15s;
}
.team-staff:hover {
transform: translateY(-3px);
}
.team-staff img {
width: 64px;
height: 64px;
border-radius: 50%;
border: 2px solid #94a3b8;
transition: border-color 0.15s;
}
.team-staff:hover img {
border-color: #f97316;
}
.team-staff .name {
font-size: 0.85rem;
font-weight: 600;
margin-top: 0.5rem;
text-align: center;
}
.team-staff .role {
font-size: 0.7rem;
color: #64748b;
margin-top: 0.125rem;
text-align: center;
}
.section-label {
grid-column: 1 / -1;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: #94a3b8;
margin-top: 1rem;
margin-bottom: -0.5rem;
}
@media (max-width: 600px) {
.team-lead {
flex-direction: column;
text-align: center;
padding: 1.25rem;
}
.team-lead img {
width: 90px;
height: 90px;
}
.team-staff {
padding: 0.75rem 1rem;
}
}
</style>
<div class="role-legend">
<span>🪲 Bug Hunter</span>
<span>🧑‍💻 Code Warrior</span>
<span>✍️ Documentation</span>
<span>🎨 Design</span>
<span>🧠 Ideas</span>
<span>🔎 Reviewer</span>
<span>🧪 Testing</span>
<span>🛠️ Tooling</span>
</div>
<div class="team-grid">
<div class="team-lead">
<a href="https://github.com/profvjreddi">
<img src="https://avatars.githubusercontent.com/profvjreddi?v=4&s=200" alt="Vijay Janapa Reddi" />
</a>
<div class="info">
<div class="name">Vijay Janapa Reddi</div>
<div class="role">🤓 Nerdy Professor · Harvard University</div>
<div class="bio">Gordon McKay Professor of Electrical Engineering at Harvard. Passionate about creating the next generation of AI engineers.</div>
<div class="roles">🪲 🧑‍💻 🎨 ✍️ 🧠 🔎 🧪 🛠️</div>
</div>
</div>
<div class="section-label">Community Staff</div>
<div class="staff-row">
<a href="https://github.com/AndreaMattiaGaravagno" class="team-staff">
<img src="https://avatars.githubusercontent.com/AndreaMattiaGaravagno?v=4&s=120" alt="Andrea Garavagno" />
<div class="name">Andrea Garavagno</div>
<div class="role">🧭 Tech Lead</div>
</a>
<a href="#" class="team-staff">
<img src="https://ui-avatars.com/api/?name=Kari+Janapareddi&background=f97316&color=fff&size=120" alt="Kari Janapareddi" />
<div class="name">Kari Janapareddi</div>
<div class="role">👑 Chief of Staff</div>
</a>
<a href="https://github.com/kai4avaya" class="team-staff">
<img src="https://avatars.githubusercontent.com/kai4avaya?v=4&s=120" alt="Kai Kleinbard" />
<div class="name">Kai Kleinbard</div>
<div class="role">🌐 Web Wizard</div>
</a>
</div>
<div class="section-label">Contributors</div>
<a href="https://github.com/minhdang26403" class="team-member">
<img src="https://avatars.githubusercontent.com/minhdang26403?v=4&s=160" alt="Dang Truong" />
<span class="name">Dang Truong</span>
<span class="roles">🪲 🧑‍💻 ✍️ 🧪</span>
</a>
<a href="https://github.com/didier-durand" class="team-member">
<img src="https://avatars.githubusercontent.com/didier-durand?v=4&s=160" alt="Didier Durand" />
<span class="name">Didier Durand</span>
<span class="roles">🪲 🧑‍💻 ✍️</span>
</a>
<a href="https://github.com/karthikdani" class="team-member">
<img src="https://avatars.githubusercontent.com/karthikdani?v=4&s=160" alt="Karthik Dani" />
<span class="name">Karthik Dani</span>
<span class="roles">🪲 🧑‍💻</span>
</a>
<a href="https://github.com/avikde" class="team-member">
<img src="https://avatars.githubusercontent.com/avikde?v=4&s=160" alt="Avik De" />
<span class="name">Avik De</span>
<span class="roles">🪲 🧪</span>
</a>
<a href="https://github.com/rnjema" class="team-member">
<img src="https://avatars.githubusercontent.com/rnjema?v=4&s=160" alt="rnjema" />
<span class="name">rnjema</span>
<span class="roles">🧑‍💻 🛠️</span>
</a>
<a href="https://github.com/joeswagson" class="team-member">
<img src="https://avatars.githubusercontent.com/joeswagson?v=4&s=160" alt="joeswagson" />
<span class="name">joeswagson</span>
<span class="roles">🧑‍💻 🛠️</span>
</a>
<a href="https://github.com/AmirAlasady" class="team-member">
<img src="https://avatars.githubusercontent.com/AmirAlasady?v=4&s=160" alt="Amir Alasady" />
<span class="name">Amir Alasady</span>
<span class="roles">🪲</span>
</a>
<a href="https://github.com/jettythek" class="team-member">
<img src="https://avatars.githubusercontent.com/jettythek?v=4&s=160" alt="jettythek" />
<span class="name">jettythek</span>
<span class="roles">🧑‍💻</span>
</a>
<a href="https://github.com/Takosaga" class="team-member">
<img src="https://avatars.githubusercontent.com/Takosaga?v=4&s=160" alt="Takosaga" />
<span class="name">Takosaga</span>
<span class="roles">🪲</span>
</a>
<a href="https://github.com/wz1114841863" class="team-member">
<img src="https://avatars.githubusercontent.com/wz1114841863?v=4&s=160" alt="wzz" />
<span class="name">wzz</span>
<span class="roles">🪲</span>
</a>
<a href="https://github.com/ngbolin" class="team-member">
<img src="https://avatars.githubusercontent.com/ngbolin?v=4&s=160" alt="Ng Bo Lin" />
<span class="name">Ng Bo Lin</span>
<span class="roles">✍️</span>
</a>
<a href="https://github.com/keo-dara" class="team-member">
<img src="https://avatars.githubusercontent.com/keo-dara?v=4&s=160" alt="keo-dara" />
<span class="name">keo-dara</span>
<span class="roles">🪲</span>
</a>
<a href="https://github.com/Kobra299" class="team-member">
<img src="https://avatars.githubusercontent.com/Kobra299?v=4&s=160" alt="Wayne Norman" />
<span class="name">Wayne Norman</span>
<span class="roles">🪲</span>
</a>
<a href="https://github.com/lalalostcode" class="team-member">
<img src="https://avatars.githubusercontent.com/lalalostcode?v=4&s=160" alt="Ilham Rafiqin" />
<span class="name">Ilham Rafiqin</span>
<span class="roles">🪲</span>
</a>
</div>
```
## Join the Team
TinyTorch is open source and we welcome contributors of all experience levels!
**Ways to get involved:**
- 🪲 **Found a bug?** [Report it on GitHub](https://github.com/harvard-edge/cs249r_book/issues)
- 💡 **Have an idea?** [Start a discussion](https://github.com/harvard-edge/cs249r_book/discussions)
- 🧑‍💻 **Want to contribute code?** [See our contributing guide](https://github.com/harvard-edge/cs249r_book/blob/main/CONTRIBUTING.md)
- ✍️ **Improve documentation?** Submit a pull request
**Get recognized:** Comment on any issue or PR with `@all-contributors please add @username for bug, code, doc, or ideas`
## Contact
- **GitHub Issues**: [Report bugs or request features](https://github.com/harvard-edge/cs249r_book/issues)
- **GitHub Discussions**: [Ask questions or share ideas](https://github.com/harvard-edge/cs249r_book/discussions)
- **Project Lead**: [Prof. Vijay Janapa Reddi](https://scholar.harvard.edu/vijay-janapa-reddi) · Harvard University