Methodology

Data sources, anchor calibration, and how the Composite Integrity Score is calculated

Overview

The Composite Integrity Score combines six live indicators, each measuring a different aspect of Bitcoin's structural health: fee-market maturity, the security budget, mining decentralization, transaction inclusion, custodial concentration, and node software diversity. Every indicator is fetched from a public API, converted to a 0–100 sub-score by interpolation between fixed anchor points, and combined into a single weighted score with weakest-link semantics.

All data is fetched client-side in your browser — there is no backend, and no adjustment or smoothing is applied beyond what is described on this page.

About This Project

A personal note upfront: I'm not a Bitcoin expert. I built this dashboard because I wanted a better feel for the structural health of the network myself, beyond price charts and headlines — and figured others might find it useful too. The methodology was developed with substantial help from AI, drawing on published research on Bitcoin's security economics. That's exactly why everything here is open source and documented in detail: I want the calibration, the data handling, and the assumptions to be checked by people who know more than I do. If you spot something wrong, please open an issue on GitHub.

Data Sources

Source Used for Window
mempool.space Block fees & rewards (Fee Market); mining-pool shares and block-template match rates (Mining Decentralization, Transaction Inclusion) 3m / 1w
CoinGecko Market cap and circulating supply; public-company & fund treasury holdings (Security Budget, Custodial Concentration) snapshot
blockchain.info Miner revenue in USD (Security Budget) 30d avg (1y trend)
bitaccelerate.net Listening-node client software snapshot (Node Software Diversity) latest snapshot

All data is fetched on page load. Requests are deduplicated and cached in-browser, so indicators sharing an endpoint — such as Mining Decentralization and Transaction Inclusion, which both use the same weekly pool data — trigger only a single API call.

Normalization & Status Thresholds

Each raw indicator value is converted to a 0–100 sub-score by piecewise-linear interpolation between fixed anchor points. Each anchor pairs a raw value with a score; values between two anchors are scaled linearly, and values outside the anchor range are clamped to the first or last anchor's score.

score = interpolate(value, anchors)  // linear between anchor points, clamped at the ends

For indicators where a lower raw value is healthier (Custodial Concentration, Node Software Diversity, and the HHI component of Mining Decentralization), the anchors are defined in descending score order, so that 100 always means "healthy" and 0 always means "stressed".

Each indicator card on the dashboard also carries a status badge — Healthy, Watch, or Concern. Badge thresholds and composite anchors are aligned: the Concern-to-Watch boundary maps to a sub-score of 60 and the Watch-to-Healthy boundary to 80. The exact thresholds for each indicator are listed on the cards below.

Indicators, Thresholds & Anchors

Indicator 1 · Pair A

Fee Market Maturity

higher = better

mempool.space · 3-month window · weight 1/6

Transaction fees as a share of total block reward (fees + subsidy) over the last three months, in BTC. As the subsidy halves every ~4 years, security must increasingly come from fees. In the current era (3.125 BTC subsidy), fee shares typically run 0.3%–2% in normal conditions.

Status thresholds

Healthy ≥ 2% Watch 0.5% – 2% Concern < 0.5%

Composite anchors

0% → 0  ·  0.5% → 60  ·  2% → 80  ·  5% → 100

Calibrated for the current halving era; re-tuned after each halving as fee share naturally doubles relative to subsidy.

Indicator 2 · Pair A

Security Budget

higher = better

blockchain.info + CoinGecko · 30-day avg · weight 1/6

Annualized miner revenue (30-day average daily revenue × 365) divided by market capitalization. Measures how much is spent per year securing the network relative to the value being secured. The dashboard card also shows an estimated hourly attack cost derived from average daily miner revenue.

Status thresholds

Healthy ≥ 0.75% Watch 0.50% – 0.75% Concern < 0.50%

Composite anchors

0% → 0  ·  0.50% → 60  ·  0.75% → 80  ·  1.5% → 100

Indicator 3 · Pair B

Mining Decentralization

min of two

mempool.space · 1-week window · weight 1/6

Two sub-metrics over the last week of blocks (excluding unattributed "Unknown" blocks): the Herfindahl–Hirschman Index — sum of squared pool shares, lower is more distributed — and the Nakamoto coefficient — the minimum number of pools controlling over 50% of blocks. The sub-score is the minimum of the two, so strength in one metric cannot mask weakness in the other; the badge likewise reflects the worse of the two statuses. Template-provider concentration may be higher than visible pool shares suggest.

Status thresholds (HHI)

Healthy ≤ 0.15 Watch 0.15 – 0.25 Concern > 0.25

Status thresholds (Nakamoto)

Healthy ≥ 4 Watch = 3 Concern ≤ 2

Composite anchors

HHI: 0.05 → 100 · 0.15 → 80 · 0.25 → 60 · 0.60 → 0
Nakamoto: 1 → 0 · 2 → 30 · 3 → 65 · 4 → 80 · 6 → 100

Indicator 4 · Pair B

Transaction Inclusion

higher = better

mempool.space · 1-week window · weight 1/6

The block-weighted average of how closely each pool's blocks match the expected block template, over the last week. High match rates indicate pools are including transactions neutrally, as fee-rate ordering predicts; sustained low rates can signal filtering, private fee deals, or alternative inclusion policies. Blocks from unidentified pools are excluded — precisely the blocks most likely to deviate — so treat this as an optimistic bound.

Status thresholds

Healthy ≥ 98% Watch 95% – 98% Concern < 95%

Composite anchors

90% → 0  ·  95% → 60  ·  98% → 80  ·  99.5% → 100

Indicator 5 · Pair C

Custodial Concentration

lower = better

CoinGecko · current snapshot · weight 1/6

BTC held by tracked institutional custodians — publicly-disclosed corporate treasuries and tracked funds — as a percentage of circulating supply. This does not include exchange custody balances or every spot ETF, so the figure is a lower bound on true custodial concentration; exchange custody alone is estimated to add another 15–20% based on external research. Thresholds and anchors are calibrated for this tracked subset only.

Status thresholds

Healthy ≤ 5% Watch 5% – 10% Concern > 10%

Composite anchors

2% → 100  ·  5% → 80  ·  10% → 60  ·  25% → 0

Indicator 6 · Pair C

Node Software Diversity

lower = better

bitaccelerate.net · latest snapshot · weight 1/6

The share of listening nodes running the single most dominant client implementation (currently the larger of Bitcoin Core and Bitcoin Knots). A software monoculture is a systemic risk: a critical bug in one dominant client could affect nearly the entire network. The dashboard badge uses richer logic than the composite — it also flags rapid fragmentation as "Watch" — while the composite tracks only dominant-client share, since the score requires a single monotonic scalar. Badge and sub-score can therefore legitimately disagree at the margins.

Status thresholds (dominant-client share)

Healthy ≤ 70% Watch 70% – 90% Concern > 90%

Additional badge rule: rapid fragmentation (e.g. Knots share above 20%) is flagged as Watch regardless of the dominant-client share.

Composite anchors

50% → 100  ·  70% → 80  ·  90% → 60  ·  100% → 20

Composite Calculation

The six indicators form three thematic pairs, weighted equally at one-third each (1/6 per indicator):

Pair A — Economic sustainability (Fee Market Maturity, Security Budget): whether fees can replace the diminishing block subsidy, and whether total security spend remains proportional to value at risk.

Pair B — Decentralization & neutrality (Mining Decentralization, Transaction Inclusion): who can produce blocks, and whether that production is being used to censor.

Pair C — Capture & monoculture (Custodial Concentration, Node Software Diversity): two ways the protocol's properties can be effectively bypassed even while the chain itself appears healthy.

weighted = Σ ( sub-score × weight ) / Σ weights
composite = min( weighted, lowest sub-score + 25 )  // weakest-link cap

Because integrity is a weakest-link property, the composite is capped at 25 points above the lowest-scoring indicator, so strong indicators cannot mask a failing one. If an API is temporarily unreachable, that indicator is excluded and the coverage line below the score shows how many indicators are live. If fewer than four indicators have live data, no composite score is shown.

Threshold calibration draws on the academic literature on Bitcoin's security economics (Budish 2018, Carlsten et al. 2016, Eyal & Sirer 2014, Heilman et al. 2015, among others).

Caveats

Anchor values and status thresholds are calibrated against historical ranges and current-era network conditions, and are reviewed periodically. Several indicators measure only what is publicly observable — tracked treasuries, attributed pool blocks, listening nodes — and may understate the underlying phenomenon. This is a hobby project by a non-expert, built with AI assistance — treat the outputs accordingly and verify anything you rely on. The score is an informational heuristic, not financial advice.