Kairos Signal · All briefs · Pricing

DePIN capacity vs demand — brief for 2026-08-27

Generated 2026-08-27T23:38:53Z. Every number is measured, carries its source and as-of time, and can be re-derived from the live API. Windows are stated; nothing is interpolated or forecast.

MarkdownJSONLive API (free, no key)

What is scarce here. Both halves of a utilisation ratio — capacity AND consumption — on 6 networks: AKT, FIL, FLUX, IO, SC, TFT. Node counts are public everywhere; the denominator is not. This is the entire reason the ledger below can exist, and it is why coverage, not commentary, is what we sell.

The sharpest thing the data says this week. AKT gpus: utilisation 31.64% → 51.47%, with demand growing 63.73pp faster than capacity over the window. Demand is outrunning capacity: the constraint is onboarding, not adoption, and utilisation headroom is the thing to underwrite.

6 stale dashboard(s) caught · 148 of 219 token supplies confirmed by our own chain reads.

The allocator's ledger — capacity vs demand

Is this network adding capacity faster than demand absorbs it?

NetworkResourceUtilisationSupply ΔDemand ΔDivergenceRead
IOdevices57.28% → 45.19%20.95%-4.57%25.52ppovercapacity building
AKTstorage_bytes7.98% → 7.14%15.32%3.27%12.05ppovercapacity building
SCstorage_bytes25.85% → 27.64%-1.33%5.51%-6.84ppdemand outpacing supply
AKTmemory_bytes14.92% → 19.57%-2.38%28.08%-30.46ppdemand outpacing supply
AKTcompute_cores20.55% → 30.86%-3.64%44.72%-48.36ppdemand outpacing supply
AKTgpus31.64% → 51.47%1.69%65.42%-63.73ppdemand outpacing supply

Positive divergence = capacity onboarding faster than demand absorbs it — utilisation falls even while the headline node count rises. One window, not a trend. Descriptive, not a forecast.

Pairs we can compute and refuse to publish

A refusal you cannot audit is just a different kind of marketing, so each reason is published in full.

IO gpus

io.net's GPU_TOTAL is NOT registered GPU supply — it equals DEVICES_ACTIVE exactly on every archived day (1,213/1,213 ... 1,199/1,199), and GPU_HIRED + GPU_IDLE == GPU_TOTAL exactly. So hired/total is a FILL RATE on the already-active pool, near-tautological, and it excludes every passive device. It reads 96.7% while true device utilisation (active/registered) is 46.2% and FALLING — registered devices grew 2,057 -> 2,594 (+26%) in 7 days while active stayed flat near 1,200. Publishing 96.7% beside Akash's 30.5% (utilisation of REGISTERED capacity) would invert the actual story: io.net is the network accumulating idle supply fastest, not the one running hottest.

NOS devices

NOSANA HAS NO PUBLISHABLE DENOMINATOR (probed 2026-08-24, recorded so the next agent does not re-probe it). The numerator is free and clean — dashboard.k8s.prd.nos.ci/api/jobs?state=RUNNING reports totalJobs=947 running jobs and each Nosana job occupies exactly one node. The denominator is not: /api/nodes and /api/nodes/stats require an authorization header (401 with one, 422 without), and no unauthenticated sibling exposes a node count. Two tempting substitutes were REFUSED. (1) running + queued NODES from /api/markets: that per-market queue holds only IDLE nodes and is 0 across all 47 markets while 43 jobs sit QUEUED, so the denominator would equal the numerator by construction and publish a tautological 100%. (2) per-market access-SFT supply on Solana (231 for the nvidia-3070 market): a node joining three markets holds three SFTs and nothing burns them when it leaves, so the sum counts memberships and departed nodes, not live nodes. The numerator is collected anyway (collectors_clean/nosana_utilisation.py writes NOS JOBS_RUNNING/JOBS_QUEUED/MARKET_IDLE_NODES) so the pair can complete the day Nosana publishes a node count; no ratio until then.

SC devices

SIACOIN'S DENOMINATOR IS CUMULATIVE, NOT LIVE (measured 2026-08-24). Both halves flow — SC_ACTIVE_HOSTS ~530, SC_TOTAL_HOSTS ~87,048 — so the pair LOOKS complete and would auto-publish a 0.6% utilisation figure. It is not a utilisation figure: TOTAL_HOSTS counts every host ever announced to the Sia network and is monotonically non-decreasing across all 19 archived days (87,032.7 → 87,048.0, never once falling), while ACTIVE_HOSTS moves both ways in the 514-556 band. A denominator that can only grow makes the ratio a function of the network's AGE, so it would fall forever regardless of how the network performs — the Storj denominator trap in a new costume. The numerator is honest and stays queryable; no ratio until Sia publishes a currently-announced host count.

STORJ storage_bytes

STORJ PUBLISHES NO CAPACITY DENOMINATOR (measured 2026-08-24). Everything public is the numerator: stats.storjshare.io/data.json gives bytes stored by customers (53.4 PB) and the node-side footprint after erasure coding (92.2 PB, 1.73x), and the per-satellite node counts are memberships, not capacity — a node serving three satellites is counted three times, which is the same double-count that already inflated STORJ node totals. Nothing upstream states how many bytes the network could hold, so any utilisation ratio would need a denominator we invented. The numerator stays collected and is now correctly labelled storage_bytes_in_use rather than storage_bytes_total, which is what it had been resolving to.

Frozen feeds — the stale-dashboard detector

A first-party metric with exactly ONE distinct value across >=20 polls spanning >=5 days, while other metrics on the same network keep moving. The feed answers, but the number is stale at the source — invisible to uptime monitoring.

Supply verifiability — what we confirm on-chain ourselves

148 of 219 networks reconcile to within 1% — those figures are independently confirmed, not taken on trust. The rest are listed with the exact contract we read so you can check in one click.

A low ratio is a statement about ONE deployment on ONE chain, not a claim that the aggregator is wrong. Multi-chain tokens (native chain + bridged ERC-20) legitimately show low ratios: e.g. POKT and BTT are native elsewhere and only their wrapped portion is readable on the chain we poll. Verified 2026-08-24 that our reads are faithful to the contract: RIZ reads 100,000 on 0x058d411a..., byte-identical to the explorer's own figure for that contract.
NetworkChain readAggregator saysVerifiableContract
RIZ100,0004,989,887,9000.0%0x058d411a…
BDX4,468,7269,939,281,9450.0%0x9d10a1ec…
GENE261,413100,000,0000.3%0x9df46546…
POKT15,694,0932,351,355,4460.7%0x764a726d…
DEUS8,693,7411,000,000,0000.9%7JoGUTeaXk…
OORT20,000,0001,998,900,0001.0%0x5651fa7a…
EWT917,46381,071,8251.1%0x178c820f…
OCTA1,173,60244,907,9212.6%0xfa704148…
NMT3,856,323143,520,0042.7%0x03aa6298…
BTT36,542,206,310,204990,000,000,000,0003.7%0xc6699281…
SDM37,781,5381,000,000,0003.8%0x9cfe02eb…
NTMPI19,055,147399,963,0204.8%0x53be7be0…
LOOPIN3,235,63656,526,8755.7%0x975da7b2…
SLC6,075,929,00298,797,933,0556.2%0x6bd83abc…
GNUS1,000,00015,193,8486.6%0x61457703…

Verify any of this yourself

This brief is machine-readable and free — no key, no signup:

curl https://kairossignal.com/v1/brief

Every row ships source, as_of and a verify URL pointing at the origin rather than at us. If you can refute a number here, we would rather publish the correction than the number.