GitHub stats
beyond 14 days.

Self-hosted traffic dashboard for your repos — see stars, forks, views, and clones over 30, 60, 90 days. One binary. SQLite. No SaaS.

What we ship = what you see

$ curl -fsSL https://get.gghstats.com/install.sh | sh
$ export GGHSTATS_GITHUB_TOKEN=ghp_xxx
$ gghstats run --open
curl -fsSL https://get.gghstats.com/install.sh | sh

// Overview

Infographic: gghstats permanent GitHub traffic analytics versus GitHub’s 14-day limit — self-hosted SQLite, head-to-head scoring, and Docker, Helm, and Homebrew deployment.

Download high-resolution infographic — feel free to share

Recent releases

v1.6.62026-10-07

Security
  • Keep golang.org/x/net v0.57.0 pin after Dependabot modernc.org/sqlite 1.60.1 bump
  • Dependency updates: modernc.org/sqlite 1.59.0 → 1.60.1

v1.6.52026-09-30

UX
  • Stars over time chart uses calendar time scale; pads to Stars KPI when history lags (#91)
  • Star sync heals with full rebuild when SQLite series is behind cursor/KPI

v1.6.42026-09-29

UX
  • upstream_stale banner shows stuck/eligible counts so partial thaw is not mistaken for a false alarm (#87)
  • SPEC §4.8 documents fleet active thresholds (≥3 stuck and ≥50% of eligible)

v1.6.32026-09-28

Ops
  • Fleet upstream_stale: detect stuck GitHub traffic after successful sync; optional banner; ops alert once/episode (#80)
  • Dogfood: --demo-upstream-stale / --upstream-stale-force

v1.6.22026-09-27

UX
  • Search empty-state: index and Featured no longer show fetch/featured-add hints on filter miss (#73/#75)
  • modernc.org/sqlite 1.59.0; plan-v1.6.x docs band

v1.6.12026-09-12

UI
  • Featured chips readable in Midnight/Dark (#60); dark table header contrast (#62)
  • docs/themes.md palette swatches (#61)

v1.6.02026-09-09

UI
  • Responsive dashboard: collapsible rail, light/dark/midnight, language autonyms (#46)
  • Gated Settings (token modal → HttpOnly session) usable behind Traefik / 0.0.0.0
  • Bulgarian + Russian locales; optional soft theme via GGHSTATS_CUSTOM_CSS; mobile sidebar close (#56)

v1.5.12026-08-30

Featured
  • Featured showcase is not a report surface (#47): catalog rows show without a collected `repos` row
  • Nav, `/featured`, Featured API, and sitemap `/featured` use the catalog again
  • Fail-closed empty dashboard until the next sync after 1.5.0 is unchanged

v1.5.02026-08-30

Privacy
  • Report visibility: `repo report ls/set` + `GGHSTATS_REPORT_PRIVATE`, fail-closed by default
  • Traffic freshness/coverage per metric (fresh / delayed / missing / failed / never)
  • Chart-aligned JSON download, gap-vs-zero legend, and report inventory JSON

v1.4.02026-08-29

UI
  • Locale-aware chart ticks/tooltips and clone-statistics numbers (#22)
  • JSONL export UTC filename; Rank header; native stats help tooltips (#23–#25)
  • Unique cloners/viewers primary UX; Featured API + sitemap when showcase is non-empty

Engineering report v1.6.6 · Full changelog on GitHub

// 01 · Self-hosted

Go binary + SQLite. Runs on your bastion, your laptop, a Raspberry Pi. No accounts, no rate limits, no third-party dashboards.

// 02 · Past 14 days

GitHub's web UI caps at 14 days. gghstats snapshots traffic and renders 30+ day trends per repo and aggregated.

// 03 · One GitHub token

Set GGHSTATS_GITHUB_TOKEN (fine-grained PAT). While the dashboard runs, gghstats syncs traffic from the GitHub API in the background.

// Quick start

Optional: generate config from the CLI instead of hand-editing env vars.

$ gghstats --print-sample-config > ./gghstats.env  # adjust
$ export GGHSTATS_GITHUB_TOKEN=ghp_xxx
$ gghstats run --open

`run` is an alias for `serve`; `--open` opens the browser when the dashboard is ready. Background sync starts automatically.

Production (VPS, TLS, Compose, Traefik, Helm):gghstats-selfhosted

// Repositories