How the numbers in this blog are measured
Every number in this blog comes from one running gitpuls instance on one VPS, reading one GitHub account: the account of Cédric Freivogel, with all its public and private repositories. Each number carries its date in the sentence. Repository names, customer names, host names and addresses are never published, only sums.
Which commits are counted?
Commits on the default branch of each repository, read from the GitHub API since the first commit on record, on 28 January 2026. Merge commits are counted separately and are left out of all activity figures. A commit on a feature branch counts once it is merged.
Which day does a commit belong to?
The day in the time zone of the server, Europe/Zurich, from 00:00 to 23:59:59. A week starts on Monday at 00:00.
How are lines changed counted?
Per commit with git log --numstat, with one fixed exclusion rule: JSON files except package.json, tsconfig*.json and jsconfig*.json; .geojson, .csv, .tsv, .xml; minified files, source maps, .svg, snapshots and lockfiles; everything under dist, build, vendor, node_modules, coverage and .next at any depth; and any single file with more than 3,000 changed lines in one commit.
How are the server and its firewall read?
A script on the host reads the state every 5 minutes and writes it to a file that gitpuls displays; nothing is reachable from outside. For the firewall it counts the rules in the INPUT and DOCKER-USER chains, separately for IPv4 and IPv6, checks whether netfilter-persistent is enabled, compares the running rules with the saved ones and compares the date of the saved file with the last boot.
What is not measured?
Other accounts, other servers and anything that would need access to a third party's data. When a number is not measured, the article says so.