Every project page here has a CODE block — weekly churn bars, all-time lines — built from pure git history, no API. The wine app showed 3.26M lines of churn. Flattering, and wrong.
Almost none of it was code. Two committed copies of a wine_catalog.json, a localization bundle, and a scraper’s .jsonl cache with its .bak snapshots — generated artifacts, re-emitted on every run. My noise filter only excluded the obvious: lockfiles, dist, node_modules.
I widened it to skip generated-data buckets too — data/, output/, fixtures, .cache, Resources, plus .jsonl/.xcstrings and .bak backups. The wine app dropped to 580k churn, down 82%. Commit counts didn’t move; only the line inflation did.
A metric that counts bytes will faithfully measure whichever process emits the most bytes. Usually that’s not you — it’s your generators. Exclude them, or you’re charting your tooling.