agent-sdk-pulse
Live health and velocity dashboard for AI agent frameworks — the
"is this framework alive, growing, or dying?" question, answered every
30 minutes from real public data.
What it shows
- Pulse score (0–100) per framework, blending six real signals.
- Movers this week — top 5 climbers and top 5 fallers in weekly
- download volume.
- Sortable table with stars, 4-week commit count, weekly downloads,
- and a 12-week sparkline per framework.
- Detail modal with full 90-day Chart.js history per metric.
- Source transparency — every metric is tagged with its upstream
- URL and last fetch time. The footer surfaces both.
21 frameworks shipped at launch: LangChain (py + js), LangGraph
(py + js), LlamaIndex (py + ts), CrewAI, AutoGen, PyAutoGen, OpenAI
Agents SDK (py + js), Pydantic AI, Mastra, Agno, Letta, smolagents,
Swarm, DSPy, Atomic Agents, mcp-agent, Google ADK.
Data sources (real, public, no mock)
Every cell on the dashboard comes from a live HTTP fetch — no seeds,
no fake data, no Math.random jitter.
| Source | Endpoint | What we read | Refresh |
|---|---|---|---|
| GitHub REST | https://api.github.com/repos/:owner/:repo | stars, forks, open_issues, pushed_at, archived, license | every 30 min (waved) |
| GitHub REST | https://api.github.com/repos/:owner/:repo/stats/participation | last 4 weeks of commits | every 30 min (waved) |
| GitHub REST | https://api.github.com/repos/:owner/:repo/releases?per_page=100 | latest tag, releases-in-last-90-days | every 30 min (waved) |
| npm registry | https://api.npmjs.org/downloads/range/last-week/{pkg} | weekly downloads | every 30 min (waved) |
| pypistats.org | https://pypistats.org/api/packages/{pkg}/recent | last_day, last_week, last_month downloads | every 30 min (waved) |
Anonymous GitHub API gives 60 req/hr per IP. We refresh in waves of 5
frameworks per 30-minute tick, so a full sweep takes ~4 ticks (≤2h),
keeping data ≤2h fresh while staying well below rate limits. If you
set GITHUB_TOKEN in your environment we use 5,000 req/hr instead.
Pulse score (0–100)
| Component | Weight | Source |
|---|---|---|
| Commit velocity (4-week sum, log-scaled) | 30% | GitHub /stats/participation |
| Recency of last push (exp decay, half-life ~30d) | 15% | GitHub repo pushed_at |
| Weekly download volume (max(npm, pypi), log-scaled) | 20% | npm + pypistats |
| Week-over-week download delta (log-mapped around 1.0×) | 15% | npm + pypistats |
| Release cadence (count in last 90d, capped at 6) | 10% | GitHub /releases |
| Issue health (open_issues / forks ratio, inverted) | 10% | GitHub repo |
Hard rules:
- archived: true on GitHub → score forced to 0 ("dormant").
- pushed_at older than 180 days → score capped at 25 ("stale").
The full formula lives in score.js.
No authentication
Every endpoint on this service is public. There is no login page,
no ADMIN_PASS, no Basic Auth, no API key required. This is
deliberate so anyone (including an automated showcase preview) can
inspect the dashboard instantly.
Endpoints
GET /agent-sdk-pulse/→ SPAGET /agent-sdk-pulse/health→ liveness JSONGET /agent-sdk-pulse/api/frameworks→ all frameworks + latest snapshot + 12-wk pulse sparklineGET /agent-sdk-pulse/api/frameworks/:slug→ single framework detailGET /agent-sdk-pulse/api/frameworks/:slug/history?days=N→ up to 365d of snapshotsGET /agent-sdk-pulse/api/movers?window=N→ top climbers and fallers (download Δ)GET /agent-sdk-pulse/api/sources→ upstream health + last fetchesGET /agent-sdk-pulse/api/refresh-status→ cron schedule + last sweep ts
Run locally
git clone <this repo>
cd agent-sdk-pulse
cp .env.example .env
npm install
npm start
# → http://localhost:4733/agent-sdk-pulse/
Defaults: SQLite db at ./data/pulse.db, port 4733, base path/agent-sdk-pulse. Override any of these via .env.
Stack
Node.js 20+ · Express · better-sqlite3 (WAL) · node-cron · helmet ·
compression · vanilla JS SPA · Chart.js from CDN.
Adding a framework
Edit data/seed.json, append an entry, restart the
server. The framework will be picked up by the next wave.
License
MIT.