EU-CRI — a daily, methodology-transparent reference price for renting AI compute in Europe. Headline series EU-CRI-H100: one NVIDIA H100 SXM 80GB GPU-hour, on-demand, 8-GPU NVLink node, delivered from an EU/EEA data centre, in USD (EUR companion at the ECB reference rate). Sub-indices: EU-sovereign providers, marketplace vs cloud, class series (A100/B200 once they clear the source gate), and EU-CRI-COMPUTE — a chain-linked composite whose class basket follows the observed market across hardware generations. Constituent weights are data-driven: recomputed on a fixed weekly schedule from a trailing observation window, capped so no single venue can set the print, and stored append-only for audit.
The credibility strategy is radical methodological transparency on a regional niche: every parameter is a visible config value, the methodology document is generated from that config, raw observations are immutable, and every published print carries a full, queryable constituent set. Design follows the IOSCO Principles for Financial Benchmarks (2013) as voluntary best practice — see GOVERNANCE.md, METHODOLOGY.md, and SOURCES.md.
EU-CRI is a research publication. It is not investment advice and is not administered as a benchmark under EU Regulation 2016/1011; it may not be used as a reference price in financial instruments.
python -m venv .venv
.venv/Scripts/activate # Windows; source .venv/bin/activate on Linux
pip install -e .[dev]
python -m eucri.run migrate # create data/eucri.db
python -m eucri.run daily # collect today's observations + compute all series
python -m eucri.run constituents --date 2026-07-18
pytest| Command | Purpose |
|---|---|
migrate |
apply database migrations |
daily [--date D] |
run collectors (idempotent per source+day), compute all series, export CSV/charts |
constituents --date D [--series S] |
full audit table for a print (IOSCO P13/P16) |
backfill --from D --to D |
recompute prints from stored observations (never re-collects) |
weights [--date D] |
show (computing if due) the weight review in effect for a date |
validate |
source-dropout sensitivity + optional check-series correlation |
post |
regenerate the paste-ready Substack post |
docs |
regenerate METHODOLOGY.md + METHODOLOGY.lock |
config/— all methodology parameters (factors.yaml), sovereign constituent list, static provider price entries withlast_verifieddatessrc/eucri/— collectors (fail-soft, 1 request/source/day, honest User-Agent), normalisation, index calculation, outputsdata/eucri.db— SQLite, committed; observations and prints are append-only (trigger-enforced)site/— the live dashboard (index.html), CSV history, charts,data/latest.json(constituents, weight review, and per-source weblinks for the dashboard), andapi/refresh.js(Vercel-only serverless function). Regenerated daily. Deployed to GitHub Pages by.github/workflows/pages.ymlon every push that touchessite/.config/source_links.yaml— reference weblinks for the dashboard's Sources panel and per-constituent links. Presentational only; not part of METHODOLOGY.lock.
site/ is a self-contained static site plus one optional serverless endpoint, so it can
be hosted anywhere that serves static files. Two targets are wired up:
-
GitHub Pages (works out of the box):
.github/workflows/pages.ymldeployssite/on every push. The dashboard degrades gracefully here — the "Request today's collection" button reports "live refresh isn't available on this mirror" since Pages has no serverless functions. -
Vercel (adds live refresh): import the repo as a Vercel project with Root Directory set to
site. This serves the same dashboard plusapi/refresh.js, which lets a visitor triggerdaily.ymlon demand when today hasn't been collected yet. Requires two Vercel Environment Variables (Project Settings → Environment Variables — never committed to the repo):GITHUB_DISPATCH_TOKEN— a token scoped to just this repo's Actions (read/write), e.g. a fine-grained PAT limited tomarkrusch/Compute-IndexGITHUB_REPO—markrusch/Compute-Index
The refresh endpoint refuses any date other than today (in UTC): these collectors report live market prices, not history, so a past date can never be honestly re-collected — see
GOVERNANCE.mdandSTYLE.mdon why a gap stays a gap.
Not casually. Any change to config/factors.yaml, config/sovereign.yaml,
src/eucri/index.py, src/eucri/normalise.py, or src/eucri/weights.py fails CI
unless the version is bumped, the CHANGELOG has an entry, and the lock is regenerated —
and takes effect only after one publication's notice. Scheduled weight reviews execute
a fixed published formula and are data updates, not methodology changes. Procedure:
GOVERNANCE.md.