Merge latest dev updates into feat/volume-restructure

This commit is contained in:
Vijay Janapa Reddi
2026-01-21 19:30:00 -05:00
18 changed files with 2778 additions and 199 deletions

View File

@@ -1,75 +0,0 @@
name: '📚 Book Update Contributors'
on:
workflow_call:
workflow_dispatch:
# =============================================================================
# PATH CONFIGURATION - Uses GitHub Repository Variables (Settings > Variables)
# =============================================================================
# MLSysBook content lives under book/ to accommodate TinyTorch at root
# Use ${{ vars.BOOK_ROOT }}, ${{ vars.BOOK_QUARTO }}, etc. in workflow steps
# Variables: BOOK_ROOT, BOOK_DOCKER, BOOK_TOOLS, BOOK_QUARTO, BOOK_DEPS
jobs:
update-contributors:
name: Update Contributors List
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r ${{ vars.BOOK_DEPS }}/requirements.txt
pip install PyGithub>=1.55
- name: Configure Git
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Update contributors (script)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: python ${{ github.workspace }}/.github/workflows/contributors/update_contributors.py
- name: Update contributors (cli)
run: npx --yes all-contributors-cli generate
- name: Check for changes
id: update
run: |
if git status .all-contributorsrc README.md ${{ vars.BOOK_QUARTO }}/contents/frontmatter/acknowledgements/acknowledgements.qmd --porcelain | grep .; then
echo "changes_made=true" >> $GITHUB_OUTPUT
else
echo "changes_made=false" >> $GITHUB_OUTPUT
fi
- name: Commit Changes
if: steps.update.outputs.changes_made == 'true'
run: |
BRANCH_NAME=${GITHUB_HEAD_REF:-$(git rev-parse --abbrev-ref HEAD)}
git add .all-contributorsrc README.md ${{ vars.BOOK_QUARTO }}/contents/frontmatter/acknowledgements/acknowledgements.qmd
git commit -m "Update contributors list [skip ci]"
git pull --rebase origin "$BRANCH_NAME"
git push origin "$BRANCH_NAME"
- name: Report Status
run: |
if [ "${{ steps.update.outputs.changes_made }}" = "true" ]; then
echo "✅ Contributors list has been updated"
else
echo " No changes were needed for contributors list"
fi

149
.github/workflows/contributors/README.md vendored Normal file
View File

@@ -0,0 +1,149 @@
# Contributor Management Scripts
This folder contains scripts for managing contributor recognition across the repository.
## Overview
The contributor system tracks contributions to four projects:
- **book/** - ML Systems textbook
- **tinytorch/** - Educational ML framework
- **kits/** - Hardware kits
- **labs/** - Lab exercises
Each project has its own `.all-contributorsrc` file, and the main `README.md` displays all contributors in organized sections.
## Scripts
### `update_contributors.py`
Updates the root `.all-contributorsrc` from GitHub API.
```bash
# Requires GITHUB_TOKEN environment variable
python update_contributors.py
```
**What it does:**
- Queries GitHub API for all repository contributors
- Resolves git emails to GitHub usernames
- Generates gravatar URLs for non-GitHub contributors
- Merges new contributors with existing entries
### `generate_main_readme.py`
Generates the sectioned contributor table in the main `README.md`.
```bash
python generate_main_readme.py [--dry-run]
```
**What it does:**
- Reads all four project `.all-contributorsrc` files
- Generates HTML tables with contributor avatars and badges
- Updates the Contributors section in `README.md`
- Creates sections: Book, TinyTorch, Kits, Labs
### `generate_readme_tables.py`
Updates per-project README files with contributor tables.
```bash
python generate_readme_tables.py [--project PROJECT] [--update]
```
**Options:**
- `--project`: Process only one project (book, tinytorch, kits, labs)
- `--update`: Actually update the README files (without this, just prints)
**What it does:**
- Reads each project's `.all-contributorsrc`
- Generates HTML contributor tables
- Updates the `<!-- ALL-CONTRIBUTORS-LIST -->` section in each project's README
### `scan_contributors.py`
Scans git history to discover contributors (manual/one-time use).
```bash
python scan_contributors.py [--project PROJECT] [--output FORMAT] [--update]
```
**Options:**
- `--project`: Scan only one project
- `--output`: Output format (table, json, rc)
- `--update`: Update `.all-contributorsrc` files directly
- `--dry-run`: Preview changes without writing
**What it does:**
- Analyzes git commit history per project folder
- Categorizes contributions (code, doc, bug, etc.) from commit messages
- Maps git emails to GitHub usernames
- Filters out bots and AI tools
## Workflow Integration
The `update-contributors.yml` workflow runs these scripts automatically:
```
Trigger: Push to dev/main with .all-contributorsrc changes
OR manual dispatch
Steps:
1. update_contributors.py → Update root config from GitHub API
2. generate_main_readme.py → Rebuild main README sections
3. generate_readme_tables.py → Update per-project READMEs
4. Commit and push changes
```
## Adding Contributors
### Method 1: Bot Command (Recommended)
Comment on any issue or PR:
```
@all-contributors please add @username for doc, code, bug, or ideas
```
### Method 2: Manual Edit
1. Edit the appropriate `.all-contributorsrc` file
2. Add entry with: login, name, avatar_url, contributions
3. Run the workflow or scripts manually
## Contribution Types
| Type | Emoji | Description |
|------|-------|-------------|
| bug | 🐛 | Bug reports |
| code | 💻 | Code contributions |
| doc | 📖 | Documentation |
| design | 🎨 | Design work |
| ideas | 💡 | Ideas and suggestions |
| review | 👀 | Code review |
| test | 🧪 | Testing |
| tool | 🔧 | Tools and infrastructure |
| tutorial | ✅ | Tutorials |
| maintenance | 🚧 | Maintenance |
See [All Contributors emoji key](https://allcontributors.org/docs/en/emoji-key) for full list.
## File Structure
```
.github/workflows/
├── update-contributors.yml # Workflow definition
└── contributors/
├── README.md # This file
├── requirements.txt # Python dependencies
├── update_contributors.py # GitHub API updater
├── generate_main_readme.py # Main README generator
├── generate_readme_tables.py # Per-project README generator
└── scan_contributors.py # Git history scanner
Project configs:
├── .all-contributorsrc # Root config (legacy)
├── book/.all-contributorsrc # Book contributors
├── tinytorch/.all-contributorsrc # TinyTorch contributors
├── kits/.all-contributorsrc # Kits contributors
└── labs/.all-contributorsrc # Labs contributors
```

View File

@@ -0,0 +1,245 @@
#!/usr/bin/env python3
"""
Generate the main README.md contributor section from all project configs.
This script reads the .all-contributorsrc files from each project
(book, tinytorch, kits, labs) and generates a sectioned contributor
table for the main README.md.
Usage:
python generate_main_readme.py [--dry-run]
"""
import json
import re
import sys
from pathlib import Path
# Contribution type to emoji mapping
CONTRIBUTION_EMOJIS = {
"bug": "🐛",
"code": "💻",
"design": "🎨",
"doc": "📖",
"ideas": "💡",
"review": "👀",
"test": "🧪",
"tool": "🔧",
"tutorial": "",
"maintenance": "🚧",
"infra": "🚇",
"question": "💬",
"translation": "🌍",
"content": "🖋",
"example": "💡",
"security": "🔐",
"financial": "💵",
"fundingFinding": "🔍",
"eventOrganizing": "📋",
"talk": "📢",
"video": "📹",
"audio": "🔊",
"data": "🔣",
"platform": "📦",
"projectManagement": "📆",
"mentoring": "🧑‍🏫",
"plugin": "🔌",
"userTesting": "📓",
"a11y": "♿️",
"business": "💼",
"research": "🔬",
"promotion": "📣",
}
def load_config(path: Path) -> dict:
"""Load a .all-contributorsrc file."""
if not path.exists():
return {"contributors": []}
with open(path) as f:
return json.load(f)
def generate_contributor_cell(contributor: dict, show_badges: bool = True) -> str:
"""Generate HTML for a single contributor cell."""
login = contributor.get("login", "")
name = contributor.get("name", login)
avatar_url = contributor.get("avatar_url", "")
profile = contributor.get("profile", f"https://github.com/{login}")
contributions = contributor.get("contributions", [])
# Generate badge string
badges = ""
if show_badges and contributions:
badges = " ".join(CONTRIBUTION_EMOJIS.get(c, "") for c in contributions)
badges = f"<br />{badges}" if badges.strip() else ""
return f''' <td align="center" valign="top" width="14.28%"><a href="{profile}"><img src="{avatar_url}?v=4?s=80" width="80px;" alt="{name}"/><br /><sub><b>{name}</b></sub></a>{badges}</td>'''
def generate_contributor_table(contributors: list, show_badges: bool = True) -> str:
"""Generate an HTML table for contributors."""
if not contributors:
return "<p><em>Coming soon!</em></p>"
rows = []
row_cells = []
for i, contributor in enumerate(contributors):
row_cells.append(generate_contributor_cell(contributor, show_badges))
# 7 contributors per row
if len(row_cells) == 7:
rows.append(" <tr>\n" + "\n".join(row_cells) + "\n </tr>")
row_cells = []
# Add remaining cells
if row_cells:
rows.append(" <tr>\n" + "\n".join(row_cells) + "\n </tr>")
return f'''<table>
<tbody>
{chr(10).join(rows)}
</tbody>
</table>'''
def generate_sectioned_contributors(repo_root: Path) -> str:
"""Generate the full sectioned contributor section showing ALL contributors."""
# Load all configs
book_config = load_config(repo_root / "book" / ".all-contributorsrc")
tinytorch_config = load_config(repo_root / "tinytorch" / ".all-contributorsrc")
kits_config = load_config(repo_root / "kits" / ".all-contributorsrc")
labs_config = load_config(repo_root / "labs" / ".all-contributorsrc")
book_contributors = book_config.get("contributors", [])
tinytorch_contributors = tinytorch_config.get("contributors", [])
kits_contributors = kits_config.get("contributors", [])
labs_contributors = labs_config.get("contributors", [])
# Count contributors
book_count = len(book_contributors)
tinytorch_count = len(tinytorch_contributors)
kits_count = len(kits_contributors)
labs_count = len(labs_contributors)
# Generate tables - show ALL contributors
book_table = generate_contributor_table(book_contributors)
tinytorch_table = generate_contributor_table(tinytorch_contributors)
kits_table = generate_contributor_table(kits_contributors)
labs_table = generate_contributor_table(labs_contributors)
return f'''## Contributors
Thanks goes to these wonderful people who have contributed to making this resource better for everyone ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
### 📖 Textbook Contributors ({book_count})
<!-- BOOK-CONTRIBUTORS-START -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
{book_table}
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- BOOK-CONTRIBUTORS-END -->
---
### 🔥 TinyTorch Contributors ({tinytorch_count})
<!-- TINYTORCH-CONTRIBUTORS-START -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
{tinytorch_table}
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- TINYTORCH-CONTRIBUTORS-END -->
---
### 🛠️ Hardware Kits Contributors ({kits_count})
<!-- KITS-CONTRIBUTORS-START -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
{kits_table}
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- KITS-CONTRIBUTORS-END -->
---
### 🧪 Labs Contributors ({labs_count})
<!-- LABS-CONTRIBUTORS-START -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
{labs_table}
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- LABS-CONTRIBUTORS-END -->
---
**Recognize a contributor:** Comment on any issue or PR:
```
@all-contributors please add @username for doc, code, bug, or ideas
```'''
def update_readme(repo_root: Path, dry_run: bool = False) -> bool:
"""Update the main README.md with sectioned contributors."""
readme_path = repo_root / "README.md"
if not readme_path.exists():
print(f"ERROR: README.md not found at {readme_path}")
return False
content = readme_path.read_text()
# Generate new contributor section
new_section = generate_sectioned_contributors(repo_root)
# Pattern to match the entire Contributors section
# From "## Contributors" to just before the next "---" followed by a div or end of file
pattern = r'## Contributors\n.*?(?=\n---\n\n<div align="center">|\Z)'
if not re.search(pattern, content, re.DOTALL):
print("ERROR: Could not find Contributors section in README.md")
return False
# Replace the section
new_content = re.sub(pattern, new_section, content, flags=re.DOTALL)
if dry_run:
print("=== DRY RUN - Would update README.md with: ===")
print(new_section[:2000] + "..." if len(new_section) > 2000 else new_section)
return True
readme_path.write_text(new_content)
print(f"Updated {readme_path}")
return True
def main():
dry_run = "--dry-run" in sys.argv
# Find repo root (this script is in .github/workflows/contributors/)
script_dir = Path(__file__).parent
repo_root = script_dir.parent.parent.parent
# Verify we're in the right place
if not (repo_root / "README.md").exists():
print(f"ERROR: Cannot find README.md in {repo_root}")
sys.exit(1)
success = update_readme(repo_root, dry_run)
sys.exit(0 if success else 1)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,169 @@
#!/usr/bin/env python3
"""
Generate All Contributors tables for README files.
This script reads .all-contributorsrc files and generates the HTML tables
that go in the README.md files.
Usage:
python generate_readme_tables.py [--project PROJECT] [--update]
"""
import json
import re
import argparse
from pathlib import Path
PROJECTS = {
"book": "book/",
"kits": "kits/",
"labs": "labs/",
"tinytorch": "tinytorch/",
}
# Emoji mapping for contribution types
EMOJI_KEY = {
"bug": "🐛",
"code": "💻",
"doc": "📖",
"design": "🎨",
"ideas": "💡",
"review": "👀",
"test": "🧪",
"tool": "🔧",
"translation": "🌍",
"tutorial": "",
"video": "📹",
"question": "💬",
"maintenance": "🚧",
"infra": "🚇",
"platform": "📦",
"projectManagement": "📆",
"research": "🔬",
}
def generate_contributor_cell(contributor: dict, image_size: int = 80) -> str:
"""Generate HTML for a single contributor cell."""
login = contributor['login']
name = contributor.get('name', login)
avatar_url = contributor.get('avatar_url', f"https://avatars.githubusercontent.com/{login}")
profile = contributor.get('profile', f"https://github.com/{login}")
contributions = contributor.get('contributions', [])
# Generate emoji badges
badges = " ".join(EMOJI_KEY.get(c, c) for c in contributions)
return f'''<td align="center" valign="top" width="14.28%"><a href="{profile}"><img src="{avatar_url}?v=4?s={image_size}" width="{image_size}px;" alt="{name}"/><br /><sub><b>{name}</b></sub></a><br />{badges}</td>'''
def generate_table(contributors: list[dict], per_line: int = 7, image_size: int = 80) -> str:
"""Generate the full HTML table for contributors."""
if not contributors:
return ""
lines = ["<table>", " <tbody>"]
for i in range(0, len(contributors), per_line):
row = contributors[i:i + per_line]
lines.append(" <tr>")
for contributor in row:
lines.append(" " + generate_contributor_cell(contributor, image_size))
lines.append(" </tr>")
lines.append(" </tbody>")
lines.append("</table>")
return "\n".join(lines)
def update_readme(project_path: str, table_html: str) -> bool:
"""Update the README.md with the new contributors table."""
readme_path = Path(project_path) / "README.md"
if not readme_path.exists():
print(f"Warning: {readme_path} does not exist")
return False
with open(readme_path, 'r') as f:
content = f.read()
# Pattern to match the ALL-CONTRIBUTORS-LIST section
pattern = r'(<!-- ALL-CONTRIBUTORS-LIST:START.*?-->).*?(<!-- ALL-CONTRIBUTORS-LIST:END -->)'
if not re.search(pattern, content, re.DOTALL):
print(f"Warning: No ALL-CONTRIBUTORS-LIST markers found in {readme_path}")
return False
# Build replacement content
replacement = f'''\\1
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
{table_html}
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
\\2'''
new_content = re.sub(pattern, replacement, content, flags=re.DOTALL)
with open(readme_path, 'w') as f:
f.write(new_content)
return True
def process_project(project_name: str, project_path: str, update: bool = False) -> None:
"""Process a single project."""
rc_path = Path(project_path) / ".all-contributorsrc"
if not rc_path.exists():
print(f"Skipping {project_name}: no .all-contributorsrc found")
return
with open(rc_path, 'r') as f:
rc_data = json.load(f)
contributors = rc_data.get('contributors', [])
per_line = rc_data.get('contributorsPerLine', 7)
image_size = rc_data.get('imageSize', 80)
if not contributors:
print(f"{project_name}: No contributors to display")
return
table_html = generate_table(contributors, per_line, image_size)
print(f"\n=== {project_name} ({len(contributors)} contributors) ===")
if update:
if update_readme(project_path, table_html):
print(f"Updated {project_path}README.md")
else:
print(f"Failed to update {project_path}README.md")
else:
print(table_html)
def main():
parser = argparse.ArgumentParser(description="Generate All Contributors tables")
parser.add_argument("--project", choices=list(PROJECTS.keys()), help="Process specific project")
parser.add_argument("--update", action="store_true", help="Update README files")
args = parser.parse_args()
# Find repo root (this script is in .github/workflows/contributors/)
script_dir = Path(__file__).parent
repo_root = script_dir.parent.parent.parent
if args.project:
projects = {args.project: PROJECTS[args.project]}
else:
projects = PROJECTS
for name, rel_path in projects.items():
process_project(name, str(repo_root / rel_path), args.update)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,465 @@
#!/usr/bin/env python3
"""
Scan git history to identify contributors per project.
This script analyzes git commits to:
1. Find unique contributors per project folder
2. Categorize contribution types based on commit messages and files changed
3. Map git emails to GitHub usernames where possible
4. Filter out bots and AI tools
5. Output data for .all-contributorsrc files
Usage:
python scan_contributors.py [--project PROJECT] [--output json|table|rc]
Examples:
python scan_contributors.py # Scan all projects
python scan_contributors.py --project tinytorch # Scan only tinytorch
python scan_contributors.py --output json # Output as JSON
"""
import subprocess
import json
import re
import argparse
from collections import defaultdict
from pathlib import Path
# Project folders to scan
PROJECTS = {
"book": "book/",
"kits": "kits/",
"labs": "labs/",
"tinytorch": "tinytorch/",
}
# Patterns to exclude (bots, AI tools, etc.)
EXCLUDE_PATTERNS = [
r"bot",
r"github-actions",
r"dependabot",
r"claude",
r"cursor",
r"copilot",
r"\[bot\]",
r"noreply\.github\.com.*bot",
]
# Contribution type detection based on commit message keywords
CONTRIBUTION_PATTERNS = {
"bug": [
r"\bfix(es|ed|ing)?\b",
r"\bbug\b",
r"\bissue\b",
r"\berror\b",
r"\bpatch\b",
r"\bresolve[sd]?\b",
],
"doc": [
r"\bdoc(s|umentation)?\b",
r"\breadme\b",
r"\bcomment\b",
r"\btypo\b",
r"\bspelling\b",
r"\bgrammar\b",
r"\bexplain\b",
r"\bdescription\b",
],
"test": [
r"\btest(s|ing)?\b",
r"\bspec\b",
r"\bcoverage\b",
r"\bvalidat(e|ion)\b",
],
"code": [
r"\bfeat(ure)?\b",
r"\badd(s|ed|ing)?\b",
r"\bimplement(s|ed|ing|ation)?\b",
r"\bcreate[sd]?\b",
r"\bbuild\b",
r"\brefactor\b",
r"\bupdate[sd]?\b",
r"\benhance\b",
r"\bimprove[sd]?\b",
],
"review": [
r"\breview(ed|ing)?\b",
r"\bfeedback\b",
r"\bsuggestion\b",
],
"design": [
r"\bdesign\b",
r"\bdiagram\b",
r"\bfigure\b",
r"\bimage\b",
r"\billustrat(e|ion)\b",
r"\bvisual\b",
],
"translation": [
r"\btranslat(e|ion|ed)\b",
r"\blocali[sz](e|ation)\b",
r"\bi18n\b",
],
"tool": [
r"\btool(s|ing)?\b",
r"\bscript\b",
r"\bautomation\b",
r"\bworkflow\b",
r"\bci\b",
r"\bcd\b",
],
"ideas": [
r"\bidea\b",
r"\bpropos(e|al)\b",
r"\bsuggest\b",
r"\brfc\b",
],
}
# Known email to GitHub username mappings (extend as needed)
EMAIL_TO_GITHUB = {
# Core team
"vj@eecs.harvard.edu": "profvjreddi",
"zeljko.hrcek@gmail.com": "hzeljko",
"mjrovai@gmail.com": "Mjrovai",
"jjj4se@virginia.edu": "jasonjabbour",
"iuchendu@g.harvard.edu": "uchendui",
# Contributors
"kkleinbard@avaya.com": "kai4avaya",
"kai4avaya@gmail.com": "kai4avaya",
"khoshnevis.naeem@gmail.com": "Naeemkh",
"matthew_stewart@g.harvard.edu": "mrdragonbear",
"jeffreyma@g.harvard.edu": "18jeffreyma",
"douwedb@gmail.com": "V0XNIHILI",
"shanzeh.batool@gmail.com": "shanzehbatool",
"jaredping@yahoo.com": "JaredP94",
"sara.khosravi.ds@gmail.com": "Sara-Khosravi",
"i.j.shapira@gmail.com": "ishapira1",
"durand.didier@gmail.com": "didier-durand",
"gabriel.amazonas.eng@gmail.com": "GabrielAmazonas",
"cbanbury@g.harvard.edu": "colbybanbury",
"zishenwan@g.harvard.edu": "zishenwan",
"mark@markmaz.com": "mmaz",
"lazio2013@gmail.com": "ma3mool",
"divya.amirtharaj@gmail.com": "DivyaAmirtharaj",
"91.srivatsan@gmail.com": "srivatsankrishnan",
"alexbrodriguez@gmail.com": "alxrod",
"jlin3@college.harvard.edu": "jaysonzlin",
"jwnchung@umich.edu": "jaywonchung",
"jettythek@gmail.com": "jettythek",
"anfe4949anfe@gmail.com": "andreamurillomtz",
"oishibanerjee@gmail.com": "oishib",
"yushun_hsiao@g.harvard.edu": "leo47007",
"michael.schnebly@gmail.com": "MichaelSchnebly",
"duongvanthuong9a8@gmail.com": "VThuong99",
"eliasab@college.harvard.edu": "eliasab16",
}
def is_excluded(name: str, email: str) -> bool:
"""Check if contributor should be excluded (bot, AI, etc.)."""
combined = f"{name} {email}".lower()
for pattern in EXCLUDE_PATTERNS:
if re.search(pattern, combined, re.IGNORECASE):
return True
return False
def detect_contribution_types(commit_message: str, files_changed: list[str]) -> set[str]:
"""Detect contribution types from commit message and files changed."""
types = set()
message_lower = commit_message.lower()
# Check commit message patterns
for contrib_type, patterns in CONTRIBUTION_PATTERNS.items():
for pattern in patterns:
if re.search(pattern, message_lower, re.IGNORECASE):
types.add(contrib_type)
break
# Check file extensions for additional hints
for file in files_changed:
file_lower = file.lower()
if file_lower.endswith(('.md', '.rst', '.txt')):
types.add("doc")
elif file_lower.endswith(('test_', '_test.py', 'test.py', '.spec.')):
types.add("test")
elif 'test' in file_lower:
types.add("test")
elif file_lower.endswith(('.png', '.jpg', '.svg', '.gif')):
types.add("design")
elif file_lower.endswith(('.py', '.js', '.ts', '.c', '.cpp', '.h')):
types.add("code")
# Default to "code" if nothing detected
if not types:
types.add("code")
return types
def get_github_username(name: str, email: str) -> str | None:
"""Try to get GitHub username from email or name."""
email_lower = email.lower()
# Check known mappings
if email_lower in EMAIL_TO_GITHUB:
return EMAIL_TO_GITHUB[email_lower]
# Try to extract from noreply email
# Format: 12345+username@users.noreply.github.com
noreply_match = re.match(r'(\d+\+)?([^@]+)@users\.noreply\.github\.com', email_lower)
if noreply_match:
return noreply_match.group(2)
return None
def get_commits_for_project(project_path: str) -> list[dict]:
"""Get all commits for a project folder."""
# Format: hash|author_name|author_email|subject
cmd = [
"git", "log",
"--format=%H|%an|%ae|%s",
"--name-only",
"--", project_path
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
except subprocess.CalledProcessError:
return []
commits = []
current_commit = None
for line in result.stdout.split('\n'):
if '|' in line and line.count('|') >= 3:
# This is a commit line
if current_commit:
commits.append(current_commit)
parts = line.split('|', 3)
current_commit = {
'hash': parts[0],
'name': parts[1],
'email': parts[2],
'message': parts[3] if len(parts) > 3 else '',
'files': []
}
elif line.strip() and current_commit:
# This is a file line
current_commit['files'].append(line.strip())
if current_commit:
commits.append(current_commit)
return commits
def analyze_project(project_name: str, project_path: str) -> dict:
"""Analyze a project and return contributor data."""
commits = get_commits_for_project(project_path)
# Aggregate by contributor
contributors = defaultdict(lambda: {
'name': '',
'email': '',
'github': None,
'commits': 0,
'types': set(),
})
for commit in commits:
name = commit['name']
email = commit['email']
# Skip excluded contributors
if is_excluded(name, email):
continue
# Use email as key for deduplication
key = email.lower()
contributors[key]['name'] = name
contributors[key]['email'] = email
contributors[key]['github'] = get_github_username(name, email)
contributors[key]['commits'] += 1
# Detect contribution types
types = detect_contribution_types(commit['message'], commit['files'])
contributors[key]['types'].update(types)
# Convert to list and sort by commits
result = []
for email, data in contributors.items():
result.append({
'name': data['name'],
'email': data['email'],
'github': data['github'],
'commits': data['commits'],
'types': sorted(list(data['types'])),
})
result.sort(key=lambda x: x['commits'], reverse=True)
return {
'project': project_name,
'path': project_path,
'contributors': result,
'total_contributors': len(result),
}
def format_as_table(data: dict) -> str:
"""Format project data as a markdown table."""
lines = [
f"\n## {data['project']} ({data['total_contributors']} contributors)\n",
"| Name | GitHub | Commits | Types |",
"|------|--------|---------|-------|",
]
for c in data['contributors']:
github = f"@{c['github']}" if c['github'] else "?"
types = ", ".join(c['types'])
lines.append(f"| {c['name']} | {github} | {c['commits']} | {types} |")
return "\n".join(lines)
def format_as_allcontributorsrc(data: dict) -> dict:
"""Format project data as .all-contributorsrc contributor entries."""
# Dedupe by GitHub username
seen_github = {}
for c in data['contributors']:
if not c['github']:
continue # Skip if no GitHub username
github_lower = c['github'].lower()
if github_lower in seen_github:
# Merge contribution types
seen_github[github_lower]['contributions'].update(c['types'])
# Keep higher commit count name
if c['commits'] > seen_github[github_lower].get('_commits', 0):
seen_github[github_lower]['name'] = c['name']
seen_github[github_lower]['_commits'] = c['commits']
else:
seen_github[github_lower] = {
"login": c['github'],
"name": c['name'],
"avatar_url": f"https://avatars.githubusercontent.com/{c['github']}",
"profile": f"https://github.com/{c['github']}",
"contributions": set(c['types']),
"_commits": c['commits']
}
# Convert sets to sorted lists and remove internal fields
contributors = []
for entry in seen_github.values():
contributors.append({
"login": entry['login'],
"name": entry['name'],
"avatar_url": entry['avatar_url'],
"profile": entry['profile'],
"contributions": sorted(list(entry['contributions']))
})
# Sort by number of contribution types (most active first)
contributors.sort(key=lambda x: len(x['contributions']), reverse=True)
return {
"project": data['project'],
"contributors": contributors
}
def update_allcontributorsrc(project_name: str, contributors: list[dict], dry_run: bool = True) -> bool:
"""Update the .all-contributorsrc file for a project."""
rc_path = Path(PROJECTS[project_name]) / ".all-contributorsrc"
if not rc_path.exists():
print(f"Warning: {rc_path} does not exist", file=__import__('sys').stderr)
return False
with open(rc_path, 'r') as f:
rc_data = json.load(f)
# Merge new contributors with existing
existing_logins = {c['login'].lower() for c in rc_data.get('contributors', [])}
added = []
for new_contrib in contributors:
if new_contrib['login'].lower() not in existing_logins:
rc_data.setdefault('contributors', []).append(new_contrib)
added.append(new_contrib['login'])
existing_logins.add(new_contrib['login'].lower())
if dry_run:
print(f"\n[DRY RUN] Would add {len(added)} contributors to {rc_path}:")
for login in added:
print(f" - @{login}")
return True
# Write updated file
with open(rc_path, 'w') as f:
json.dump(rc_data, f, indent=4)
print(f"Updated {rc_path} with {len(added)} new contributors")
return True
def main():
parser = argparse.ArgumentParser(description="Scan git history for contributors")
parser.add_argument("--project", choices=list(PROJECTS.keys()), help="Scan specific project")
parser.add_argument("--output", choices=["json", "table", "rc"], default="table", help="Output format")
parser.add_argument("--min-commits", type=int, default=1, help="Minimum commits to include")
parser.add_argument("--update", action="store_true", help="Update .all-contributorsrc files")
parser.add_argument("--dry-run", action="store_true", help="Show what would be updated without writing")
args = parser.parse_args()
# Determine which projects to scan
if args.project:
projects = {args.project: PROJECTS[args.project]}
else:
projects = PROJECTS
results = []
for name, path in projects.items():
print(f"Scanning {name}...", file=__import__('sys').stderr)
data = analyze_project(name, path)
# Filter by minimum commits
data['contributors'] = [c for c in data['contributors'] if c['commits'] >= args.min_commits]
data['total_contributors'] = len(data['contributors'])
results.append(data)
# Update mode
if args.update or args.dry_run:
for data in results:
rc_data = format_as_allcontributorsrc(data)
update_allcontributorsrc(
data['project'],
rc_data['contributors'],
dry_run=args.dry_run or not args.update
)
return
# Output results
if args.output == "json":
print(json.dumps(results, indent=2))
elif args.output == "rc":
for data in results:
rc_data = format_as_allcontributorsrc(data)
print(f"\n=== {data['project']}/.all-contributorsrc contributors ===")
print(json.dumps(rc_data['contributors'], indent=2))
else: # table
for data in results:
print(format_as_table(data))
if __name__ == "__main__":
main()

View File

@@ -1,3 +1,27 @@
#!/usr/bin/env python3
"""
Update contributors from GitHub API.
This script queries the GitHub API to find all contributors to the repository
and updates the root .all-contributorsrc file with their information.
Features:
- Fetches contributors from GitHub commit history
- Resolves email addresses to GitHub usernames
- Generates gravatar URLs for contributors without GitHub avatars
- Excludes bots and specified users
- Merges new contributors with existing ones
Usage:
python update_contributors.py
Environment variables:
GITHUB_TOKEN: Required. GitHub personal access token for API access.
Note: This script updates the ROOT .all-contributorsrc file only.
For per-project configs, use scan_contributors.py instead.
"""
import os
import json
import random

View File

@@ -0,0 +1,133 @@
name: '👥 Update Contributors'
# =============================================================================
# CONTRIBUTOR UPDATE WORKFLOW
# =============================================================================
# Automatically updates contributor recognition across all projects.
#
# TRIGGERS:
# - push: When any .all-contributorsrc file changes on dev or main
# - workflow_dispatch: Manual trigger from Actions UI
# - workflow_call: Called by other workflows
#
# WHAT IT DOES:
# 1. Updates root .all-contributorsrc from GitHub API
# 2. Generates sectioned contributor tables in main README.md
# 3. Updates per-project README.md files (book, tinytorch, kits, labs)
# 4. Commits and pushes changes automatically
#
# ADDING CONTRIBUTORS:
# Option 1: Comment on any issue/PR with:
# @all-contributors please add @username for doc, code, bug, ideas
# Option 2: Manually edit the .all-contributorsrc file for the project
#
# SCRIPTS (in .github/workflows/contributors/):
# - update_contributors.py : Fetches contributors from GitHub API
# - generate_main_readme.py : Builds sectioned main README
# - generate_readme_tables.py : Updates per-project READMEs
# - scan_contributors.py : Scans git history (manual use)
#
# See .github/workflows/contributors/README.md for full documentation.
# =============================================================================
on:
workflow_call:
workflow_dispatch:
push:
branches: [dev, main]
paths:
- '.all-contributorsrc'
- 'book/.all-contributorsrc'
- 'tinytorch/.all-contributorsrc'
- 'kits/.all-contributorsrc'
- 'labs/.all-contributorsrc'
jobs:
update-contributors:
name: Update Contributors List
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r ${{ vars.BOOK_DEPS }}/requirements.txt
pip install PyGithub>=1.55
- name: Configure Git
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Update root contributors config
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: python ${{ github.workspace }}/.github/workflows/contributors/update_contributors.py
- name: Generate sectioned main README
run: python ${{ github.workspace }}/.github/workflows/contributors/generate_main_readme.py
- name: Generate per-project README tables
run: |
# Generate tables for each project README from their configs
python ${{ github.workspace }}/.github/workflows/contributors/generate_readme_tables.py --update 2>/dev/null || true
- name: Check for changes
id: update
run: |
FILES_TO_CHECK=(
".all-contributorsrc"
"README.md"
"book/.all-contributorsrc"
"book/README.md"
"tinytorch/.all-contributorsrc"
"tinytorch/README.md"
"kits/.all-contributorsrc"
"kits/README.md"
"labs/.all-contributorsrc"
"labs/README.md"
"${{ vars.BOOK_QUARTO }}/contents/frontmatter/acknowledgements/acknowledgements.qmd"
)
if git status "${FILES_TO_CHECK[@]}" --porcelain 2>/dev/null | grep .; then
echo "changes_made=true" >> $GITHUB_OUTPUT
else
echo "changes_made=false" >> $GITHUB_OUTPUT
fi
- name: Commit Changes
if: steps.update.outputs.changes_made == 'true'
run: |
BRANCH_NAME=${GITHUB_HEAD_REF:-$(git rev-parse --abbrev-ref HEAD)}
# Add all contributor-related files
git add -A .all-contributorsrc README.md \
book/.all-contributorsrc book/README.md \
tinytorch/.all-contributorsrc tinytorch/README.md \
kits/.all-contributorsrc kits/README.md \
labs/.all-contributorsrc labs/README.md \
${{ vars.BOOK_QUARTO }}/contents/frontmatter/acknowledgements/acknowledgements.qmd \
2>/dev/null || true
git commit -m "Update contributors list [skip ci]"
git pull --rebase origin "$BRANCH_NAME"
git push origin "$BRANCH_NAME"
- name: Report Status
run: |
if [ "${{ steps.update.outputs.changes_made }}" = "true" ]; then
echo "✅ Contributors list has been updated"
else
echo " No changes were needed for contributors list"
fi

295
README.md
View File

@@ -335,167 +335,224 @@ The textbook content (chapters, figures, explanations) is educational material t
## Contributors
Thanks goes to these wonderful people who have contributed to making this resource better for everyone:
Thanks goes to these wonderful people who have contributed to making this resource better for everyone ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
### 📖 Textbook Contributors (102)
<!-- BOOK-CONTRIBUTORS-START -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?s=100" width="100px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/hzeljko"><img src="https://avatars.githubusercontent.com/hzeljko?s=100" width="100px;" alt="Zeljko Hrcek"/><br /><sub><b>Zeljko Hrcek</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?s=100" width="100px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/jasonjabbour"><img src="https://avatars.githubusercontent.com/jasonjabbour?s=100" width="100px;" alt="Jason Jabbour"/><br /><sub><b>Jason Jabbour</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?s=100" width="100px;" alt="Kai Kleinbard"/><br /><sub><b>Kai Kleinbard</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 💡 👀 🧪 🔧</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?v=4?s=80" width="80px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br />💻 🎨 🧪</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GabrielAmazonas"><img src="https://avatars.githubusercontent.com/GabrielAmazonas?v=4?s=80" width="80px;" alt="Gabriel Amazonas"/><br /><sub><b>Gabriel Amazonas</b></sub></a><br />🐛 📖 💡</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hzeljko"><img src="https://avatars.githubusercontent.com/hzeljko?v=4?s=80" width="80px;" alt="Zeljko Hrcek"/><br /><sub><b>Zeljko Hrcek</b></sub></a><br />💻</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jasonjabbour"><img src="https://avatars.githubusercontent.com/jasonjabbour?v=4?s=80" width="80px;" alt="Jason Jabbour"/><br /><sub><b>Jason Jabbour</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/uchendui"><img src="https://avatars.githubusercontent.com/uchendui?v=4?s=80" width="80px;" alt="Ikechukwu Uchendu"/><br /><sub><b>Ikechukwu Uchendu</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Naeemkh"><img src="https://avatars.githubusercontent.com/Naeemkh?v=4?s=80" width="80px;" alt="Naeem Khoshnevis"/><br /><sub><b>Naeem Khoshnevis</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/uchendui"><img src="https://avatars.githubusercontent.com/uchendui?s=100" width="100px;" alt="Ikechukwu Uchendu"/><br /><sub><b>Ikechukwu Uchendu</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/Naeemkh"><img src="https://avatars.githubusercontent.com/Naeemkh?s=100" width="100px;" alt="Naeem Khoshnevis"/><br /><sub><b>Naeem Khoshnevis</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/Sara-Khosravi"><img src="https://avatars.githubusercontent.com/Sara-Khosravi?s=100" width="100px;" alt="Sara Khosravi"/><br /><sub><b>Sara Khosravi</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/V0XNIHILI"><img src="https://avatars.githubusercontent.com/V0XNIHILI?s=100" width="100px;" alt="Douwe den Blanken"/><br /><sub><b>Douwe den Blanken</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/18jeffreyma"><img src="https://avatars.githubusercontent.com/18jeffreyma?s=100" width="100px;" alt="Jeffrey Ma"/><br /><sub><b>Jeffrey Ma</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Sara-Khosravi"><img src="https://avatars.githubusercontent.com/Sara-Khosravi?v=4?s=80" width="80px;" alt="Sara Khosravi"/><br /><sub><b>Sara Khosravi</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/V0XNIHILI"><img src="https://avatars.githubusercontent.com/V0XNIHILI?v=4?s=80" width="80px;" alt="Douwe den Blanken"/><br /><sub><b>Douwe den Blanken</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/18jeffreyma"><img src="https://avatars.githubusercontent.com/18jeffreyma?v=4?s=80" width="80px;" alt="Jeffrey Ma"/><br /><sub><b>Jeffrey Ma</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shanzehbatool"><img src="https://avatars.githubusercontent.com/shanzehbatool?v=4?s=80" width="80px;" alt="shanzehbatool"/><br /><sub><b>shanzehbatool</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eliasab16"><img src="https://avatars.githubusercontent.com/eliasab16?v=4?s=80" width="80px;" alt="Elias"/><br /><sub><b>Elias</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JaredP94"><img src="https://avatars.githubusercontent.com/JaredP94?v=4?s=80" width="80px;" alt="Jared Ping"/><br /><sub><b>Jared Ping</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ishapira1"><img src="https://avatars.githubusercontent.com/ishapira1?v=4?s=80" width="80px;" alt="Itai Shapira"/><br /><sub><b>Itai Shapira</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?s=100" width="100px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/shanzehbatool"><img src="https://avatars.githubusercontent.com/shanzehbatool?s=100" width="100px;" alt="shanzehbatool"/><br /><sub><b>shanzehbatool</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/eliasab16"><img src="https://avatars.githubusercontent.com/eliasab16?s=100" width="100px;" alt="Elias"/><br /><sub><b>Elias</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/JaredP94"><img src="https://avatars.githubusercontent.com/JaredP94?s=100" width="100px;" alt="Jared Ping"/><br /><sub><b>Jared Ping</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/ishapira1"><img src="https://avatars.githubusercontent.com/ishapira1?s=100" width="100px;" alt="Itai Shapira"/><br /><sub><b>Itai Shapira</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8863743b4f26c1a20e730fcf7ebc3bc0?d=identicon&s=100?v=4?s=80" width="80px;" alt="Maximilian Lam"/><br /><sub><b>Maximilian Lam</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jaysonzlin"><img src="https://avatars.githubusercontent.com/jaysonzlin?v=4?s=80" width="80px;" alt="Jayson Lin"/><br /><sub><b>Jayson Lin</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sophiacho1"><img src="https://avatars.githubusercontent.com/sophiacho1?v=4?s=80" width="80px;" alt="Sophia Cho"/><br /><sub><b>Sophia Cho</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/andreamurillomtz"><img src="https://avatars.githubusercontent.com/andreamurillomtz?v=4?s=80" width="80px;" alt="Andrea"/><br /><sub><b>Andrea</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alxrod"><img src="https://avatars.githubusercontent.com/alxrod?v=4?s=80" width="80px;" alt="Alex Rodriguez"/><br /><sub><b>Alex Rodriguez</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/korneelf1"><img src="https://avatars.githubusercontent.com/korneelf1?v=4?s=80" width="80px;" alt="Korneel Van den Berghe"/><br /><sub><b>Korneel Van den Berghe</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/foundingnimo"><img src="https://avatars.githubusercontent.com/foundingnimo?v=4?s=80" width="80px;" alt="Nimo"/><br /><sub><b>Nimo</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8863743b4f26c1a20e730fcf7ebc3bc0?d=identicon&s=100?s=100" width="100px;" alt="Maximilian Lam"/><br /><sub><b>Maximilian Lam</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/jaysonzlin"><img src="https://avatars.githubusercontent.com/jaysonzlin?s=100" width="100px;" alt="Jayson Lin"/><br /><sub><b>Jayson Lin</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/sophiacho1"><img src="https://avatars.githubusercontent.com/sophiacho1?s=100" width="100px;" alt="Sophia Cho"/><br /><sub><b>Sophia Cho</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/andreamurillomtz"><img src="https://avatars.githubusercontent.com/andreamurillomtz?s=100" width="100px;" alt="Andrea"/><br /><sub><b>Andrea</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/alxrod"><img src="https://avatars.githubusercontent.com/alxrod?s=100" width="100px;" alt="Alex Rodriguez"/><br /><sub><b>Alex Rodriguez</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/colbybanbury"><img src="https://avatars.githubusercontent.com/colbybanbury?v=4?s=80" width="80px;" alt="Colby Banbury"/><br /><sub><b>Colby Banbury</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zishenwan"><img src="https://avatars.githubusercontent.com/zishenwan?v=4?s=80" width="80px;" alt="Zishen Wan"/><br /><sub><b>Zishen Wan</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mmaz"><img src="https://avatars.githubusercontent.com/mmaz?v=4?s=80" width="80px;" alt="Mark Mazumder"/><br /><sub><b>Mark Mazumder</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ma3mool"><img src="https://avatars.githubusercontent.com/ma3mool?v=4?s=80" width="80px;" alt="Abdulrahman Mahmoud"/><br /><sub><b>Abdulrahman Mahmoud</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DivyaAmirtharaj"><img src="https://avatars.githubusercontent.com/DivyaAmirtharaj?v=4?s=80" width="80px;" alt="Divya Amirtharaj"/><br /><sub><b>Divya Amirtharaj</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/srivatsankrishnan"><img src="https://avatars.githubusercontent.com/srivatsankrishnan?v=4?s=80" width="80px;" alt="Srivatsan Krishnan"/><br /><sub><b>Srivatsan Krishnan</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arnaumarin"><img src="https://avatars.githubusercontent.com/arnaumarin?v=4?s=80" width="80px;" alt="marin-llobet"/><br /><sub><b>marin-llobet</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/korneelf1"><img src="https://avatars.githubusercontent.com/korneelf1?s=100" width="100px;" alt="Korneel Van den Berghe"/><br /><sub><b>Korneel Van den Berghe</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/foundingnimo"><img src="https://avatars.githubusercontent.com/foundingnimo?s=100" width="100px;" alt="Nimo"/><br /><sub><b>Nimo</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/colbybanbury"><img src="https://avatars.githubusercontent.com/colbybanbury?s=100" width="100px;" alt="Colby Banbury"/><br /><sub><b>Colby Banbury</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/zishenwan"><img src="https://avatars.githubusercontent.com/zishenwan?s=100" width="100px;" alt="Zishen Wan"/><br /><sub><b>Zishen Wan</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/GabrielAmazonas"><img src="https://avatars.githubusercontent.com/GabrielAmazonas?s=100" width="100px;" alt="Gabriel Amazonas"/><br /><sub><b>Gabriel Amazonas</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aptl26"><img src="https://avatars.githubusercontent.com/aptl26?v=4?s=80" width="80px;" alt="Aghyad Deeb"/><br /><sub><b>Aghyad Deeb</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/James-QiuHaoran"><img src="https://avatars.githubusercontent.com/James-QiuHaoran?v=4?s=80" width="80px;" alt="Haoran Qiu"/><br /><sub><b>Haoran Qiu</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ekhao"><img src="https://avatars.githubusercontent.com/Ekhao?v=4?s=80" width="80px;" alt="Emil Njor"/><br /><sub><b>Emil Njor</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ELSuitorHarvard"><img src="https://avatars.githubusercontent.com/ELSuitorHarvard?v=4?s=80" width="80px;" alt="ELSuitorHarvard"/><br /><sub><b>ELSuitorHarvard</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kaiM0ves"><img src="https://avatars.githubusercontent.com/kaiM0ves?v=4?s=80" width="80px;" alt="kaiM0ves"/><br /><sub><b>kaiM0ves</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oishib"><img src="https://avatars.githubusercontent.com/oishib?v=4?s=80" width="80px;" alt="oishib"/><br /><sub><b>oishib</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jared-ni"><img src="https://avatars.githubusercontent.com/jared-ni?v=4?s=80" width="80px;" alt="Jared Ni"/><br /><sub><b>Jared Ni</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/mmaz"><img src="https://avatars.githubusercontent.com/mmaz?s=100" width="100px;" alt="Mark Mazumder"/><br /><sub><b>Mark Mazumder</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/ma3mool"><img src="https://avatars.githubusercontent.com/ma3mool?s=100" width="100px;" alt="Abdulrahman Mahmoud"/><br /><sub><b>Abdulrahman Mahmoud</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/DivyaAmirtharaj"><img src="https://avatars.githubusercontent.com/DivyaAmirtharaj?s=100" width="100px;" alt="Divya Amirtharaj"/><br /><sub><b>Divya Amirtharaj</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/srivatsankrishnan"><img src="https://avatars.githubusercontent.com/srivatsankrishnan?s=100" width="100px;" alt="Srivatsan Krishnan"/><br /><sub><b>Srivatsan Krishnan</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/arnaumarin"><img src="https://avatars.githubusercontent.com/arnaumarin?s=100" width="100px;" alt="marin-llobet"/><br /><sub><b>marin-llobet</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AditiR-42"><img src="https://avatars.githubusercontent.com/AditiR-42?v=4?s=80" width="80px;" alt="Aditi Raju"/><br /><sub><b>Aditi Raju</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MichaelSchnebly"><img src="https://avatars.githubusercontent.com/MichaelSchnebly?v=4?s=80" width="80px;" alt="Michael Schnebly"/><br /><sub><b>Michael Schnebly</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VThuong99"><img src="https://avatars.githubusercontent.com/VThuong99?v=4?s=80" width="80px;" alt="Thuong Duong"/><br /><sub><b>Thuong Duong</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/leo47007"><img src="https://avatars.githubusercontent.com/leo47007?v=4?s=80" width="80px;" alt="Yu-Shun Hsiao"/><br /><sub><b>Yu-Shun Hsiao</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BaeHenryS"><img src="https://avatars.githubusercontent.com/BaeHenryS?v=4?s=80" width="80px;" alt="Henry Bae"/><br /><sub><b>Henry Bae</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eimlav"><img src="https://avatars.githubusercontent.com/eimlav?v=4?s=80" width="80px;" alt="Eimhin Laverty"/><br /><sub><b>Eimhin Laverty</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jaywonchung"><img src="https://avatars.githubusercontent.com/jaywonchung?v=4?s=80" width="80px;" alt="Jae-Won Chung"/><br /><sub><b>Jae-Won Chung</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/aptl26"><img src="https://avatars.githubusercontent.com/aptl26?s=100" width="100px;" alt="Aghyad Deeb"/><br /><sub><b>Aghyad Deeb</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/James-QiuHaoran"><img src="https://avatars.githubusercontent.com/James-QiuHaoran?s=100" width="100px;" alt="Haoran Qiu"/><br /><sub><b>Haoran Qiu</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/Ekhao"><img src="https://avatars.githubusercontent.com/Ekhao?s=100" width="100px;" alt="Emil Njor"/><br /><sub><b>Emil Njor</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/ELSuitorHarvard"><img src="https://avatars.githubusercontent.com/ELSuitorHarvard?s=100" width="100px;" alt="ELSuitorHarvard"/><br /><sub><b>ELSuitorHarvard</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/kaiM0ves"><img src="https://avatars.githubusercontent.com/kaiM0ves?s=100" width="100px;" alt="kaiM0ves"/><br /><sub><b>kaiM0ves</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ShvetankPrakash"><img src="https://avatars.githubusercontent.com/ShvetankPrakash?v=4?s=80" width="80px;" alt="Shvetank Prakash"/><br /><sub><b>Shvetank Prakash</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marcozennaro"><img src="https://avatars.githubusercontent.com/marcozennaro?v=4?s=80" width="80px;" alt="Marco Zennaro"/><br /><sub><b>Marco Zennaro</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aryatschand"><img src="https://avatars.githubusercontent.com/aryatschand?v=4?s=80" width="80px;" alt="Arya Tschand"/><br /><sub><b>Arya Tschand</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arbass22"><img src="https://avatars.githubusercontent.com/arbass22?v=4?s=80" width="80px;" alt="Andrew Bass"/><br /><sub><b>Andrew Bass</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pongtr"><img src="https://avatars.githubusercontent.com/pongtr?v=4?s=80" width="80px;" alt="Pong Trairatvorakul"/><br /><sub><b>Pong Trairatvorakul</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/euranofshin"><img src="https://avatars.githubusercontent.com/euranofshin?v=4?s=80" width="80px;" alt="Eura Nofshin"/><br /><sub><b>Eura Nofshin</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0c931fcfd03cd548d44c90602dd773ba?d=identicon&s=100?v=4?s=80" width="80px;" alt="Matthew Stewart"/><br /><sub><b>Matthew Stewart</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/oishib"><img src="https://avatars.githubusercontent.com/oishib?s=100" width="100px;" alt="oishib"/><br /><sub><b>oishib</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/jared-ni"><img src="https://avatars.githubusercontent.com/jared-ni?s=100" width="100px;" alt="Jared Ni"/><br /><sub><b>Jared Ni</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/AditiR-42"><img src="https://avatars.githubusercontent.com/AditiR-42?s=100" width="100px;" alt="Aditi Raju"/><br /><sub><b>Aditi Raju</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/MichaelSchnebly"><img src="https://avatars.githubusercontent.com/MichaelSchnebly?s=100" width="100px;" alt="Michael Schnebly"/><br /><sub><b>Michael Schnebly</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/VThuong99"><img src="https://avatars.githubusercontent.com/VThuong99?s=100" width="100px;" alt="Thuong Duong"/><br /><sub><b>Thuong Duong</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/af39c27c6090c50a1921a9b6366e81cc?d=identicon&s=100?v=4?s=80" width="80px;" alt="Emeka Ezike"/><br /><sub><b>Emeka Ezike</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jianqingdu"><img src="https://avatars.githubusercontent.com/jianqingdu?v=4?s=80" width="80px;" alt="jianqingdu"/><br /><sub><b>jianqingdu</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jzhou1318"><img src="https://avatars.githubusercontent.com/jzhou1318?v=4?s=80" width="80px;" alt="Jennifer Zhou"/><br /><sub><b>Jennifer Zhou</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vitasam"><img src="https://avatars.githubusercontent.com/vitasam?v=4?s=80" width="80px;" alt="The Random DIY"/><br /><sub><b>The Random DIY</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100?v=4?s=80" width="80px;" alt="Fatima Shah"/><br /><sub><b>Fatima Shah</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BrunoScaglione"><img src="https://avatars.githubusercontent.com/BrunoScaglione?v=4?s=80" width="80px;" alt="Bruno Scaglione"/><br /><sub><b>Bruno Scaglione</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allen-Kuang"><img src="https://avatars.githubusercontent.com/Allen-Kuang?v=4?s=80" width="80px;" alt="Allen-Kuang"/><br /><sub><b>Allen-Kuang</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/leo47007"><img src="https://avatars.githubusercontent.com/leo47007?s=100" width="100px;" alt="Yu-Shun Hsiao"/><br /><sub><b>Yu-Shun Hsiao</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/BaeHenryS"><img src="https://avatars.githubusercontent.com/BaeHenryS?s=100" width="100px;" alt="Henry Bae"/><br /><sub><b>Henry Bae</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/eimlav"><img src="https://avatars.githubusercontent.com/eimlav?s=100" width="100px;" alt="Eimhin Laverty"/><br /><sub><b>Eimhin Laverty</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/jaywonchung"><img src="https://avatars.githubusercontent.com/jaywonchung?s=100" width="100px;" alt="Jae-Won Chung"/><br /><sub><b>Jae-Won Chung</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/ShvetankPrakash"><img src="https://avatars.githubusercontent.com/ShvetankPrakash?s=100" width="100px;" alt="Shvetank Prakash"/><br /><sub><b>Shvetank Prakash</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4ad8cdf19eb3b666ace97d3eedb19278?d=identicon&s=100?v=4?s=80" width="80px;" alt="Tess314"/><br /><sub><b>Tess314</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/taunoe"><img src="https://avatars.githubusercontent.com/taunoe?v=4?s=80" width="80px;" alt="Tauno Erik"/><br /><sub><b>Tauno Erik</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gnodipac886"><img src="https://avatars.githubusercontent.com/gnodipac886?v=4?s=80" width="80px;" alt="gnodipac886"/><br /><sub><b>gnodipac886</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/serco425"><img src="https://avatars.githubusercontent.com/serco425?v=4?s=80" width="80px;" alt="Sercan Aygün"/><br /><sub><b>Sercan Aygün</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TheHiddenLayer"><img src="https://avatars.githubusercontent.com/TheHiddenLayer?v=4?s=80" width="80px;" alt="TheHiddenLayer"/><br /><sub><b>TheHiddenLayer</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Gjain234"><img src="https://avatars.githubusercontent.com/Gjain234?v=4?s=80" width="80px;" alt="Gauri Jain"/><br /><sub><b>Gauri Jain</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FinAminToastCrunch"><img src="https://avatars.githubusercontent.com/FinAminToastCrunch?v=4?s=80" width="80px;" alt="Fin Amin"/><br /><sub><b>Fin Amin</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/marcozennaro"><img src="https://avatars.githubusercontent.com/marcozennaro?s=100" width="100px;" alt="Marco Zennaro"/><br /><sub><b>Marco Zennaro</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/aryatschand"><img src="https://avatars.githubusercontent.com/aryatschand?s=100" width="100px;" alt="Arya Tschand"/><br /><sub><b>Arya Tschand</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/arbass22"><img src="https://avatars.githubusercontent.com/arbass22?s=100" width="100px;" alt="Andrew Bass"/><br /><sub><b>Andrew Bass</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/pongtr"><img src="https://avatars.githubusercontent.com/pongtr?s=100" width="100px;" alt="Pong Trairatvorakul"/><br /><sub><b>Pong Trairatvorakul</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/euranofshin"><img src="https://avatars.githubusercontent.com/euranofshin?s=100" width="100px;" alt="Eura Nofshin"/><br /><sub><b>Eura Nofshin</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alex-oesterling"><img src="https://avatars.githubusercontent.com/alex-oesterling?v=4?s=80" width="80px;" alt="Alex Oesterling"/><br /><sub><b>Alex Oesterling</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AbenezerKb"><img src="https://avatars.githubusercontent.com/AbenezerKb?v=4?s=80" width="80px;" alt="Abenezer Angamo"/><br /><sub><b>Abenezer Angamo</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BravoBaldo"><img src="https://avatars.githubusercontent.com/BravoBaldo?v=4?s=80" width="80px;" alt="Baldassarre Cesarano"/><br /><sub><b>Baldassarre Cesarano</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jahnic-kb"><img src="https://avatars.githubusercontent.com/Jahnic-kb?v=4?s=80" width="80px;" alt="Jahnic Beck"/><br /><sub><b>Jahnic Beck</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aethernavshulkraven-allain"><img src="https://avatars.githubusercontent.com/aethernavshulkraven-allain?v=4?s=80" width="80px;" alt="अरनव शुक्ला | Arnav Shukla"/><br /><sub><b>अरनव शुक्ला | Arnav Shukla</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RinZ27"><img src="https://avatars.githubusercontent.com/RinZ27?v=4?s=80" width="80px;" alt="Rin"/><br /><sub><b>Rin</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bilgeacun"><img src="https://avatars.githubusercontent.com/bilgeacun?v=4?s=80" width="80px;" alt="Bilge Acun"/><br /><sub><b>Bilge Acun</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0c931fcfd03cd548d44c90602dd773ba?d=identicon&s=100?s=100" width="100px;" alt="Matthew Stewart"/><br /><sub><b>Matthew Stewart</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/af39c27c6090c50a1921a9b6366e81cc?d=identicon&s=100?s=100" width="100px;" alt="Emeka Ezike"/><br /><sub><b>Emeka Ezike</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/jianqingdu"><img src="https://avatars.githubusercontent.com/jianqingdu?s=100" width="100px;" alt="jianqingdu"/><br /><sub><b>jianqingdu</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/jzhou1318"><img src="https://avatars.githubusercontent.com/jzhou1318?s=100" width="100px;" alt="Jennifer Zhou"/><br /><sub><b>Jennifer Zhou</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/vitasam"><img src="https://avatars.githubusercontent.com/vitasam?s=100" width="100px;" alt="The Random DIY"/><br /><sub><b>The Random DIY</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/atcheng2"><img src="https://avatars.githubusercontent.com/atcheng2?v=4?s=80" width="80px;" alt="Andy Cheng"/><br /><sub><b>Andy Cheng</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arighosh05"><img src="https://avatars.githubusercontent.com/arighosh05?v=4?s=80" width="80px;" alt="Aritra Ghosh"/><br /><sub><b>Aritra Ghosh</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/abigailswallow"><img src="https://avatars.githubusercontent.com/abigailswallow?v=4?s=80" width="80px;" alt="abigailswallow"/><br /><sub><b>abigailswallow</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/YangZhou1997"><img src="https://avatars.githubusercontent.com/YangZhou1997?v=4?s=80" width="80px;" alt="Yang Zhou"/><br /><sub><b>Yang Zhou</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XaicuL"><img src="https://avatars.githubusercontent.com/XaicuL?v=4?s=80" width="80px;" alt="JEON HYUNJUN(Luciano)"/><br /><sub><b>JEON HYUNJUN(Luciano)</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/emmanuel2406"><img src="https://avatars.githubusercontent.com/emmanuel2406?v=4?s=80" width="80px;" alt="Emmanuel Rassou"/><br /><sub><b>Emmanuel Rassou</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jasonlyik"><img src="https://avatars.githubusercontent.com/jasonlyik?v=4?s=80" width="80px;" alt="Jason Yik"/><br /><sub><b>Jason Yik</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100?s=100" width="100px;" alt="Fatima Shah"/><br /><sub><b>Fatima Shah</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/BrunoScaglione"><img src="https://avatars.githubusercontent.com/BrunoScaglione?s=100" width="100px;" alt="Bruno Scaglione"/><br /><sub><b>Bruno Scaglione</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/Allen-Kuang"><img src="https://avatars.githubusercontent.com/Allen-Kuang?s=100" width="100px;" alt="Allen-Kuang"/><br /><sub><b>Allen-Kuang</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4ad8cdf19eb3b666ace97d3eedb19278?d=identicon&s=100?s=100" width="100px;" alt="Tess314"/><br /><sub><b>Tess314</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/taunoe"><img src="https://avatars.githubusercontent.com/taunoe?s=100" width="100px;" alt="Tauno Erik"/><br /><sub><b>Tauno Erik</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jessicaquaye"><img src="https://avatars.githubusercontent.com/jessicaquaye?v=4?s=80" width="80px;" alt="Jessica Quaye"/><br /><sub><b>Jessica Quaye</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cursoragent"><img src="https://avatars.githubusercontent.com/cursoragent?v=4?s=80" width="80px;" alt="Cursor Agent"/><br /><sub><b>Cursor Agent</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/happyappledog"><img src="https://avatars.githubusercontent.com/happyappledog?v=4?s=80" width="80px;" alt="happyappledog"/><br /><sub><b>happyappledog</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/snuggs"><img src="https://avatars.githubusercontent.com/snuggs?v=4?s=80" width="80px;" alt="Snuggs"/><br /><sub><b>Snuggs</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/swilcock0"><img src="https://avatars.githubusercontent.com/swilcock0?v=4?s=80" width="80px;" alt="Sam Wilcock"/><br /><sub><b>Sam Wilcock</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sjohri20"><img src="https://avatars.githubusercontent.com/sjohri20?v=4?s=80" width="80px;" alt="Shreya Johri"/><br /><sub><b>Shreya Johri</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/skmur"><img src="https://avatars.githubusercontent.com/skmur?v=4?s=80" width="80px;" alt="Sonia Murthy"/><br /><sub><b>Sonia Murthy</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/gnodipac886"><img src="https://avatars.githubusercontent.com/gnodipac886?s=100" width="100px;" alt="gnodipac886"/><br /><sub><b>gnodipac886</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/serco425"><img src="https://avatars.githubusercontent.com/serco425?s=100" width="100px;" alt="Sercan Aygün"/><br /><sub><b>Sercan Aygün</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/TheHiddenLayer"><img src="https://avatars.githubusercontent.com/TheHiddenLayer?s=100" width="100px;" alt="TheHiddenLayer"/><br /><sub><b>TheHiddenLayer</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/Gjain234"><img src="https://avatars.githubusercontent.com/Gjain234?s=100" width="100px;" alt="Gauri Jain"/><br /><sub><b>Gauri Jain</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/FinAminToastCrunch"><img src="https://avatars.githubusercontent.com/FinAminToastCrunch?s=100" width="100px;" alt="Fin Amin"/><br /><sub><b>Fin Amin</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/fc4f3460cdfb9365ab59bdeafb06413e?d=identicon&s=100?v=4?s=80" width="80px;" alt="Costin-Andrei Oncescu"/><br /><sub><b>Costin-Andrei Oncescu</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0d6b8616427d8b19d425c9808692e347?d=identicon&s=100?v=4?s=80" width="80px;" alt="formlsysbookissue"/><br /><sub><b>formlsysbookissue</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/7cd8d5dfd83071f23979019d97655dc5?d=identicon&s=100?v=4?s=80" width="80px;" alt="Annie Laurie Cook"/><br /><sub><b>Annie Laurie Cook</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/5aa037840c0ca11ee42784ed4843c655?d=identicon&s=100?v=4?s=80" width="80px;" alt="Parampreet Singh"/><br /><sub><b>Parampreet Singh</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/b15b6e0e9adf58099905c1a0fd474cb9?d=identicon&s=100?v=4?s=80" width="80px;" alt="Vijay Edupuganti"/><br /><sub><b>Vijay Edupuganti</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f88052cca4f401d9b0f43aed0a53434a?d=identicon&s=100?v=4?s=80" width="80px;" alt="Jothi Ramaswamy"/><br /><sub><b>Jothi Ramaswamy</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/35a8d9ffd03f05e79a2c6ce6206a56f2?d=identicon&s=100?v=4?s=80" width="80px;" alt="Batur Arslan"/><br /><sub><b>Batur Arslan</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/alex-oesterling"><img src="https://avatars.githubusercontent.com/alex-oesterling?s=100" width="100px;" alt="Alex Oesterling"/><br /><sub><b>Alex Oesterling</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/AbenezerKb"><img src="https://avatars.githubusercontent.com/AbenezerKb?s=100" width="100px;" alt="Abenezer Angamo"/><br /><sub><b>Abenezer Angamo</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/BravoBaldo"><img src="https://avatars.githubusercontent.com/BravoBaldo?s=100" width="100px;" alt="Baldassarre Cesarano"/><br /><sub><b>Baldassarre Cesarano</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/KarthikDani"><img src="https://avatars.githubusercontent.com/KarthikDani?s=100" width="100px;" alt="Karthik Dani"/><br /><sub><b>Karthik Dani</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/Jahnic-kb"><img src="https://avatars.githubusercontent.com/Jahnic-kb?s=100" width="100px;" alt="Jahnic Beck"/><br /><sub><b>Jahnic Beck</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/bd53d146aa888548c8db4da02bf81e7a?d=identicon&s=100?v=4?s=80" width="80px;" alt="Curren Iyer"/><br /><sub><b>Curren Iyer</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8d8410338458e08bd5e4b96f58e1c217?d=identicon&s=100?v=4?s=80" width="80px;" alt="Edward Jin"/><br /><sub><b>Edward Jin</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/28c6123d2c9f75578d3ccdedb0df3d11?d=identicon&s=100?v=4?s=80" width="80px;" alt="Tess Watt"/><br /><sub><b>Tess Watt</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/ef139181fe00190f21730f6912532e9e?d=identicon&s=100?v=4?s=80" width="80px;" alt="bluebaer7"/><br /><sub><b>bluebaer7</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f5d58ba6aa9b00189d4c018d370e8f43?d=identicon&s=100?v=4?s=80" width="80px;" alt="yanjingl"/><br /><sub><b>yanjingl</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/a5a47df988ab1720dd706062e523ca32?d=identicon&s=100?v=4?s=80" width="80px;" alt="a-saraf"/><br /><sub><b>a-saraf</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/c2dc311aa8122d5f5f061e1db14682b1?d=identicon&s=100?v=4?s=80" width="80px;" alt="songhan"/><br /><sub><b>songhan</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/aethernavshulkraven-allain"><img src="https://avatars.githubusercontent.com/aethernavshulkraven-allain?s=100" width="100px;" alt="अरनव शुक्ला &#124; Arnav Shukla"/><br /><sub><b>अरनव शुक्ला &#124; Arnav Shukla</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/RinZ27"><img src="https://avatars.githubusercontent.com/RinZ27?s=100" width="100px;" alt="Rin"/><br /><sub><b>Rin</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/bilgeacun"><img src="https://avatars.githubusercontent.com/bilgeacun?s=100" width="100px;" alt="Bilge Acun"/><br /><sub><b>Bilge Acun</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/atcheng2"><img src="https://avatars.githubusercontent.com/atcheng2?s=100" width="100px;" alt="Andy Cheng"/><br /><sub><b>Andy Cheng</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/arighosh05"><img src="https://avatars.githubusercontent.com/arighosh05?s=100" width="100px;" alt="Aritra Ghosh"/><br /><sub><b>Aritra Ghosh</b></sub></a><br /></td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/abigailswallow"><img src="https://avatars.githubusercontent.com/abigailswallow?s=100" width="100px;" alt="abigailswallow"/><br /><sub><b>abigailswallow</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/YangZhou1997"><img src="https://avatars.githubusercontent.com/YangZhou1997?s=100" width="100px;" alt="Yang Zhou"/><br /><sub><b>Yang Zhou</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/XaicuL"><img src="https://avatars.githubusercontent.com/XaicuL?s=100" width="100px;" alt="JEON HYUNJUN(Luciano)"/><br /><sub><b>JEON HYUNJUN(Luciano)</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/emmanuel2406"><img src="https://avatars.githubusercontent.com/emmanuel2406?s=100" width="100px;" alt="Emmanuel Rassou"/><br /><sub><b>Emmanuel Rassou</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/jasonlyik"><img src="https://avatars.githubusercontent.com/jasonlyik?s=100" width="100px;" alt="Jason Yik"/><br /><sub><b>Jason Yik</b></sub></a><br /></td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/jessicaquaye"><img src="https://avatars.githubusercontent.com/jessicaquaye?s=100" width="100px;" alt="Jessica Quaye"/><br /><sub><b>Jessica Quaye</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/cursoragent"><img src="https://avatars.githubusercontent.com/cursoragent?s=100" width="100px;" alt="Cursor Agent"/><br /><sub><b>Cursor Agent</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/happyappledog"><img src="https://avatars.githubusercontent.com/happyappledog?s=100" width="100px;" alt="happyappledog"/><br /><sub><b>happyappledog</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/snuggs"><img src="https://avatars.githubusercontent.com/snuggs?s=100" width="100px;" alt="Snuggs"/><br /><sub><b>Snuggs</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/swilcock0"><img src="https://avatars.githubusercontent.com/swilcock0?s=100" width="100px;" alt="Sam Wilcock"/><br /><sub><b>Sam Wilcock</b></sub></a><br /></td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/sjohri20"><img src="https://avatars.githubusercontent.com/sjohri20?s=100" width="100px;" alt="Shreya Johri"/><br /><sub><b>Shreya Johri</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/skmur"><img src="https://avatars.githubusercontent.com/skmur?s=100" width="100px;" alt="Sonia Murthy"/><br /><sub><b>Sonia Murthy</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/fc4f3460cdfb9365ab59bdeafb06413e?d=identicon&s=100?s=100" width="100px;" alt="Costin-Andrei Oncescu"/><br /><sub><b>Costin-Andrei Oncescu</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0d6b8616427d8b19d425c9808692e347?d=identicon&s=100?s=100" width="100px;" alt="formlsysbookissue"/><br /><sub><b>formlsysbookissue</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/7cd8d5dfd83071f23979019d97655dc5?d=identicon&s=100?s=100" width="100px;" alt="Annie Laurie Cook"/><br /><sub><b>Annie Laurie Cook</b></sub></a><br /></td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/5aa037840c0ca11ee42784ed4843c655?d=identicon&s=100?s=100" width="100px;" alt="Parampreet Singh"/><br /><sub><b>Parampreet Singh</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/b15b6e0e9adf58099905c1a0fd474cb9?d=identicon&s=100?s=100" width="100px;" alt="Vijay Edupuganti"/><br /><sub><b>Vijay Edupuganti</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f88052cca4f401d9b0f43aed0a53434a?d=identicon&s=100?s=100" width="100px;" alt="Jothi Ramaswamy"/><br /><sub><b>Jothi Ramaswamy</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/35a8d9ffd03f05e79a2c6ce6206a56f2?d=identicon&s=100?s=100" width="100px;" alt="Batur Arslan"/><br /><sub><b>Batur Arslan</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/bd53d146aa888548c8db4da02bf81e7a?d=identicon&s=100?s=100" width="100px;" alt="Curren Iyer"/><br /><sub><b>Curren Iyer</b></sub></a><br /></td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100?s=100" width="100px;" alt="Fatima Shah"/><br /><sub><b>Fatima Shah</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8d8410338458e08bd5e4b96f58e1c217?d=identicon&s=100?s=100" width="100px;" alt="Edward Jin"/><br /><sub><b>Edward Jin</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/28c6123d2c9f75578d3ccdedb0df3d11?d=identicon&s=100?s=100" width="100px;" alt="Tess Watt"/><br /><sub><b>Tess Watt</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/ef139181fe00190f21730f6912532e9e?d=identicon&s=100?s=100" width="100px;" alt="bluebaer7"/><br /><sub><b>bluebaer7</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f5d58ba6aa9b00189d4c018d370e8f43?d=identicon&s=100?s=100" width="100px;" alt="yanjingl"/><br /><sub><b>yanjingl</b></sub></a><br /></td>
</tr>
<tr>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/a5a47df988ab1720dd706062e523ca32?d=identicon&s=100?s=100" width="100px;" alt="a-saraf"/><br /><sub><b>a-saraf</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/c2dc311aa8122d5f5f061e1db14682b1?d=identicon&s=100?s=100" width="100px;" alt="songhan"/><br /><sub><b>songhan</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4814aad67982ab07a69006a1ce9d2a72?d=identicon&s=100?s=100" width="100px;" alt="jvijay"/><br /><sub><b>jvijay</b></sub></a><br /></td>
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/43b1feff77c8a95fd581774fb8ec891f?d=identicon&s=100?s=100" width="100px;" alt="Zishen"/><br /><sub><b>Zishen</b></sub></a><br /></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4814aad67982ab07a69006a1ce9d2a72?d=identicon&s=100?v=4?s=80" width="80px;" alt="jvijay"/><br /><sub><b>jvijay</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/43b1feff77c8a95fd581774fb8ec891f?d=identicon&s=100?v=4?s=80" width="80px;" alt="Zishen"/><br /><sub><b>Zishen</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?v=4?s=80" width="80px;" alt="Kai Kleinbard"/><br /><sub><b>Kai Kleinbard</b></sub></a><br />💻 🔧</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?v=4?s=80" width="80px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br />📖 🐛</td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- BOOK-CONTRIBUTORS-END -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
---
### 🔥 TinyTorch Contributors (7)
<!-- TINYTORCH-CONTRIBUTORS-START -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AmirAlasady"><img src="https://avatars.githubusercontent.com/AmirAlasady?v=4?s=80" width="80px;" alt="Amir Alasady"/><br /><sub><b>Amir Alasady</b></sub></a><br />🐛</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 💡 👀 🧪 🔧</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?v=4?s=80" width="80px;" alt="kai"/><br /><sub><b>kai</b></sub></a><br />🐛 💻 🎨 📖 🧪</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/minhdang26403"><img src="https://avatars.githubusercontent.com/minhdang26403?v=4?s=80" width="80px;" alt="Dang Truong"/><br /><sub><b>Dang Truong</b></sub></a><br />🐛 💻 📖 🧪</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?v=4?s=80" width="80px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br />🐛 💻 📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karthikdani"><img src="https://avatars.githubusercontent.com/karthikdani?v=4?s=80" width="80px;" alt="Karthik Dani"/><br /><sub><b>Karthik Dani</b></sub></a><br />🐛 💻</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jettythek"><img src="https://avatars.githubusercontent.com/jettythek?v=4?s=80" width="80px;" alt="jettythek"/><br /><sub><b>jettythek</b></sub></a><br />💻</td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- TINYTORCH-CONTRIBUTORS-END -->
---
### 🛠️ Hardware Kits Contributors (2)
<!-- KITS-CONTRIBUTORS-START -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?v=4?s=80" width="80px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br />📖 💻 🎨 ✅</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 🧪 🔧</td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- KITS-CONTRIBUTORS-END -->
---
### 🧪 Labs Contributors (1)
<!-- LABS-CONTRIBUTORS-START -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />💻 🎨 📖</td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- LABS-CONTRIBUTORS-END -->
---
**Recognize a contributor:** Comment on any issue or PR:
```
@all-contributors please add @username for doc, code, bug, or ideas
```
---
<div align="center">

948
book/.all-contributorsrc Normal file
View File

@@ -0,0 +1,948 @@
{
"projectName": "MLSysBook - Textbook",
"projectOwner": "harvard-edge",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"README.md"
],
"imageSize": 80,
"commit": false,
"commitConvention": "angular",
"contributorsPerLine": 7,
"linkToUsage": false,
"skipCi": true,
"contributors": [
{
"login": "profvjreddi",
"name": "Vijay Janapa Reddi",
"avatar_url": "https://avatars.githubusercontent.com/profvjreddi",
"profile": "https://github.com/profvjreddi",
"contributions": [
"bug",
"code",
"design",
"doc",
"ideas",
"review",
"test",
"tool"
]
},
{
"login": "Mjrovai",
"name": "Marcelo Rovai",
"avatar_url": "https://avatars.githubusercontent.com/Mjrovai",
"profile": "https://github.com/Mjrovai",
"contributions": [
"code",
"design",
"test"
]
},
{
"login": "GabrielAmazonas",
"name": "Gabriel Amazonas",
"avatar_url": "https://avatars.githubusercontent.com/GabrielAmazonas",
"profile": "https://github.com/GabrielAmazonas",
"contributions": [
"bug",
"doc",
"ideas"
]
},
{
"login": "hzeljko",
"name": "Zeljko Hrcek",
"avatar_url": "https://avatars.githubusercontent.com/hzeljko",
"profile": "https://github.com/hzeljko",
"contributions": [
"code"
]
},
{
"login": "jasonjabbour",
"name": "Jason Jabbour",
"avatar_url": "https://avatars.githubusercontent.com/jasonjabbour",
"profile": "https://github.com/jasonjabbour",
"contributions": [
"doc"
]
},
{
"login": "uchendui",
"name": "Ikechukwu Uchendu",
"avatar_url": "https://avatars.githubusercontent.com/uchendui",
"profile": "https://github.com/uchendui",
"contributions": [
"doc"
]
},
{
"login": "Naeemkh",
"name": "Naeem Khoshnevis",
"avatar_url": "https://avatars.githubusercontent.com/Naeemkh",
"profile": "https://github.com/Naeemkh",
"contributions": [
"doc"
]
},
{
"login": "Sara-Khosravi",
"name": "Sara Khosravi",
"avatar_url": "https://avatars.githubusercontent.com/Sara-Khosravi",
"profile": "https://github.com/Sara-Khosravi",
"contributions": [
"doc"
]
},
{
"login": "V0XNIHILI",
"name": "Douwe den Blanken",
"avatar_url": "https://avatars.githubusercontent.com/V0XNIHILI",
"profile": "https://github.com/V0XNIHILI",
"contributions": [
"doc"
]
},
{
"login": "18jeffreyma",
"name": "Jeffrey Ma",
"avatar_url": "https://avatars.githubusercontent.com/18jeffreyma",
"profile": "https://github.com/18jeffreyma",
"contributions": [
"doc"
]
},
{
"login": "shanzehbatool",
"name": "shanzehbatool",
"avatar_url": "https://avatars.githubusercontent.com/shanzehbatool",
"profile": "https://github.com/shanzehbatool",
"contributions": [
"doc"
]
},
{
"login": "eliasab16",
"name": "Elias",
"avatar_url": "https://avatars.githubusercontent.com/eliasab16",
"profile": "https://github.com/eliasab16",
"contributions": [
"doc"
]
},
{
"login": "JaredP94",
"name": "Jared Ping",
"avatar_url": "https://avatars.githubusercontent.com/JaredP94",
"profile": "https://github.com/JaredP94",
"contributions": [
"doc"
]
},
{
"login": "ishapira1",
"name": "Itai Shapira",
"avatar_url": "https://avatars.githubusercontent.com/ishapira1",
"profile": "https://github.com/ishapira1",
"contributions": [
"doc"
]
},
{
"login": "Maximilian Lam",
"name": "Maximilian Lam",
"avatar_url": "https://www.gravatar.com/avatar/8863743b4f26c1a20e730fcf7ebc3bc0?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "jaysonzlin",
"name": "Jayson Lin",
"avatar_url": "https://avatars.githubusercontent.com/jaysonzlin",
"profile": "https://github.com/jaysonzlin",
"contributions": [
"doc"
]
},
{
"login": "sophiacho1",
"name": "Sophia Cho",
"avatar_url": "https://avatars.githubusercontent.com/sophiacho1",
"profile": "https://github.com/sophiacho1",
"contributions": [
"doc"
]
},
{
"login": "andreamurillomtz",
"name": "Andrea",
"avatar_url": "https://avatars.githubusercontent.com/andreamurillomtz",
"profile": "https://github.com/andreamurillomtz",
"contributions": [
"doc"
]
},
{
"login": "alxrod",
"name": "Alex Rodriguez",
"avatar_url": "https://avatars.githubusercontent.com/alxrod",
"profile": "https://github.com/alxrod",
"contributions": [
"doc"
]
},
{
"login": "korneelf1",
"name": "Korneel Van den Berghe",
"avatar_url": "https://avatars.githubusercontent.com/korneelf1",
"profile": "https://github.com/korneelf1",
"contributions": [
"doc"
]
},
{
"login": "foundingnimo",
"name": "Nimo",
"avatar_url": "https://avatars.githubusercontent.com/foundingnimo",
"profile": "https://github.com/foundingnimo",
"contributions": [
"doc"
]
},
{
"login": "colbybanbury",
"name": "Colby Banbury",
"avatar_url": "https://avatars.githubusercontent.com/colbybanbury",
"profile": "https://github.com/colbybanbury",
"contributions": [
"doc"
]
},
{
"login": "zishenwan",
"name": "Zishen Wan",
"avatar_url": "https://avatars.githubusercontent.com/zishenwan",
"profile": "https://github.com/zishenwan",
"contributions": [
"doc"
]
},
{
"login": "mmaz",
"name": "Mark Mazumder",
"avatar_url": "https://avatars.githubusercontent.com/mmaz",
"profile": "https://github.com/mmaz",
"contributions": [
"doc"
]
},
{
"login": "ma3mool",
"name": "Abdulrahman Mahmoud",
"avatar_url": "https://avatars.githubusercontent.com/ma3mool",
"profile": "https://github.com/ma3mool",
"contributions": [
"doc"
]
},
{
"login": "DivyaAmirtharaj",
"name": "Divya Amirtharaj",
"avatar_url": "https://avatars.githubusercontent.com/DivyaAmirtharaj",
"profile": "https://github.com/DivyaAmirtharaj",
"contributions": [
"doc"
]
},
{
"login": "srivatsankrishnan",
"name": "Srivatsan Krishnan",
"avatar_url": "https://avatars.githubusercontent.com/srivatsankrishnan",
"profile": "https://github.com/srivatsankrishnan",
"contributions": [
"doc"
]
},
{
"login": "arnaumarin",
"name": "marin-llobet",
"avatar_url": "https://avatars.githubusercontent.com/arnaumarin",
"profile": "https://github.com/arnaumarin",
"contributions": [
"doc"
]
},
{
"login": "aptl26",
"name": "Aghyad Deeb",
"avatar_url": "https://avatars.githubusercontent.com/aptl26",
"profile": "https://github.com/aptl26",
"contributions": [
"doc"
]
},
{
"login": "James-QiuHaoran",
"name": "Haoran Qiu",
"avatar_url": "https://avatars.githubusercontent.com/James-QiuHaoran",
"profile": "https://github.com/James-QiuHaoran",
"contributions": [
"doc"
]
},
{
"login": "Ekhao",
"name": "Emil Njor",
"avatar_url": "https://avatars.githubusercontent.com/Ekhao",
"profile": "https://github.com/Ekhao",
"contributions": [
"doc"
]
},
{
"login": "ELSuitorHarvard",
"name": "ELSuitorHarvard",
"avatar_url": "https://avatars.githubusercontent.com/ELSuitorHarvard",
"profile": "https://github.com/ELSuitorHarvard",
"contributions": [
"doc"
]
},
{
"login": "kaiM0ves",
"name": "kaiM0ves",
"avatar_url": "https://avatars.githubusercontent.com/kaiM0ves",
"profile": "https://github.com/kaiM0ves",
"contributions": [
"doc"
]
},
{
"login": "oishib",
"name": "oishib",
"avatar_url": "https://avatars.githubusercontent.com/oishib",
"profile": "https://github.com/oishib",
"contributions": [
"doc"
]
},
{
"login": "jared-ni",
"name": "Jared Ni",
"avatar_url": "https://avatars.githubusercontent.com/jared-ni",
"profile": "https://github.com/jared-ni",
"contributions": [
"doc"
]
},
{
"login": "AditiR-42",
"name": "Aditi Raju",
"avatar_url": "https://avatars.githubusercontent.com/AditiR-42",
"profile": "https://github.com/AditiR-42",
"contributions": [
"doc"
]
},
{
"login": "MichaelSchnebly",
"name": "Michael Schnebly",
"avatar_url": "https://avatars.githubusercontent.com/MichaelSchnebly",
"profile": "https://github.com/MichaelSchnebly",
"contributions": [
"doc"
]
},
{
"login": "VThuong99",
"name": "Thuong Duong",
"avatar_url": "https://avatars.githubusercontent.com/VThuong99",
"profile": "https://github.com/VThuong99",
"contributions": [
"doc"
]
},
{
"login": "leo47007",
"name": "Yu-Shun Hsiao",
"avatar_url": "https://avatars.githubusercontent.com/leo47007",
"profile": "https://github.com/leo47007",
"contributions": [
"doc"
]
},
{
"login": "BaeHenryS",
"name": "Henry Bae",
"avatar_url": "https://avatars.githubusercontent.com/BaeHenryS",
"profile": "https://github.com/BaeHenryS",
"contributions": [
"doc"
]
},
{
"login": "eimlav",
"name": "Eimhin Laverty",
"avatar_url": "https://avatars.githubusercontent.com/eimlav",
"profile": "https://github.com/eimlav",
"contributions": [
"doc"
]
},
{
"login": "jaywonchung",
"name": "Jae-Won Chung",
"avatar_url": "https://avatars.githubusercontent.com/jaywonchung",
"profile": "https://github.com/jaywonchung",
"contributions": [
"doc"
]
},
{
"login": "ShvetankPrakash",
"name": "Shvetank Prakash",
"avatar_url": "https://avatars.githubusercontent.com/ShvetankPrakash",
"profile": "https://github.com/ShvetankPrakash",
"contributions": [
"doc"
]
},
{
"login": "marcozennaro",
"name": "Marco Zennaro",
"avatar_url": "https://avatars.githubusercontent.com/marcozennaro",
"profile": "https://github.com/marcozennaro",
"contributions": [
"doc"
]
},
{
"login": "aryatschand",
"name": "Arya Tschand",
"avatar_url": "https://avatars.githubusercontent.com/aryatschand",
"profile": "https://github.com/aryatschand",
"contributions": [
"doc"
]
},
{
"login": "arbass22",
"name": "Andrew Bass",
"avatar_url": "https://avatars.githubusercontent.com/arbass22",
"profile": "https://github.com/arbass22",
"contributions": [
"doc"
]
},
{
"login": "pongtr",
"name": "Pong Trairatvorakul",
"avatar_url": "https://avatars.githubusercontent.com/pongtr",
"profile": "https://github.com/pongtr",
"contributions": [
"doc"
]
},
{
"login": "euranofshin",
"name": "Eura Nofshin",
"avatar_url": "https://avatars.githubusercontent.com/euranofshin",
"profile": "https://github.com/euranofshin",
"contributions": [
"doc"
]
},
{
"login": "Matthew Stewart",
"name": "Matthew Stewart",
"avatar_url": "https://www.gravatar.com/avatar/0c931fcfd03cd548d44c90602dd773ba?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Emeka Ezike",
"name": "Emeka Ezike",
"avatar_url": "https://www.gravatar.com/avatar/af39c27c6090c50a1921a9b6366e81cc?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "jianqingdu",
"name": "jianqingdu",
"avatar_url": "https://avatars.githubusercontent.com/jianqingdu",
"profile": "https://github.com/jianqingdu",
"contributions": [
"doc"
]
},
{
"login": "jzhou1318",
"name": "Jennifer Zhou",
"avatar_url": "https://avatars.githubusercontent.com/jzhou1318",
"profile": "https://github.com/jzhou1318",
"contributions": [
"doc"
]
},
{
"login": "vitasam",
"name": "The Random DIY",
"avatar_url": "https://avatars.githubusercontent.com/vitasam",
"profile": "https://github.com/vitasam",
"contributions": [
"doc"
]
},
{
"login": "Fatima Shah",
"name": "Fatima Shah",
"avatar_url": "https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "BrunoScaglione",
"name": "Bruno Scaglione",
"avatar_url": "https://avatars.githubusercontent.com/BrunoScaglione",
"profile": "https://github.com/BrunoScaglione",
"contributions": [
"doc"
]
},
{
"login": "Allen-Kuang",
"name": "Allen-Kuang",
"avatar_url": "https://avatars.githubusercontent.com/Allen-Kuang",
"profile": "https://github.com/Allen-Kuang",
"contributions": [
"doc"
]
},
{
"login": "Tess314",
"name": "Tess314",
"avatar_url": "https://www.gravatar.com/avatar/4ad8cdf19eb3b666ace97d3eedb19278?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "taunoe",
"name": "Tauno Erik",
"avatar_url": "https://avatars.githubusercontent.com/taunoe",
"profile": "https://github.com/taunoe",
"contributions": [
"doc"
]
},
{
"login": "gnodipac886",
"name": "gnodipac886",
"avatar_url": "https://avatars.githubusercontent.com/gnodipac886",
"profile": "https://github.com/gnodipac886",
"contributions": [
"doc"
]
},
{
"login": "serco425",
"name": "Sercan Ayg\u00fcn",
"avatar_url": "https://avatars.githubusercontent.com/serco425",
"profile": "https://github.com/serco425",
"contributions": [
"doc"
]
},
{
"login": "TheHiddenLayer",
"name": "TheHiddenLayer",
"avatar_url": "https://avatars.githubusercontent.com/TheHiddenLayer",
"profile": "https://github.com/TheHiddenLayer",
"contributions": [
"doc"
]
},
{
"login": "Gjain234",
"name": "Gauri Jain",
"avatar_url": "https://avatars.githubusercontent.com/Gjain234",
"profile": "https://github.com/Gjain234",
"contributions": [
"doc"
]
},
{
"login": "FinAminToastCrunch",
"name": "Fin Amin",
"avatar_url": "https://avatars.githubusercontent.com/FinAminToastCrunch",
"profile": "https://github.com/FinAminToastCrunch",
"contributions": [
"doc"
]
},
{
"login": "alex-oesterling",
"name": "Alex Oesterling",
"avatar_url": "https://avatars.githubusercontent.com/alex-oesterling",
"profile": "https://github.com/alex-oesterling",
"contributions": [
"doc"
]
},
{
"login": "AbenezerKb",
"name": "Abenezer Angamo",
"avatar_url": "https://avatars.githubusercontent.com/AbenezerKb",
"profile": "https://github.com/AbenezerKb",
"contributions": [
"doc"
]
},
{
"login": "BravoBaldo",
"name": "Baldassarre Cesarano",
"avatar_url": "https://avatars.githubusercontent.com/BravoBaldo",
"profile": "https://github.com/BravoBaldo",
"contributions": [
"doc"
]
},
{
"login": "Jahnic-kb",
"name": "Jahnic Beck",
"avatar_url": "https://avatars.githubusercontent.com/Jahnic-kb",
"profile": "https://github.com/Jahnic-kb",
"contributions": [
"doc"
]
},
{
"login": "aethernavshulkraven-allain",
"name": "\u0905\u0930\u0928\u0935 \u0936\u0941\u0915\u094d\u0932\u093e | Arnav Shukla",
"avatar_url": "https://avatars.githubusercontent.com/aethernavshulkraven-allain",
"profile": "https://github.com/aethernavshulkraven-allain",
"contributions": [
"doc"
]
},
{
"login": "RinZ27",
"name": "Rin",
"avatar_url": "https://avatars.githubusercontent.com/RinZ27",
"profile": "https://github.com/RinZ27",
"contributions": [
"doc"
]
},
{
"login": "bilgeacun",
"name": "Bilge Acun",
"avatar_url": "https://avatars.githubusercontent.com/bilgeacun",
"profile": "https://github.com/bilgeacun",
"contributions": [
"doc"
]
},
{
"login": "atcheng2",
"name": "Andy Cheng",
"avatar_url": "https://avatars.githubusercontent.com/atcheng2",
"profile": "https://github.com/atcheng2",
"contributions": [
"doc"
]
},
{
"login": "arighosh05",
"name": "Aritra Ghosh",
"avatar_url": "https://avatars.githubusercontent.com/arighosh05",
"profile": "https://github.com/arighosh05",
"contributions": [
"doc"
]
},
{
"login": "abigailswallow",
"name": "abigailswallow",
"avatar_url": "https://avatars.githubusercontent.com/abigailswallow",
"profile": "https://github.com/abigailswallow",
"contributions": [
"doc"
]
},
{
"login": "YangZhou1997",
"name": "Yang Zhou",
"avatar_url": "https://avatars.githubusercontent.com/YangZhou1997",
"profile": "https://github.com/YangZhou1997",
"contributions": [
"doc"
]
},
{
"login": "XaicuL",
"name": "JEON HYUNJUN(Luciano)",
"avatar_url": "https://avatars.githubusercontent.com/XaicuL",
"profile": "https://github.com/XaicuL",
"contributions": [
"doc"
]
},
{
"login": "emmanuel2406",
"name": "Emmanuel Rassou",
"avatar_url": "https://avatars.githubusercontent.com/emmanuel2406",
"profile": "https://github.com/emmanuel2406",
"contributions": [
"doc"
]
},
{
"login": "jasonlyik",
"name": "Jason Yik",
"avatar_url": "https://avatars.githubusercontent.com/jasonlyik",
"profile": "https://github.com/jasonlyik",
"contributions": [
"doc"
]
},
{
"login": "jessicaquaye",
"name": "Jessica Quaye",
"avatar_url": "https://avatars.githubusercontent.com/jessicaquaye",
"profile": "https://github.com/jessicaquaye",
"contributions": [
"doc"
]
},
{
"login": "cursoragent",
"name": "Cursor Agent",
"avatar_url": "https://avatars.githubusercontent.com/cursoragent",
"profile": "https://github.com/cursoragent",
"contributions": [
"doc"
]
},
{
"login": "happyappledog",
"name": "happyappledog",
"avatar_url": "https://avatars.githubusercontent.com/happyappledog",
"profile": "https://github.com/happyappledog",
"contributions": [
"doc"
]
},
{
"login": "snuggs",
"name": "Snuggs",
"avatar_url": "https://avatars.githubusercontent.com/snuggs",
"profile": "https://github.com/snuggs",
"contributions": [
"doc"
]
},
{
"login": "swilcock0",
"name": "Sam Wilcock",
"avatar_url": "https://avatars.githubusercontent.com/swilcock0",
"profile": "https://github.com/swilcock0",
"contributions": [
"doc"
]
},
{
"login": "sjohri20",
"name": "Shreya Johri",
"avatar_url": "https://avatars.githubusercontent.com/sjohri20",
"profile": "https://github.com/sjohri20",
"contributions": [
"doc"
]
},
{
"login": "skmur",
"name": "Sonia Murthy",
"avatar_url": "https://avatars.githubusercontent.com/skmur",
"profile": "https://github.com/skmur",
"contributions": [
"doc"
]
},
{
"login": "Costin-Andrei Oncescu",
"name": "Costin-Andrei Oncescu",
"avatar_url": "https://www.gravatar.com/avatar/fc4f3460cdfb9365ab59bdeafb06413e?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "formlsysbookissue",
"name": "formlsysbookissue",
"avatar_url": "https://www.gravatar.com/avatar/0d6b8616427d8b19d425c9808692e347?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Annie Laurie Cook",
"name": "Annie Laurie Cook",
"avatar_url": "https://www.gravatar.com/avatar/7cd8d5dfd83071f23979019d97655dc5?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Parampreet Singh",
"name": "Parampreet Singh",
"avatar_url": "https://www.gravatar.com/avatar/5aa037840c0ca11ee42784ed4843c655?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Vijay Edupuganti",
"name": "Vijay Edupuganti",
"avatar_url": "https://www.gravatar.com/avatar/b15b6e0e9adf58099905c1a0fd474cb9?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Jothi Ramaswamy",
"name": "Jothi Ramaswamy",
"avatar_url": "https://www.gravatar.com/avatar/f88052cca4f401d9b0f43aed0a53434a?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Batur Arslan",
"name": "Batur Arslan",
"avatar_url": "https://www.gravatar.com/avatar/35a8d9ffd03f05e79a2c6ce6206a56f2?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Curren Iyer",
"name": "Curren Iyer",
"avatar_url": "https://www.gravatar.com/avatar/bd53d146aa888548c8db4da02bf81e7a?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Edward Jin",
"name": "Edward Jin",
"avatar_url": "https://www.gravatar.com/avatar/8d8410338458e08bd5e4b96f58e1c217?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Tess Watt",
"name": "Tess Watt",
"avatar_url": "https://www.gravatar.com/avatar/28c6123d2c9f75578d3ccdedb0df3d11?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "bluebaer7",
"name": "bluebaer7",
"avatar_url": "https://www.gravatar.com/avatar/ef139181fe00190f21730f6912532e9e?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "yanjingl",
"name": "yanjingl",
"avatar_url": "https://www.gravatar.com/avatar/f5d58ba6aa9b00189d4c018d370e8f43?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "a-saraf",
"name": "a-saraf",
"avatar_url": "https://www.gravatar.com/avatar/a5a47df988ab1720dd706062e523ca32?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "songhan",
"name": "songhan",
"avatar_url": "https://www.gravatar.com/avatar/c2dc311aa8122d5f5f061e1db14682b1?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "jvijay",
"name": "jvijay",
"avatar_url": "https://www.gravatar.com/avatar/4814aad67982ab07a69006a1ce9d2a72?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "Zishen",
"name": "Zishen",
"avatar_url": "https://www.gravatar.com/avatar/43b1feff77c8a95fd581774fb8ec891f?d=identicon&s=100",
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
"contributions": [
"doc"
]
},
{
"login": "kai4avaya",
"name": "Kai Kleinbard",
"avatar_url": "https://avatars.githubusercontent.com/kai4avaya",
"profile": "https://github.com/kai4avaya",
"contributions": [
"code",
"tool"
]
},
{
"login": "didier-durand",
"name": "Didier Durand",
"avatar_url": "https://avatars.githubusercontent.com/didier-durand",
"profile": "https://github.com/didier-durand",
"contributions": [
"doc",
"bug"
]
}
]
}

View File

@@ -173,6 +173,162 @@ We welcome contributions! See [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) for g
---
## Contributors
Thanks to these wonderful people who helped improve the book ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 💡 👀 🧪 🔧</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?v=4?s=80" width="80px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br />💻 🎨 🧪</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GabrielAmazonas"><img src="https://avatars.githubusercontent.com/GabrielAmazonas?v=4?s=80" width="80px;" alt="Gabriel Amazonas"/><br /><sub><b>Gabriel Amazonas</b></sub></a><br />🐛 📖 💡</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hzeljko"><img src="https://avatars.githubusercontent.com/hzeljko?v=4?s=80" width="80px;" alt="Zeljko Hrcek"/><br /><sub><b>Zeljko Hrcek</b></sub></a><br />💻</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jasonjabbour"><img src="https://avatars.githubusercontent.com/jasonjabbour?v=4?s=80" width="80px;" alt="Jason Jabbour"/><br /><sub><b>Jason Jabbour</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/uchendui"><img src="https://avatars.githubusercontent.com/uchendui?v=4?s=80" width="80px;" alt="Ikechukwu Uchendu"/><br /><sub><b>Ikechukwu Uchendu</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Naeemkh"><img src="https://avatars.githubusercontent.com/Naeemkh?v=4?s=80" width="80px;" alt="Naeem Khoshnevis"/><br /><sub><b>Naeem Khoshnevis</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Sara-Khosravi"><img src="https://avatars.githubusercontent.com/Sara-Khosravi?v=4?s=80" width="80px;" alt="Sara Khosravi"/><br /><sub><b>Sara Khosravi</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/V0XNIHILI"><img src="https://avatars.githubusercontent.com/V0XNIHILI?v=4?s=80" width="80px;" alt="Douwe den Blanken"/><br /><sub><b>Douwe den Blanken</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/18jeffreyma"><img src="https://avatars.githubusercontent.com/18jeffreyma?v=4?s=80" width="80px;" alt="Jeffrey Ma"/><br /><sub><b>Jeffrey Ma</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shanzehbatool"><img src="https://avatars.githubusercontent.com/shanzehbatool?v=4?s=80" width="80px;" alt="shanzehbatool"/><br /><sub><b>shanzehbatool</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eliasab16"><img src="https://avatars.githubusercontent.com/eliasab16?v=4?s=80" width="80px;" alt="Elias"/><br /><sub><b>Elias</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JaredP94"><img src="https://avatars.githubusercontent.com/JaredP94?v=4?s=80" width="80px;" alt="Jared Ping"/><br /><sub><b>Jared Ping</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ishapira1"><img src="https://avatars.githubusercontent.com/ishapira1?v=4?s=80" width="80px;" alt="Itai Shapira"/><br /><sub><b>Itai Shapira</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8863743b4f26c1a20e730fcf7ebc3bc0?d=identicon&s=100?v=4?s=80" width="80px;" alt="Maximilian Lam"/><br /><sub><b>Maximilian Lam</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jaysonzlin"><img src="https://avatars.githubusercontent.com/jaysonzlin?v=4?s=80" width="80px;" alt="Jayson Lin"/><br /><sub><b>Jayson Lin</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sophiacho1"><img src="https://avatars.githubusercontent.com/sophiacho1?v=4?s=80" width="80px;" alt="Sophia Cho"/><br /><sub><b>Sophia Cho</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/andreamurillomtz"><img src="https://avatars.githubusercontent.com/andreamurillomtz?v=4?s=80" width="80px;" alt="Andrea"/><br /><sub><b>Andrea</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alxrod"><img src="https://avatars.githubusercontent.com/alxrod?v=4?s=80" width="80px;" alt="Alex Rodriguez"/><br /><sub><b>Alex Rodriguez</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/korneelf1"><img src="https://avatars.githubusercontent.com/korneelf1?v=4?s=80" width="80px;" alt="Korneel Van den Berghe"/><br /><sub><b>Korneel Van den Berghe</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/foundingnimo"><img src="https://avatars.githubusercontent.com/foundingnimo?v=4?s=80" width="80px;" alt="Nimo"/><br /><sub><b>Nimo</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/colbybanbury"><img src="https://avatars.githubusercontent.com/colbybanbury?v=4?s=80" width="80px;" alt="Colby Banbury"/><br /><sub><b>Colby Banbury</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zishenwan"><img src="https://avatars.githubusercontent.com/zishenwan?v=4?s=80" width="80px;" alt="Zishen Wan"/><br /><sub><b>Zishen Wan</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mmaz"><img src="https://avatars.githubusercontent.com/mmaz?v=4?s=80" width="80px;" alt="Mark Mazumder"/><br /><sub><b>Mark Mazumder</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ma3mool"><img src="https://avatars.githubusercontent.com/ma3mool?v=4?s=80" width="80px;" alt="Abdulrahman Mahmoud"/><br /><sub><b>Abdulrahman Mahmoud</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DivyaAmirtharaj"><img src="https://avatars.githubusercontent.com/DivyaAmirtharaj?v=4?s=80" width="80px;" alt="Divya Amirtharaj"/><br /><sub><b>Divya Amirtharaj</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/srivatsankrishnan"><img src="https://avatars.githubusercontent.com/srivatsankrishnan?v=4?s=80" width="80px;" alt="Srivatsan Krishnan"/><br /><sub><b>Srivatsan Krishnan</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arnaumarin"><img src="https://avatars.githubusercontent.com/arnaumarin?v=4?s=80" width="80px;" alt="marin-llobet"/><br /><sub><b>marin-llobet</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aptl26"><img src="https://avatars.githubusercontent.com/aptl26?v=4?s=80" width="80px;" alt="Aghyad Deeb"/><br /><sub><b>Aghyad Deeb</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/James-QiuHaoran"><img src="https://avatars.githubusercontent.com/James-QiuHaoran?v=4?s=80" width="80px;" alt="Haoran Qiu"/><br /><sub><b>Haoran Qiu</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ekhao"><img src="https://avatars.githubusercontent.com/Ekhao?v=4?s=80" width="80px;" alt="Emil Njor"/><br /><sub><b>Emil Njor</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ELSuitorHarvard"><img src="https://avatars.githubusercontent.com/ELSuitorHarvard?v=4?s=80" width="80px;" alt="ELSuitorHarvard"/><br /><sub><b>ELSuitorHarvard</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kaiM0ves"><img src="https://avatars.githubusercontent.com/kaiM0ves?v=4?s=80" width="80px;" alt="kaiM0ves"/><br /><sub><b>kaiM0ves</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oishib"><img src="https://avatars.githubusercontent.com/oishib?v=4?s=80" width="80px;" alt="oishib"/><br /><sub><b>oishib</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jared-ni"><img src="https://avatars.githubusercontent.com/jared-ni?v=4?s=80" width="80px;" alt="Jared Ni"/><br /><sub><b>Jared Ni</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AditiR-42"><img src="https://avatars.githubusercontent.com/AditiR-42?v=4?s=80" width="80px;" alt="Aditi Raju"/><br /><sub><b>Aditi Raju</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MichaelSchnebly"><img src="https://avatars.githubusercontent.com/MichaelSchnebly?v=4?s=80" width="80px;" alt="Michael Schnebly"/><br /><sub><b>Michael Schnebly</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VThuong99"><img src="https://avatars.githubusercontent.com/VThuong99?v=4?s=80" width="80px;" alt="Thuong Duong"/><br /><sub><b>Thuong Duong</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/leo47007"><img src="https://avatars.githubusercontent.com/leo47007?v=4?s=80" width="80px;" alt="Yu-Shun Hsiao"/><br /><sub><b>Yu-Shun Hsiao</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BaeHenryS"><img src="https://avatars.githubusercontent.com/BaeHenryS?v=4?s=80" width="80px;" alt="Henry Bae"/><br /><sub><b>Henry Bae</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eimlav"><img src="https://avatars.githubusercontent.com/eimlav?v=4?s=80" width="80px;" alt="Eimhin Laverty"/><br /><sub><b>Eimhin Laverty</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jaywonchung"><img src="https://avatars.githubusercontent.com/jaywonchung?v=4?s=80" width="80px;" alt="Jae-Won Chung"/><br /><sub><b>Jae-Won Chung</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ShvetankPrakash"><img src="https://avatars.githubusercontent.com/ShvetankPrakash?v=4?s=80" width="80px;" alt="Shvetank Prakash"/><br /><sub><b>Shvetank Prakash</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marcozennaro"><img src="https://avatars.githubusercontent.com/marcozennaro?v=4?s=80" width="80px;" alt="Marco Zennaro"/><br /><sub><b>Marco Zennaro</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aryatschand"><img src="https://avatars.githubusercontent.com/aryatschand?v=4?s=80" width="80px;" alt="Arya Tschand"/><br /><sub><b>Arya Tschand</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arbass22"><img src="https://avatars.githubusercontent.com/arbass22?v=4?s=80" width="80px;" alt="Andrew Bass"/><br /><sub><b>Andrew Bass</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pongtr"><img src="https://avatars.githubusercontent.com/pongtr?v=4?s=80" width="80px;" alt="Pong Trairatvorakul"/><br /><sub><b>Pong Trairatvorakul</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/euranofshin"><img src="https://avatars.githubusercontent.com/euranofshin?v=4?s=80" width="80px;" alt="Eura Nofshin"/><br /><sub><b>Eura Nofshin</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0c931fcfd03cd548d44c90602dd773ba?d=identicon&s=100?v=4?s=80" width="80px;" alt="Matthew Stewart"/><br /><sub><b>Matthew Stewart</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/af39c27c6090c50a1921a9b6366e81cc?d=identicon&s=100?v=4?s=80" width="80px;" alt="Emeka Ezike"/><br /><sub><b>Emeka Ezike</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jianqingdu"><img src="https://avatars.githubusercontent.com/jianqingdu?v=4?s=80" width="80px;" alt="jianqingdu"/><br /><sub><b>jianqingdu</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jzhou1318"><img src="https://avatars.githubusercontent.com/jzhou1318?v=4?s=80" width="80px;" alt="Jennifer Zhou"/><br /><sub><b>Jennifer Zhou</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vitasam"><img src="https://avatars.githubusercontent.com/vitasam?v=4?s=80" width="80px;" alt="The Random DIY"/><br /><sub><b>The Random DIY</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100?v=4?s=80" width="80px;" alt="Fatima Shah"/><br /><sub><b>Fatima Shah</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BrunoScaglione"><img src="https://avatars.githubusercontent.com/BrunoScaglione?v=4?s=80" width="80px;" alt="Bruno Scaglione"/><br /><sub><b>Bruno Scaglione</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allen-Kuang"><img src="https://avatars.githubusercontent.com/Allen-Kuang?v=4?s=80" width="80px;" alt="Allen-Kuang"/><br /><sub><b>Allen-Kuang</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4ad8cdf19eb3b666ace97d3eedb19278?d=identicon&s=100?v=4?s=80" width="80px;" alt="Tess314"/><br /><sub><b>Tess314</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/taunoe"><img src="https://avatars.githubusercontent.com/taunoe?v=4?s=80" width="80px;" alt="Tauno Erik"/><br /><sub><b>Tauno Erik</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gnodipac886"><img src="https://avatars.githubusercontent.com/gnodipac886?v=4?s=80" width="80px;" alt="gnodipac886"/><br /><sub><b>gnodipac886</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/serco425"><img src="https://avatars.githubusercontent.com/serco425?v=4?s=80" width="80px;" alt="Sercan Aygün"/><br /><sub><b>Sercan Aygün</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TheHiddenLayer"><img src="https://avatars.githubusercontent.com/TheHiddenLayer?v=4?s=80" width="80px;" alt="TheHiddenLayer"/><br /><sub><b>TheHiddenLayer</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Gjain234"><img src="https://avatars.githubusercontent.com/Gjain234?v=4?s=80" width="80px;" alt="Gauri Jain"/><br /><sub><b>Gauri Jain</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FinAminToastCrunch"><img src="https://avatars.githubusercontent.com/FinAminToastCrunch?v=4?s=80" width="80px;" alt="Fin Amin"/><br /><sub><b>Fin Amin</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alex-oesterling"><img src="https://avatars.githubusercontent.com/alex-oesterling?v=4?s=80" width="80px;" alt="Alex Oesterling"/><br /><sub><b>Alex Oesterling</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AbenezerKb"><img src="https://avatars.githubusercontent.com/AbenezerKb?v=4?s=80" width="80px;" alt="Abenezer Angamo"/><br /><sub><b>Abenezer Angamo</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BravoBaldo"><img src="https://avatars.githubusercontent.com/BravoBaldo?v=4?s=80" width="80px;" alt="Baldassarre Cesarano"/><br /><sub><b>Baldassarre Cesarano</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jahnic-kb"><img src="https://avatars.githubusercontent.com/Jahnic-kb?v=4?s=80" width="80px;" alt="Jahnic Beck"/><br /><sub><b>Jahnic Beck</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aethernavshulkraven-allain"><img src="https://avatars.githubusercontent.com/aethernavshulkraven-allain?v=4?s=80" width="80px;" alt="अरनव शुक्ला | Arnav Shukla"/><br /><sub><b>अरनव शुक्ला | Arnav Shukla</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RinZ27"><img src="https://avatars.githubusercontent.com/RinZ27?v=4?s=80" width="80px;" alt="Rin"/><br /><sub><b>Rin</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bilgeacun"><img src="https://avatars.githubusercontent.com/bilgeacun?v=4?s=80" width="80px;" alt="Bilge Acun"/><br /><sub><b>Bilge Acun</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/atcheng2"><img src="https://avatars.githubusercontent.com/atcheng2?v=4?s=80" width="80px;" alt="Andy Cheng"/><br /><sub><b>Andy Cheng</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arighosh05"><img src="https://avatars.githubusercontent.com/arighosh05?v=4?s=80" width="80px;" alt="Aritra Ghosh"/><br /><sub><b>Aritra Ghosh</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/abigailswallow"><img src="https://avatars.githubusercontent.com/abigailswallow?v=4?s=80" width="80px;" alt="abigailswallow"/><br /><sub><b>abigailswallow</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/YangZhou1997"><img src="https://avatars.githubusercontent.com/YangZhou1997?v=4?s=80" width="80px;" alt="Yang Zhou"/><br /><sub><b>Yang Zhou</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XaicuL"><img src="https://avatars.githubusercontent.com/XaicuL?v=4?s=80" width="80px;" alt="JEON HYUNJUN(Luciano)"/><br /><sub><b>JEON HYUNJUN(Luciano)</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/emmanuel2406"><img src="https://avatars.githubusercontent.com/emmanuel2406?v=4?s=80" width="80px;" alt="Emmanuel Rassou"/><br /><sub><b>Emmanuel Rassou</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jasonlyik"><img src="https://avatars.githubusercontent.com/jasonlyik?v=4?s=80" width="80px;" alt="Jason Yik"/><br /><sub><b>Jason Yik</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jessicaquaye"><img src="https://avatars.githubusercontent.com/jessicaquaye?v=4?s=80" width="80px;" alt="Jessica Quaye"/><br /><sub><b>Jessica Quaye</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cursoragent"><img src="https://avatars.githubusercontent.com/cursoragent?v=4?s=80" width="80px;" alt="Cursor Agent"/><br /><sub><b>Cursor Agent</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/happyappledog"><img src="https://avatars.githubusercontent.com/happyappledog?v=4?s=80" width="80px;" alt="happyappledog"/><br /><sub><b>happyappledog</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/snuggs"><img src="https://avatars.githubusercontent.com/snuggs?v=4?s=80" width="80px;" alt="Snuggs"/><br /><sub><b>Snuggs</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/swilcock0"><img src="https://avatars.githubusercontent.com/swilcock0?v=4?s=80" width="80px;" alt="Sam Wilcock"/><br /><sub><b>Sam Wilcock</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sjohri20"><img src="https://avatars.githubusercontent.com/sjohri20?v=4?s=80" width="80px;" alt="Shreya Johri"/><br /><sub><b>Shreya Johri</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/skmur"><img src="https://avatars.githubusercontent.com/skmur?v=4?s=80" width="80px;" alt="Sonia Murthy"/><br /><sub><b>Sonia Murthy</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/fc4f3460cdfb9365ab59bdeafb06413e?d=identicon&s=100?v=4?s=80" width="80px;" alt="Costin-Andrei Oncescu"/><br /><sub><b>Costin-Andrei Oncescu</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0d6b8616427d8b19d425c9808692e347?d=identicon&s=100?v=4?s=80" width="80px;" alt="formlsysbookissue"/><br /><sub><b>formlsysbookissue</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/7cd8d5dfd83071f23979019d97655dc5?d=identicon&s=100?v=4?s=80" width="80px;" alt="Annie Laurie Cook"/><br /><sub><b>Annie Laurie Cook</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/5aa037840c0ca11ee42784ed4843c655?d=identicon&s=100?v=4?s=80" width="80px;" alt="Parampreet Singh"/><br /><sub><b>Parampreet Singh</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/b15b6e0e9adf58099905c1a0fd474cb9?d=identicon&s=100?v=4?s=80" width="80px;" alt="Vijay Edupuganti"/><br /><sub><b>Vijay Edupuganti</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f88052cca4f401d9b0f43aed0a53434a?d=identicon&s=100?v=4?s=80" width="80px;" alt="Jothi Ramaswamy"/><br /><sub><b>Jothi Ramaswamy</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/35a8d9ffd03f05e79a2c6ce6206a56f2?d=identicon&s=100?v=4?s=80" width="80px;" alt="Batur Arslan"/><br /><sub><b>Batur Arslan</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/bd53d146aa888548c8db4da02bf81e7a?d=identicon&s=100?v=4?s=80" width="80px;" alt="Curren Iyer"/><br /><sub><b>Curren Iyer</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8d8410338458e08bd5e4b96f58e1c217?d=identicon&s=100?v=4?s=80" width="80px;" alt="Edward Jin"/><br /><sub><b>Edward Jin</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/28c6123d2c9f75578d3ccdedb0df3d11?d=identicon&s=100?v=4?s=80" width="80px;" alt="Tess Watt"/><br /><sub><b>Tess Watt</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/ef139181fe00190f21730f6912532e9e?d=identicon&s=100?v=4?s=80" width="80px;" alt="bluebaer7"/><br /><sub><b>bluebaer7</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f5d58ba6aa9b00189d4c018d370e8f43?d=identicon&s=100?v=4?s=80" width="80px;" alt="yanjingl"/><br /><sub><b>yanjingl</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/a5a47df988ab1720dd706062e523ca32?d=identicon&s=100?v=4?s=80" width="80px;" alt="a-saraf"/><br /><sub><b>a-saraf</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/c2dc311aa8122d5f5f061e1db14682b1?d=identicon&s=100?v=4?s=80" width="80px;" alt="songhan"/><br /><sub><b>songhan</b></sub></a><br />📖</td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4814aad67982ab07a69006a1ce9d2a72?d=identicon&s=100?v=4?s=80" width="80px;" alt="jvijay"/><br /><sub><b>jvijay</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/43b1feff77c8a95fd581774fb8ec891f?d=identicon&s=100?v=4?s=80" width="80px;" alt="Zishen"/><br /><sub><b>Zishen</b></sub></a><br />📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?v=4?s=80" width="80px;" alt="Kai Kleinbard"/><br /><sub><b>Kai Kleinbard</b></sub></a><br />💻 🔧</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?v=4?s=80" width="80px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br />📖 🐛</td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
**Recognize a contributor:** Comment on any issue or PR:
```
@all-contributors please add @username for doc, review, translation, or design
```
---
## License
Book content is licensed under **Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International** (CC BY-NC-SA 4.0).

View File

@@ -88,3 +88,32 @@ Opening an early PR is encouraged. This will allow us to provide feedback on you
For a more detailed guide on the CS249r documentation process and peer review,
check [here](https://docs.google.com/document/d/1izDoWwFLnV8XK2FYCl23_9KYL_7EQ5OWLo-PCNUGle0).
## Contributor Recognition
We use [All Contributors](https://allcontributors.org) to recognize everyone who helps improve the book.
### How to Recognize a Contributor
After merging a PR or resolving an issue, comment:
```
@all-contributors please add @username for TYPE
```
### Contribution Types
| Type | Emoji | Use For |
|------|-------|---------|
| `doc` | 📖 | Wrote or improved content |
| `review` | 👀 | Reviewed chapters or PRs |
| `translation` | 🌍 | Translated content |
| `design` | 🎨 | Created diagrams or figures |
| `bug` | 🐛 | Found errors or typos |
| `ideas` | 💡 | Suggested improvements |
### Example
```
@all-contributors please add @contributor for doc, review
```

43
kits/.all-contributorsrc Normal file
View File

@@ -0,0 +1,43 @@
{
"projectName": "MLSysBook - Hardware Kits",
"projectOwner": "harvard-edge",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"README.md"
],
"imageSize": 80,
"commit": false,
"commitConvention": "angular",
"contributorsPerLine": 7,
"linkToUsage": false,
"skipCi": true,
"contributors": [
{
"login": "Mjrovai",
"name": "Marcelo Rovai",
"avatar_url": "https://avatars.githubusercontent.com/Mjrovai",
"profile": "https://github.com/Mjrovai",
"contributions": [
"doc",
"code",
"design",
"tutorial"
]
},
{
"login": "profvjreddi",
"name": "Vijay Janapa Reddi",
"avatar_url": "https://avatars.githubusercontent.com/profvjreddi",
"profile": "https://github.com/profvjreddi",
"contributions": [
"bug",
"code",
"design",
"doc",
"test",
"tool"
]
}
]
}

View File

@@ -132,10 +132,31 @@ We welcome contributions to the hardware labs! To contribute:
---
## Authors
## Contributors
- **Marcelo Rovai** - Primary author
- **Vijay Janapa Reddi** - Harvard University
Thanks to these wonderful people who helped improve the hardware kits ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?v=4?s=80" width="80px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br />📖 💻 🎨 ✅</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 🧪 🔧</td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
**Recognize a contributor:** Comment on any issue or PR:
```
@all-contributors please add @username for tool, test, video, or doc
```
---

28
labs/.all-contributorsrc Normal file
View File

@@ -0,0 +1,28 @@
{
"projectName": "MLSysBook - Labs",
"projectOwner": "harvard-edge",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"README.md"
],
"imageSize": 80,
"commit": false,
"commitConvention": "angular",
"contributorsPerLine": 7,
"linkToUsage": false,
"skipCi": true,
"contributors": [
{
"login": "profvjreddi",
"name": "Vijay Janapa Reddi",
"avatar_url": "https://avatars.githubusercontent.com/profvjreddi",
"profile": "https://github.com/profvjreddi",
"contributions": [
"code",
"design",
"doc"
]
}
]
}

View File

@@ -67,6 +67,33 @@ Labs are under active development. To be notified when they launch:
---
## Contributors
Thanks to these wonderful people who helped build the labs ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />💻 🎨 📖</td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
**Recognize a contributor:** Comment on any issue or PR:
```
@all-contributors please add @username for code, tutorial, test, or doc
```
---
<div align="center">
**Read. Explore. Build.** *(Labs coming soon)*

View File

@@ -0,0 +1,97 @@
{
"projectName": "MLSysBook - TinyTorch",
"projectOwner": "harvard-edge",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"README.md"
],
"imageSize": 80,
"commit": false,
"commitConvention": "angular",
"contributorsPerLine": 7,
"linkToUsage": false,
"skipCi": true,
"contributors": [
{
"login": "AmirAlasady",
"name": "Amir Alasady",
"avatar_url": "https://avatars.githubusercontent.com/AmirAlasady",
"profile": "https://github.com/AmirAlasady",
"contributions": [
"bug"
]
},
{
"login": "profvjreddi",
"name": "Vijay Janapa Reddi",
"avatar_url": "https://avatars.githubusercontent.com/profvjreddi",
"profile": "https://github.com/profvjreddi",
"contributions": [
"bug",
"code",
"design",
"doc",
"ideas",
"review",
"test",
"tool"
]
},
{
"login": "kai4avaya",
"name": "kai",
"avatar_url": "https://avatars.githubusercontent.com/kai4avaya",
"profile": "https://github.com/kai4avaya",
"contributions": [
"bug",
"code",
"design",
"doc",
"test"
]
},
{
"login": "minhdang26403",
"name": "Dang Truong",
"avatar_url": "https://avatars.githubusercontent.com/minhdang26403",
"profile": "https://github.com/minhdang26403",
"contributions": [
"bug",
"code",
"doc",
"test"
]
},
{
"login": "didier-durand",
"name": "Didier Durand",
"avatar_url": "https://avatars.githubusercontent.com/didier-durand",
"profile": "https://github.com/didier-durand",
"contributions": [
"bug",
"code",
"doc"
]
},
{
"login": "karthikdani",
"name": "Karthik Dani",
"avatar_url": "https://avatars.githubusercontent.com/karthikdani",
"profile": "https://github.com/karthikdani",
"contributions": [
"bug",
"code"
]
},
{
"login": "jettythek",
"name": "jettythek",
"avatar_url": "https://avatars.githubusercontent.com/jettythek",
"profile": "https://github.com/jettythek",
"contributions": [
"code"
]
}
]
}

View File

@@ -268,6 +268,38 @@ Your commits will be included in the next release with appropriate version bump.
---
## 🏆 Contributor Recognition
We use [All Contributors](https://allcontributors.org) to recognize everyone who helps improve TinyTorch.
### How to Recognize a Contributor
After merging a PR or resolving an issue, comment:
```
@all-contributors please add @username for TYPE
```
### Contribution Types
| Type | Emoji | Use For |
|------|-------|---------|
| `bug` | 🐛 | Found a bug or issue |
| `code` | 💻 | Submitted code |
| `doc` | 📖 | Improved documentation |
| `ideas` | 💡 | Suggested improvements |
| `test` | 🧪 | Added tests |
| `review` | 👀 | Reviewed PRs |
### Examples
```
@all-contributors please add @AmirAlasady for bug
@all-contributors please add @student123 for code, doc
```
---
**Remember**: TinyTorch is about teaching students to understand ML systems by building them. Every contribution should enhance that educational mission! 🎓🔥
**Questions?** Check the docs or open a GitHub Discussion.

View File

@@ -255,12 +255,43 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
---
## Contributors
Thanks to these wonderful people who helped improve TinyTorch ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AmirAlasady"><img src="https://avatars.githubusercontent.com/AmirAlasady?v=4?s=80" width="80px;" alt="Amir Alasady"/><br /><sub><b>Amir Alasady</b></sub></a><br />🐛</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 💡 👀 🧪 🔧</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?v=4?s=80" width="80px;" alt="kai"/><br /><sub><b>kai</b></sub></a><br />🐛 💻 🎨 📖 🧪</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/minhdang26403"><img src="https://avatars.githubusercontent.com/minhdang26403?v=4?s=80" width="80px;" alt="Dang Truong"/><br /><sub><b>Dang Truong</b></sub></a><br />🐛 💻 📖 🧪</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?v=4?s=80" width="80px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br />🐛 💻 📖</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karthikdani"><img src="https://avatars.githubusercontent.com/karthikdani?v=4?s=80" width="80px;" alt="Karthik Dani"/><br /><sub><b>Karthik Dani</b></sub></a><br />🐛 💻</td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jettythek"><img src="https://avatars.githubusercontent.com/jettythek?v=4?s=80" width="80px;" alt="jettythek"/><br /><sub><b>jettythek</b></sub></a><br />💻</td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
**Recognize a contributor:** Comment on any issue or PR:
```
@all-contributors please add @username for bug, code, doc, or ideas
```
---
## Acknowledgments
Created by [Prof. Vijay Janapa Reddi](https://vijay.seas.harvard.edu) at Harvard University.
Special thanks to students and contributors who helped build this framework.
---
## License