#!/usr/bin/env python3 """ Generate a minimalist, advanced-tech GitHub profile README.
Usage: python generate_readme.py # writes README.md python generate_readme.py --live # also pulls live GitHub stats
No third-party packages required (standard library only). """
from future import annotations
import argparse import json import urllib.request from dataclasses import dataclass, field
@dataclass class Config: name: str = "Your Name" username: str = "your-username" # GitHub handle tagline: str = "Clinical Informatics · Healthcare ML · Data Engineering" subtitle: str = "Turning clinical data into systems that move patients through care faster."
about: str = (
"I build data tools at the point of care — patient-recall dashboards, "
"prior-authorization and scheduling automation over the drchrono EHR API, "
"and ML models on real clinical datasets. MS in Clinical Informatics; "
"background spanning applied ML, multi-omics, and computer vision."
)
highlights: list[str] = field(default_factory=lambda: [
"Currently: clinical informatics @ Downtown Pain Physicians",
"Focus: EHR data pipelines · predictive modeling · workflow automation",
"Ask me about: FHIR/EHR integration, clinical ML, healthcare data ops",
])
# label -> URL
socials: dict[str, str] = field(default_factory=lambda: {
"Portfolio": "https://your-site.com",
"LinkedIn": "https://linkedin.com/in/your-handle",
"Email": "mailto:you@email.com",
})
# (label, shields.io logo slug)
tech: list[tuple[str, str]] = field(default_factory=lambda: [
("Python", "python"),
("SQL", "postgresql"),
("PyTorch", "pytorch"),
("scikit-learn", "scikit-learn"),
("XGBoost", "xgboost"),
("Pandas", "pandas"),
("Streamlit", "streamlit"),
("FHIR", "hl7"),
("Docker", "docker"),
("Git", "git"),
])
# (name, url, one-line description)
projects: list[tuple[str, str, str]] = field(default_factory=lambda: [
("trauma_mortality_prediction",
"https://github.com/your-username/trauma_mortality_prediction",
"XGBoost model with a Streamlit interface for trauma mortality risk."),
("Deep-cc",
"https://github.com/your-username/Deep-cc",
"Multi-omics GAN / VAE / GCN pipeline for pancreatic cancer subtype classification."),
])
badge_color: str = "000000" # hex without '#'. Try "" (empty) for brand colors.
show_stats: bool = True # append github-readme-stats cards
def social_badges(cfg: Config) -> str:
logos = {"portfolio": ("github", "000000"),
"linkedin": ("linkedin", "0A66C2"),
"email": ("gmail", "EA4335")}
parts = []
for label, url in cfg.socials.items():
logo, color = logos.get(label.lower(), ("link", "555555"))
badge = (f"https://img.shields.io/badge/{label}-{color}"
f"?style=flat-square&logo={logo}&logoColor=white")
parts.append(f"")
return "\n".join(parts)
def tech_badges(cfg: Config) -> str:
parts = []
for label, slug in cfg.tech:
safe = label.replace("-", "--").replace(" ", "%20")
color = cfg.badge_color if cfg.badge_color else "555555"
badge = (f"https://img.shields.io/badge/{safe}-{color}"
f"?style=flat-square&logo={slug}&logoColor=white")
parts.append(f"")
return "\n".join(parts)
def project_lines(cfg: Config) -> str: return "\n\n".join( f"{name} — {desc}" for name, url, desc in cfg.projects )
def stats_block(cfg: Config) -> str: if not cfg.show_stats: return "" u = cfg.username return ( '
' )def fetch_live(cfg: Config) -> str: """Optional: pull public profile numbers from the GitHub API.""" try: req = urllib.request.Request( f"https://api.github.com/users/{cfg.username}", headers={"User-Agent": "readme-generator"}, ) with urllib.request.urlopen(req, timeout=10) as r: data = json.load(r) return (f"{data.get('public_repos', 0)} repos · " f"{data.get('followers', 0)} followers") except Exception as e: # noqa: BLE001 print(f" (live fetch skipped: {e})") return ""
def build_readme(cfg: Config, live: bool = False) -> str: live_line = f"\n\n{fetch_live(cfg)}" if live else "" return f"""
{cfg.about}
{chr(10).join('- ' + h for h in cfg.highlights)}
{tech_badges(cfg)}
{project_lines(cfg)}
{stats_block(cfg)} """
def main() -> None: parser = argparse.ArgumentParser(description="Generate a GitHub profile README.") parser.add_argument("--live", action="store_true", help="pull live public stats from the GitHub API") parser.add_argument("-o", "--out", default="README.md", help="output path") args = parser.parse_args()
cfg = Config()
readme = build_readme(cfg, live=args.live)
with open(args.out, "w", encoding="utf-8") as f:
f.write(readme)
print(f"Wrote {args.out} ({len(readme)} chars)")
if name == "main": main()