Repository navigation
Releases: vn7n24fzkq/github-profile-summary-cards
Release list
v0.12.1
What's Changed
- fix: revert "chore: bump d3-color and d3" — d3 v7 is ESM-only and crashes the CJS runtime by @vn7n24fzkq in #323
- fix: make language aliases case-insensitive by @teddyli18000 in #330
- fix: productive-time rate-limit resilience + KV failure diagnostics by @vn7n24fzkq in #340
New Contributors
- @teddyli18000 made their first contribution in #330
Full Changelog: v0.12.0...v0.12.1
v0.12.0
What's Changed
- perf(cache): compact cly payloads 60% + quiet-deploy workflow by @vn7n24fzkq in #304
- docs: Redis key-prefix glossary by @vn7n24fzkq in #305
- feat(api): spread card traffic across the token pool; redact backing account by @vn7n24fzkq in #309
- perf(api): serve owner-type and repos-per-language from the REST quota pool by @vn7n24fzkq in #310
- fix: narrow contribution windows on gateway timeouts, not only resource-limit errors by @M1XZG in #306
- chore: bump axios from 1.17.0 to 1.18.1 by @dependabot[bot] in #307
- fix: fetch star totals via stargazerCount, not the stargazers connection by @vn7n24fzkq in #313
- chore: bump fast-uri from 3.1.3 to 3.1.4 by @dependabot[bot] in #312
- perf(cache): double the default fresh window to 24h by @vn7n24fzkq in #316
- feat(api): GitHub App installation tokens join the token pool by @vn7n24fzkq in #315
- perf(api): sum star totals via REST; shrink profile GraphQL documents by @vn7n24fzkq in #317
- chore: bump d3-color and d3 by @dependabot[bot] in #318
- chore: bump version to 0.12.0 by @vn7n24fzkq in #319
New Contributors
Full Changelog: v0.11.6...v0.12.0
v0.11.6
🩹 Hotfix: the real root fix for profile timeouts
v0.11.5's per-attempt deadline wasn't enough: token rotation re-runs the whole render (20s + 20s), and a stats render could stack the profile budget on top of the contribution-history budget — both clearing Vercel's 30s kill, which caches nothing and loops.
Every wall-clock budget (profile fetch, contribution history, commit languages) now measures from a single request-scoped clock opened outside the rotation loop. A retry that finds the budget spent fails fast — stale rescue or a cheap 5-min-cached error card instead of a FUNCTION_INVOCATION_TIMEOUT. Under full token exhaustion, heavyweight cold renders now answer in under a second with an honest "rate limited" card.
What's Changed
- fix: request-scoped clock for every wall-clock budget (504 root fix) by @vn7n24fzkq in #303
Full Changelog: v0.11.5...v0.11.6
v0.11.5
🩹 Hotfix: heavyweight profiles no longer time out
- One shared 20s deadline for the whole profile fetch — GitHub's slow query rejections, the split fallback chain and star pagination no longer stack their own clocks past Vercel's 30s kill (which cached nothing and looped forever) (#301)
- Estimator-rejected accounts are flagged for 30 days and skip straight to the split queries (saves a ~6s slow-reject per fetch)
- Star pagination runs concurrently with the other split queries
- When every token is rate limited, cards now show the honest "rate limited, try again in a few minutes" instead of a generic unavailable (#302)
What's Changed
- fix: shared profile-fetch deadline — stop FUNCTION_INVOCATION_TIMEOUT loops by @vn7n24fzkq in #301
- fix: classify all-tokens-exhausted as rate_limited by @vn7n24fzkq in #302
Full Changelog: v0.11.4...v0.11.5
v0.11.4
🚦 Burst control, cache compaction & error observability
- Per-instance GitHub concurrency gate (cap 8) — a cold heavyweight profile loading five cards at once no longer bursts dozens of parallel GraphQL calls into GitHub's secondary rate limits; excess calls queue briefly instead (#298). The demo page additionally staggers its five card loads.
- 16x smaller profile cache — the cached profile payload dropped from ~21KB to ~1.4KB (calendar stored as a compact counts run), raising the free-tier storage headroom by an order of magnitude (#299).
- Structured error records now ship to an external log store on every card error, giving 30-day searchable history of which usernames failed, when and why (#300).
What's Changed
- feat: per-instance GitHub concurrency gate + demo-page card staggering by @vn7n24fzkq in #298
- perf(cache): compact the profile payload 16x (21.6KB → 1.4KB) by @vn7n24fzkq in #299
- feat: Sentry capture for unexpected card errors (no-op without DSN) by @vn7n24fzkq in #300
Full Changelog: v0.11.3...v0.11.4
v0.11.3
🛡️ Resource-limit hardening
GitHub's GraphQL cost estimator rejects heavy query documents for very active accounts ("Resource limits for this query exceeded"). v0.11.0's full-history sums made several cards newly sensitive to this. This release makes every card resilient:
- Top Languages by Commit: a year rejected outright now re-fetches as two half-year windows and merges — same totals, and capped years actually cover more repos (#294)
- Profile details / Stats: the combined profile query now has a tiered split fallback (core+repos / calendar+years / counts), with day-aligned half-window calendars for the most extreme accounts (#295)
- Productive time: the repo-list window is now pinned to the sampling range — simultaneously a correctness fix and a large cost reduction (#296)
- Cache: past-year windows are jittered (90d ± 15d per key) so the backfill cohort never expires as one synchronized storm (#293); CDN s-maxage raised to 48h and the Redis fresh default to 12h (#297)
A very small number of extremely active accounts remain limited on GitHub's side (even minimal queries are rejected); their cards recover automatically as GitHub does.
What's Changed
- fix: half-year window fallback for resource-limited commit-language years by @vn7n24fzkq in #294
- fix: pin productive-time's collection window to the sampling range by @vn7n24fzkq in #296
- perf: raise CDN s-maxage to 48h and Redis fresh default to 12h by @vn7n24fzkq in #297
- fix: tiered split fallback for resource-limited UserDetails queries by @vn7n24fzkq in #295
- feat(cache): jitter past-year fresh windows to prevent expiry stampedes by @vn7n24fzkq in #293
Full Changelog: v0.11.2...v0.11.3
v0.11.2
What's Changed
- fix: rotate tokens on typeless 'rate limit already exceeded' errors by @vn7n24fzkq in #292
Full Changelog: v0.11.1...v0.11.2
v0.11.1
🩹 Hotfix
GitHub's cost estimator rejects our combined per-year contributions query with "Resource limits for this query exceeded" for mega-contribution user-years (e.g. a year with 10k+ commits). With v0.11.0 summing every year, one rejected year error-carded the whole stats / profile-details card for those accounts.
The per-year fetcher now retries such rejections as two cheaper single-field queries and merges the result — same numbers, and only the affected years pay the extra request. Details in #291.
Note: a small number of accounts currently fail even minimal contribution queries on GitHub's side (unrelated to this project's query shape, predates v0.11.0); their cards recover automatically once GitHub does.
What's Changed
- fix: split per-year query on GitHub resource-limit rejections by @vn7n24fzkq in #291
Full Changelog: v0.11.0...v0.11.1
v0.11.0
⭐ Your numbers are about to grow — here's why
Starting with this release, the web (Vercel) cards compute statistics across your entire GitHub history, not just the trailing year:
| Card | Before | Now |
|---|---|---|
Stats — Total Commits |
commits in the last 365 days (labelled with the year) | every commit since your account was created |
Profile details — Contributions |
contributions in the latest year | all-time contributions |
| Top Languages by Commit | distribution over the last 365 days | distribution over your whole history |
What you'll notice: totals get (much) bigger, and the language donut may reshuffle to reflect what you've actually written the most over the years. This is expected — it's the same data the GitHub Action version has always used, now with per-year immutable caching so it stays fast on the web too. Side-by-side before/after examples are in #289.
The profile-details line chart intentionally stays on the trailing year — it's a "recent activity" visual.
If you preferred the year-scoped numbers, tell us in the issues — we're open to adding an opt-in period parameter.
📱 Landing page
The controls panel on the demo page no longer covers the screen on phones — it collapses into a compact "⚙️ Customize" bar (#290).
🔧 Under the hood
- Per-year immutable Redis caching (past years cached ~90 days, current year refreshes) with batched
MGETreads - Data semantics never depend on cache health: if Redis is down, the same full-history totals are computed straight from GitHub
- Commit-language and contribution queries are chunked with a time budget; a render that can't finish returns an error card rather than a mislabelled partial total
- Productive-time card now uses
authoredDate(your local commit time) instead ofcommittedDate
What's Changed
- fix(landing): collapsible controls panel on mobile by @vn7n24fzkq in #290
- feat!: full-history stats with cache-independent semantics by @vn7n24fzkq in #289
Full Changelog: v0.10.2...v0.11.0
v0.10.2
What's Changed
- fix: avoid GitHub 502 on mega accounts, add pagination time budget by @vn7n24fzkq in #287
- fix: drop star ordering from organization-details, add time budget by @vn7n24fzkq in #288
Full Changelog: v0.10.1...v0.10.2