Build1 distinct publisher3 min readUpdated
GitHub keeps repo traffic for 14 days, offers no export, and gates the endpoints behind Administration: read. Longitudinal reach means running your own archiver and asking users for a frightening scope.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The permission cannot be engineered away, and the author of a dev.to writeup on building a traffic archiver says the search for a way around it came up empty. A GitHub App that reads `GET /repos/{owner}/{repo}/traffic/views` needs Administration: read, and that is the only scope GitHub publishes for traffic data [3]. What is left to a developer is subtraction: request no Contents, no Issues, no Actions, no Secrets, and then write a page explaining why the remaining scope looks the way it does [4] [5]. The author expected that install screen to be the single biggest reason a prospective user backs out [5]. Anyone shipping in this space inherits the same problem, and it is answered with copy rather than code.
Retention of 14 days is also an availability requirement, which is the part that gets discovered late. Polling every six hours means four passes a day across four endpoints, so 16 requests per repository per day and 5,840 in a year [6] [1] [3]. The figure that matters is on the other side of the ledger: 14 days of window against a six-hour cadence buys 56 consecutive missed cycles before a date leaves GitHub for good [2]. An outage inside that budget is recoverable. One past it leaves a hole in the series that no support ticket repairs [2].
Each endpoint then bends the storage layer in a different direction. Today's row keeps growing while you watch it, so writes are upserts keyed on (repository_id, metric_date), and both scheduler and store have to speak UTC, because GitHub's day boundaries do [9] [10]. Referrers arrive as a top-10 snapshot of a rolling 14-day window with no dates attached, so yesterday's entries have to be deleted rather than merged, in one transaction, or a fallen referrer sits in today's snapshot carrying last night's count [11] [12]. Release download counts only ever climb, so per-release velocity is a diff of consecutive daily readings you took yourself [13].
The uniques trap has no engineering answer at all. Uniques are deduplicated within a day, and GitHub never hands over the identity that would let you deduplicate across days, so there is no correct monthly figure, only a sum of daily numbers that counts returning visitors more than once [7]. The author shipped that error and had to fix it in five places [14]. The column now reads "Daily uniques, 30-day sum", and every export carries a limitations field, on the reasoning that a CSV opened next year has no tooltip to hover over [8]. That 30-day label is itself a tell: 16 of those days exist only because someone was writing them down, since GitHub keeps 14 [2] [4].
Which makes the archive the asset, and it starts accruing on the day the poller is switched on. A team that decides in March it wants a year of repo reach cannot buy it, request it, or reconstruct it [2].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
GitHub's traffic data older than 14 days is discarded: there is no API parameter that reaches further back, no export button, and no support ticket that recovers it.
The archiver polls four traffic endpoints every six hours per repository and writes the results into Postgres.
GitHub's Insights > Traffic page for a repository shows views, clones, unique visitors, top referrers and popular paths.
For a GitHub App, GET /repos/{owner}/{repo}/traffic/views requires Administration: read, and that is the only scope GitHub offers for traffic data; there is no 'Insights: read' or narrower alternative.
The author's app requests only read-only Administration and read-only Metadata, and no Contents, Issues, Actions or Secrets permissions.
The author added a page to the site explaining exactly why the Administration permission is required, expecting that install screen to be the number one reason someone bounces.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Single first-hand build log, checkable but uncorroborated
All claims come from one practitioner post with no linked GitHub documentation, response payloads, or second source. The technical assertions are specific and independently checkable against public API behaviour (endpoint paths, per=day fields, scope name, cumulative download_count), and the derived figures are simple arithmetic on stated parameters, which lifts evidence above anecdote. But nothing in the cluster verifies the retention window, the absence of a narrower scope, or the author's implementation as described.
One self-disclosed deployment, no usage data
Adoption evidence stops at the author: a production archiver on Postgres and a hosted GitHub App that is free with no billing wired up. There are no install counts, active-user figures, third-party deployments, stars, or independent references anywhere in the supplied material, so the pattern cannot be shown to extend past its author.
Mostly conservative, mild product overlay
The headline framing (14-day memory, Administration-only scope) matches what the source actually documents, and the author repeatedly undersells rather than oversells: an admitted shipped bug, an 'ugly label', an acknowledgement that backfill is impossible and that the product's value 'only shows up later'. The small positive gap reflects a closing promotion of the author's own hosted app with zero adoption evidence, plus generalised assertions about other dashboards silently summing uniques that the source does not substantiate.
Author markets the product the post justifies
The post concludes by directing readers to RepoMeter, the author's own hosted GitHub App, and the body doubles as a rationale for both the product's existence (perishable data, no export) and the uncomfortable permission it must request. Mitigations are visible and stated: the tooling is free with no billing, read-only, exports to CSV and JSON explicitly so the archive is not hostage to the service, and the author tells readers they can just call the endpoints themselves. Self-published on dev.to with no editorial separation.
Moderate: specific and internally consistent, single-sourced
Confidence is limited by having one self-published source with a promotional interest and no independent corroboration. It is raised by the unusual specificity and internal consistency of the technical detail, by claims that are cheap to verify against the public API, and by derived figures that follow arithmetically from stated parameters. Adoption and scale claims warrant markedly less confidence than the API-semantics claims.
build
AI-written code fails the same four ways, and every gate you own reports green1 distinct publisher
build
Your "Index Only Scan" Did 2,847 Heap Fetches: Covering Indexes Are a Vacuum Problem1 distinct publisher
build
The optional EntityManager is the bug: moving the transaction boundary into AsyncLocalStorage1 distinct publisher
build
Three attackers hide behind one connect button, and encryption only stops one of them1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 21, 2026