"""Diffusers views in the LeRobot Project Pulse visual style."""
from __future__ import annotations
from datetime import datetime, timedelta
from html import escape
from pathlib import Path
import gradio as gr
import pandas as pd
from dashboard.charts import (
area_chart,
contributor_growth_chart,
country_bubble_chart,
multiple_history_chart,
organization_adoption_chart,
pypi_chart,
star_history_chart,
task_mix_chart,
top_contributors_chart,
top_organizations_chart,
)
from dashboard.collect import load_snapshot
CSS = Path(__file__).with_name("reference_style.css").read_text(encoding="utf-8") + """
.metric-delta {font-size:.95rem; margin-top:2px; font-weight:650;}
.metric-delta.positive {color:#16a34a;} .metric-delta.negative {color:#dc2626;}
.metric-delta.neutral {color:#6b7280;}
.publisher-directory a {color:var(--viz-2); text-decoration:none;}
.publisher-directory table {width:100%; border-collapse:collapse;}
.publisher-directory td,.publisher-directory th {padding:10px;border-bottom:1px solid var(--border-color-primary);text-align:left;}
@media(max-width:760px){.hero-copy{display:block}.freshness-pill{margin-top:18px;width:fit-content}}
"""
def fmt(value: int | None) -> str:
return f"{value:,}" if value is not None else "Unavailable"
def data(snapshot: dict, name: str) -> dict:
return snapshot.get("sources", {}).get(name, {}).get("data") or {}
def header(snapshot: dict) -> str:
timestamp = snapshot.get("collected_at")
try:
label = datetime.fromisoformat(timestamp).strftime("Snapshot · %d %b %Y, %H:%M UTC") if timestamp else "No snapshot yet"
except ValueError:
label = f"Snapshot · {timestamp}"
return (
'OPEN-SOURCE IMAGE GENERATION ADOPTION
'
'Diffusers Project Pulse
'
'
Signals from the Hub, GitHub, PyPI and the community—collected into one shared view.
'
'
' + escape(label) + "
"
)
def metric_card(label: str, value: int | None, delta: str = "", detail: str = "", window: str = "past 3 months") -> str:
if delta in ("+0.0%", "-0.0%"):
delta = "no change"
trend_class = "positive" if delta.startswith("+") else "negative" if delta.startswith("-") else "neutral"
arrow = "▲" if trend_class == "positive" else "▼" if trend_class == "negative" else ""
trend = (f'
{arrow} {escape(delta)}
'
f'{escape(window)}
') if delta else (
'Trend begins with the next snapshot
')
return (f''
f'
{escape(label)}
{fmt(value)}
{trend}
')
def card_row(*cards: str) -> str:
return '' + "".join(cards) + "
"
def source_health(snapshot: dict) -> str:
if not snapshot:
return 'Source status is available after the first scheduled snapshot.
'
rows = []
for name, title in (("models", "Hugging Face Hub models"), ("github", "GitHub"),
("pypi", "PyPI Stats"), ("organizations", "Curated organizations")):
item = snapshot.get("sources", {}).get(name, {})
status = item.get("status", "unavailable")
label = "Available" if status == "ok" else "Previous snapshot" if status == "stale" else "Unavailable"
detail = item.get("updated_at") or item.get("error") or "No collection yet"
rows.append('' + escape(title) + ''
+ escape(str(detail)) + '
' + label + " ")
return '' + "".join(rows) + "
"
def history_change(history: list[dict], key: str, days: int = 90) -> tuple[str, str]:
points = [row for row in history if row.get(key) is not None and row.get("date")]
if len(points) < 2:
return "", ""
latest = points[-1]
latest_day = datetime.fromisoformat(latest["date"])
older = [row for row in points[:-1] if (latest_day - datetime.fromisoformat(row["date"])).days >= days]
past = older[-1] if older else points[0]
span = (latest_day - datetime.fromisoformat(past["date"])).days
if span <= 0:
return "", ""
previous = past[key]
if previous == 0:
return ("New", f"past {span} days") if latest[key] else ("", "")
label = "past 3 months" if 85 <= span <= 100 else f"past {span} days"
return f"{(latest[key] - previous) / previous * 100:+.1f}%", label
def pypi_change(history: list[dict], width: int, offset: int = 90) -> tuple[str, str]:
"""Compare equal-width daily download windows 90 days apart."""
if not history:
return "", ""
rows = {row["date"]: row["downloads"] for row in history}
end = datetime.fromisoformat(history[-1]["date"])
current_days = [(end - timedelta(days=index)).date().isoformat() for index in range(width)]
past_days = [(end - timedelta(days=offset + index)).date().isoformat() for index in range(width)]
if any(day not in rows for day in current_days + past_days):
return "", ""
current, past = (sum(rows[day] for day in days) for days in (current_days, past_days))
if past <= 0:
return ("New", "past 3 months") if current else ("", "")
return f"{(current - past) / past * 100:+.1f}%", "past 3 months"
def activity_change(activity: list[dict]) -> tuple[str, str]:
if len(activity) < 2:
return "", ""
current = activity[-1]["active_contributors"]
past = activity[-91]["active_contributors"] if len(activity) >= 91 else activity[0]["active_contributors"]
if past <= 0:
return ("New", "past 3 months") if current else ("", "")
return f"{(current - past) / past * 100:+.1f}%", "past 3 months"
def table(records: list[dict], columns: list[str]) -> pd.DataFrame:
return pd.DataFrame(records[:5]).reindex(columns=columns).fillna("")
def contributor_table(records: list[dict], metric: str) -> pd.DataFrame:
del metric # The supplied ranking determines row order; all reference columns remain visible.
return pd.DataFrame(records).reindex(columns=["author", "total_downloads", "total_likes", "model_count"]).rename(columns={
"author": "Author", "total_downloads": "Total Downloads", "total_likes": "Total Likes", "model_count": "Model Count"
}).fillna("")
def notice(text: str) -> str:
return '' + escape(text) + "
"
def build_app(snapshot: dict | None = None) -> gr.Blocks:
snapshot = snapshot if snapshot is not None else load_snapshot()
models, github, pypi, organizations = (data(snapshot, name) for name in ("models", "github", "pypi", "organizations"))
history = snapshot.get("history", [])
growth = models.get("growth_3m", {})
pypi_daily = pypi.get("daily_history", [])
star_series = github.get("star_history") or history
stars_delta, stars_window = history_change(star_series, "stars" if github.get("star_history") else "github_stars")
contributor_activity = github.get("contributor_activity", [])
if contributor_activity and "total_contributors" in contributor_activity[-1]:
contributors_delta, contributors_window = history_change(contributor_activity, "total_contributors")
else:
contributors_delta, contributors_window = history_change(history, "github_contributors")
active_delta, active_window = activity_change(contributor_activity)
issues_delta, issues_window = history_change(history, "open_issues")
prs_delta, prs_window = history_change(history, "open_prs")
pypi_30_delta, pypi_30_window = pypi_change(pypi_daily, 30)
pypi_7_delta, pypi_7_window = pypi_change(pypi_daily, 7)
pypi_day_delta, pypi_day_window = pypi_change(pypi_daily, 1)
cohort_window = "models published in the past 3 months"
theme = gr.themes.Default(
primary_hue=gr.themes.colors.orange, secondary_hue=gr.themes.colors.indigo,
neutral_hue=gr.themes.colors.slate,
font=[gr.themes.Font("Helvetica Neue"), gr.themes.Font("Helvetica"), gr.themes.Font("Arial")],
)
with gr.Blocks(css=CSS, theme=theme, title="Diffusers Project Pulse") as demo:
gr.HTML(header(snapshot))
if not snapshot:
gr.HTML(notice("No generated snapshot was found. Run python -m scripts.refresh_snapshot, then restart the app."))
with gr.Tabs():
with gr.Tab("Overview"):
gr.Markdown("## Ecosystem at a glance")
gr.HTML(card_row(
metric_card("Hub Models", models.get("count"), growth.get("models", ""), "Diffusers-tagged Hub repositories", cohort_window),
metric_card("Hub Downloads", models.get("downloads_30d_sum"), growth.get("downloads", ""), "30-day downloads attributed to models published in the past 3 months", cohort_window),
metric_card("Publishers", models.get("publisher_count"), growth.get("publishers", ""), "Distinct publishing accounts", cohort_window),
metric_card("PyPI · 30 days", pypi.get("last_month"), pypi_30_delta, "Mirror-excluded downloads compared with the same window three months ago", pypi_30_window),
))
with gr.Row(equal_height=True):
with gr.Column(scale=2):
gr.Plot(value=area_chart(models.get("growth", []), "models", "Published model growth · last 12 months"), show_label=False)
with gr.Column(scale=1):
gr.Plot(value=task_mix_chart(models.get("task_counts", {})), show_label=False)
if models.get("truncated"):
gr.HTML(notice("Hub collection reached its configured limit; model totals and rankings are partial."))
with gr.Accordion("Data source health", open=False):
gr.HTML(source_health(snapshot))
gr.HTML('')
with gr.Tab("Models"):
gr.HTML(card_row(
metric_card("Total Models", models.get("count"), growth.get("models", ""), "Diffusers-tagged model repositories", cohort_window),
metric_card("Unique Publishers", models.get("publisher_count"), growth.get("publishers", ""), "Distinct Hub publishing accounts", cohort_window),
metric_card("Total Downloads", models.get("downloads_30d_sum"), growth.get("downloads", ""), "Sum of last-30-day Hub model downloads", cohort_window),
metric_card("Total Likes", models.get("likes_sum"), growth.get("likes", ""), "Likes on matching models", cohort_window),
))
gr.Markdown("### 🏆 Top Models")
with gr.Row():
with gr.Column():
gr.Markdown("##### By Downloads 📥")
gr.Dataframe(value=table(models.get("top_downloads", []), ["id", "author", "downloads", "likes", "last_modified"]), interactive=False, wrap=True)
with gr.Column():
gr.Markdown("##### By Likes 👍")
gr.Dataframe(value=table(models.get("top_likes", []), ["id", "author", "likes", "downloads", "last_modified"]), interactive=False, wrap=True)
gr.Markdown("### 👥 Top Contributors")
contributors = models.get("contributors", {})
with gr.Row():
with gr.Column():
gr.Markdown("##### By Total Downloads 📥")
gr.Dataframe(value=contributor_table(contributors.get("downloads", []), "total_downloads"), interactive=False, wrap=True)
with gr.Column():
gr.Markdown("##### By Total Likes 👍")
gr.Dataframe(value=contributor_table(contributors.get("likes", []), "total_likes"), interactive=False, wrap=True)
gr.Markdown("##### By Model Count 📊")
gr.Dataframe(value=contributor_table(contributors.get("count", []), "model_count"), interactive=False, wrap=True)
gr.Markdown("### 📈 Growth Trends")
with gr.Row():
with gr.Column():
gr.Plot(value=area_chart(models.get("growth", []), "models", "Cumulative models"), show_label=False)
gr.Plot(value=area_chart(models.get("growth", []), "downloads", "Downloads from published models", "#9085e9"), show_label=False)
with gr.Column():
gr.Plot(value=area_chart(models.get("growth", []), "publishers", "Cumulative publishers", "#1baf7a"), show_label=False)
gr.Plot(value=area_chart(models.get("growth", []), "likes", "Likes on published models", "#c98500"), show_label=False)
gr.HTML('ℹ️ Publication charts group models by creation date; downloads and likes show current counters attributed to those models.
')
with gr.Tab("GitHub & Community"):
gr.Markdown("### 🚀 Project Momentum")
gr.HTML(card_row(
metric_card("GitHub Stars", github.get("stars"), stars_delta, "Compared with historical star counts", stars_window),
metric_card("PyPI Downloads", pypi.get("last_month"), pypi_30_delta, "Last 30 days compared with the same window three months earlier", pypi_30_window),
))
with gr.Row():
gr.Plot(value=star_history_chart(github.get("star_history", []), history), show_label=False)
gr.Plot(value=pypi_chart(pypi_daily), show_label=False)
if not github.get("star_history"):
gr.HTML(notice("Historical star counts are temporarily unavailable; the chart grows from saved snapshots."))
gr.Markdown("### 🤝 Community Health")
activity = contributor_activity
gr.HTML(card_row(
metric_card("Contributors", github.get("contributors"), contributors_delta,
"Distinct commit authors when full history is available; otherwise GitHub-linked contributor accounts", contributors_window),
metric_card("Active Contributors · 30d", activity[-1]["active_contributors"] if activity else None,
active_delta, "Distinct commit authors in the rolling 30-day window", active_window),
))
with gr.Row():
gr.Plot(value=contributor_growth_chart(activity, history), show_label=False)
gr.Plot(value=top_contributors_chart(github.get("top_contributors", [])), show_label=False)
gr.HTML(notice("Contributor growth counts distinct commit authors. The top-contributors ranking uses GitHub-linked accounts and may have a different total."))
gr.Markdown("### 🛠️ Development Activity")
gr.HTML(card_row(
metric_card("Open Issues", github.get("open_issues"), issues_delta, "Open GitHub issues", issues_window),
metric_card("Open PRs", github.get("open_prs"), prs_delta, "Open GitHub pull requests", prs_window),
))
gr.Plot(value=multiple_history_chart(history, [("open_issues", "Open Issues"), ("open_prs", "Open PRs")], "Open Issues & PRs"), show_label=False)
gr.Markdown("### 📦 Package Adoption")
gr.HTML(card_row(
metric_card("Last 30 Days", pypi.get("last_month"), pypi_30_delta, "Mirror-excluded PyPI downloads", pypi_30_window),
metric_card("Last 7 Days", pypi.get("last_week"), pypi_7_delta, "Mirror-excluded PyPI downloads", pypi_7_window),
metric_card("Yesterday", pypi.get("last_day"), pypi_day_delta, "Most recent PyPI daily observation", pypi_day_window),
))
with gr.Tab("Organizations"):
gr.Markdown("## 🏭 Who is building on Diffusers")
org_growth = organizations.get("growth_3m", {})
by_kind = organizations.get("by_kind", {})
gr.HTML(card_row(
metric_card("Active Organizations", organizations.get("active"), org_growth.get("active", ""),
"Curated organizations with Diffusers-tagged models", cohort_window),
metric_card("Companies", by_kind.get("company"), org_growth.get("company", ""),
"Commercial organizations in the curated list", cohort_window),
metric_card("Labs & Universities", by_kind.get("lab", 0) + by_kind.get("university", 0)
if organizations else None, org_growth.get("academic", ""),
"Research institutes and universities in the curated list", cohort_window),
metric_card("Organization Downloads", organizations.get("downloads"), org_growth.get("downloads", ""),
"Current Hub downloads on models published by curated organizations", cohort_window),
))
gr.Plot(value=organization_adoption_chart(organizations.get("adoption", [])), show_label=False)
with gr.Row():
gr.Plot(value=top_organizations_chart(organizations.get("organizations", [])), show_label=False)
gr.Plot(value=country_bubble_chart(organizations.get("countries", {})), show_label=False)
gr.Markdown("### Directory")
cards = "".join(
''
+ escape({"company": "Company", "lab": "Research lab", "university": "University"}[org["kind"]])
+ '' + escape(org["name"]) + ""
+ '
' + f'{org["model_count"]:,} models · {org["total_downloads"]:,} downloads'
+ '
' + escape(org["country"]) + "
"
for org in organizations.get("organizations", [])
)
gr.HTML('' + cards + "
" if cards else notice("No curated organization data is available yet."))
gr.HTML('Organizations are curated by hand; membership was last reviewed on '
+ escape(organizations.get("curated_at", "unknown"))
+ '. Counts refresh with the dashboard snapshot.
')
return demo