Readership statistics¶
This page shows aggregated, anonymous readership for the HTML edition of the book. The numbers come from the server access logs — so they include readers who block JavaScript trackers — and are bucketed into daily unique-IP counts per page. The IPs are discarded after aggregation; only the daily counts survive. The same dataset feeds the small sparkline you see in the sidebar of every page.
See Privacy for what is and isn’t collected.
Note
The in-book figures show the most recent 60 days while the pipeline is still bedding in. Two server-side fixes only took effect recently, so wider windows are not yet representative:
Real client IPs since 2026-05-24 (Apache
mod_remoteip+ CloudflareCF-Connecting-IP). Earlier data deduplicated by Cloudflare edge IPs and undercounted by ~10–50×.Access logs retained 5 years since 2026-05-26 (logrotate
rotate 1825). Earlier rotations purged everything after 4 days, so almost nothing from Feb 2022 to May 2026 exists on disk.
Because of that second point, there is no year of history to show yet. The backend (sparklines.json) is configured for a rolling 365-day window, but a window can only hold what the logs hold: the archive starts in late May 2026 and gains one day per night, so it reaches a full year in May 2027. Until then the file contains fewer days than the setting allows, and the in-book display is filtered to a shorter window so a young deployment doesn’t look unread. Year-on-year comparisons are not possible until there are two years on disk.
All the figures count complete days only. The nightly aggregator runs in the small hours, so the current day is still being logged when it runs; publishing it would put a partial count at the right-hand edge of every chart. The most recent day shown is therefore yesterday.
Summary¶
Statistics could not load. Common reasons:
Do Not Track is enabled in your browser, a content blocker is
hiding /_stats/sparklines.json, or the nightly
aggregator hasn't produced data yet. The numbers will appear when
the data file is reachable.
Daily reads (last 60 days)¶
Total reads per day across the whole book. Each daily bucket de-duplicates by IP, so two visits from the same reader on the same day count once.
Most-read pages (last 60 days)¶
The 20 pages with the most reads over the 60-day window. Page names
are the Sphinx page identifiers (e.g. data-visualization/box-plots);
click through to read them.
Least-read pages (last 60 days)¶
The 10 pages with the fewest reads over the 60-day window, lowest first. Useful for spotting sections that may need clearer links, better discoverability, or a refresh.
Note
Pages with zero hits in the window do not appear in
sparklines.json and therefore never reach this table. So this
is “least-read pages that got at least one reader”, not “unread
pages”. To find truly unread pages, diff the Sphinx page list
against the JSON keys (see
docs/telemetry/operations.md).
Raw data¶
Every number on this page comes from a single public JSON file: learnche.org/_stats/sparklines.json. The wider GoAccess dashboard (learnche.org/_stats/) shows the same pageviews plus referrers, devices, and country breakdowns.
Download PDF of entire book