GPU energy per million output tokens by model, GPU and configuration, with grid carbon by country.
Static, generated, no forms, no tracking. The only script is a short inline light/dark switch in the page shell. Serve the folder as-is (folder-style URLs; see Deploy).
index.html home
why/ index/ api/ mcp/ blog/ newsletter/ contribute/ about/ one index.html each (generated)
blog/<slug>/index.html one folder per post (generated)
api/v1/ the read-only JSON API (generated)
feed.xml sitemap.xml robots.txt llms.txt llms-full.txt .nojekyll (generated)
assets/cards/*.png (generated social cards, one number per page; needs Pillow and build/fonts)
assets/site.css the one stylesheet (hand-written)
assets/logo/ the mark and lockups (SVG masters, light and dark), the icon master and its 512 px PNG
assets/social-card.svg .png the 1200 by 630 link preview image (og:image); the PNG is rendered from the SVG
favicon.svg favicon.ico apple-touch-icon.png site icons, cut from assets/logo/leadgreen-icon.svg
build/build.py the generator: reads build/data, build/pages, build/posts; writes everything above
build/layout.html page shell: head, nav, footer, {{PLACEHOLDERS}}
build/pages/*.html page bodies, one per page, with a meta block at the top
build/posts/YYYY-MM-DD-slug.html blog posts, same shape
build/data/ dated snapshots of every source file used, plus the NVIDIA hardware transcription
leadgreen-mcp/ the MCP server package (pyproject.toml, leadgreen_mcp/, README); leadgreen_mcp/data/ is a copy of api/v1
dist/ the built wheel that the MCP page's install line points at
Dockerfile .dockerignore docker/nginx.conf the production container image (nginx); see Deploy (container)
k8s/leadgreen-website.yaml its Kubernetes Deployment, Service, Istio Gateway and VirtualService
master is pushed there after every merge, GitHub Pages serves leadgreen.ai from it, and it is where issues and pull requests from outside are opened. A change accepted there is merged into the working repository and reaches the mirror on the next push.build/project_text.py; the build writes them into the pages' JSON-LD sameAs, CITATION.cff and .zenodo.json. build/hf_dataset.py assembles and pushes the dataset.From this folder:
python build/build.py
It renders every page and API file in memory first and refuses to write anything if a single {{PLACEHOLDER}} is unfilled or an em or en dash appears. Numbers on pages come only from build/data through placeholders defined in build/build.py; never type a figure into a page.
After any change to leadgreen-mcp/ or to the data, rebuild the wheel:
python -m pip wheel ./leadgreen-mcp -w dist --no-deps
The MCP server works with the mcp Python SDK 1.x and 2.x (guarded import in server.py). To exercise it, run any MCP client against python -m leadgreen_mcp.server with PYTHONPATH=leadgreen-mcp and LEADGREEN_API_BASE set to the api/v1 folder; an example client script that checks the worked example (50 million tokens of Qwen 3 32B on H100 in Serbia = about 3,173 Wh and 2.12 kg CO2e) is described in the handover.
Preview: serve the folder locally, for example python -m http.server 8171 from the site root, so folder-style links resolve; opening the files directly also works for single pages.
build/pages/<name>.html. The meta block (title, description, optional og_type) feeds the head. {{ROOT}} prefixes every internal link so pages work from any depth.build/posts/YYYY-MM-DD-slug.html with a meta block (title, description, date, optional slug, author) and the body HTML; rebuild. It appears on /blog/, in feed.xml, sitemap.xml and the home page's "latest" line.subs dict of build/build.py, computed from a snapshot.build/build.py): REPO_URL (links to the repository are omitted while empty; the MCP install line then points at the wheel on this site), NEWSLETTER_SIGNUP_URL (the newsletter page points at Own Your AI until it is set; never a fake form), UPDATED.build/data/ with a fresh retrieval, keeping the date in the file name:
https://raw.githubusercontent.com/ml-energy/leaderboard/master/public/data/tasks/lm-arena-chat.json and .../gpqa.json (branch master, not main)https://files.ember-energy.org/public-downloads/generation/outputs/release_generation_yearly_global.csv (16 MB), then extract the Total generation rows for every Country or economy plus World for the three latest years, keeping the columns in the existing extracthttps://huggingface.co/spaces/AIEnergyScore/Leaderboard/raw/main/data/energy/text_generation.csvbuild/data/nvidia-hardware-*.json and save a new dated copybuild/build.py at the new snapshots; bump UPDATED and the source version strings.build/pages/index.html.Since 19 October 2026 the site is served by GitHub Pages from the public mirror katonic-dev/leadgreen-ai: source branch master, folder /, custom domain leadgreen.ai (the CNAME file at the root), HTTPS enforced. Every push of master to the mirror is a deploy; there is no image to build and nothing to apply. .nojekyll keeps Pages from running Jekyll over the generated files.
What Pages gives for free: folder-style URLs, 404.html as the not-found page, Access-Control-Allow-Origin: * on every file (so the API's "CORS open" claim holds), www.leadgreen.ai redirected to the apex, HTTP redirected to HTTPS. What it cannot do: custom response headers (no HSTS, X-Content-Type-Options, Referrer-Policy or Content-Security-Policy) and no access log, so there is no server-side record of crawlers; Search Console and Bing Webmaster Tools are the only visibility.
DNS at the registrar: A records for the apex to 185.199.108.153, 185.199.109.153, 185.199.110.153, 185.199.111.153 (and the matching AAAA records 2606:50c0:8000::153 to 2606:50c0:8003::153), CNAME www to katonic-dev.github.io. The mail records (MX, SPF) stay as they are.
After a deploy: fetch https://leadgreen.ai/api/v1/manifest.json and the wheel named on the /mcp/ page once to confirm both are served; run python build/indexnow.py (--all the first time, then only the URLs whose content changed, which the build lists in build/indexnow-changed.txt).
The container path (Dockerfile, docker/nginx.conf, k8s/leadgreen-website.yaml) served the site from a Katonic Kubernetes cluster from 14 to 19 October 2026 and is retired; the files stay until the cluster resources are removed, then they go.
The mark is one square pulse of GPU power with the area beneath it filled in: energy is the area under the power curve, a watt-hour drawn the way the meter sees it. Ink and accent only, no third colour, no gradient; on dark pages only the ink flips. Masters live in assets/logo/; the masthead carries an inline copy of the mark in build/layout.html, so a change to the geometry has to be made in both. The wordmark is Archivo Bold with tight tracking, "Lead" in ink and "Green" in the accent; the lockup SVGs have the type outlined, so they need no font. Rasters (favicon.ico, apple-touch-icon.png, assets/logo/leadgreen-icon-512.png, assets/social-card.png) are rendered from the SVG masters; re-render them after any change.
No figure is typed into a page by hand. Every figure has a source in the ledger with a retrieval date. Nothing on the site claims a Katonic measurement until one exists. No customer names. No em or en dashes. Lead Green is a Katonic project, never a separate entity.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
uvx leadgreen-mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"ai-leadgreen-green-token-index": {
"command": "uvx",
"args": [
"leadgreen-mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceLead Green works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.