factcircuit
FactCircuit: an auditable claim-and-evidence verification loop with immutable provenance, staged checks, bounded retrieval, and reproducible evaluation.
The real energy cost of video transcoding and AI inference — measured live at the wall on Greening of Streaming's open bench. Every number is a real measurement: reproducible, citable, confidence-rate
DataPython · JavaScriptGitHub @Greening-of-StreamingOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
OWL (Online WattLab) — measures the real device-side energy cost of video transcoding and AI inference on physical hardware with a calibrated smart plug, not models or estimates. Every result carries a traffic-light confidence rating.
Taken from the repository README
Loading the full README.
Read the full README ↗WattLab measures the real device-side energy cost of video transcoding and AI inference on physical hardware — using a calibrated smart plug, not estimates or models.
Built by Greening of Streaming, a French NGO working on the environmental impact of streaming infrastructure.
Live instance: wattlab.greeningofstreaming.org
Current release: v1.0.0 · the running build stamps its exact commit (e.g. OWL v1.0.0 · <sha> · <date>, auto-derived from git describe) · Report an issue or feature request
Sister projects (GoS energy-measurement toolkit): LEM — Local Energy Measurement: measures one or more smart plugs over the LAN (no TP-Link cloud) and can stream into REM · REM — Remote Energy Measurement: fleet-wide collection + exploration in TimescaleDB.
| Test | What you get |
|---|---|
| Video transcode | Energy (Wh) and time for CPU vs GPU — H.264, H.265, AV1 at matched ABR bitrates. "Compare all codecs" runs all six presets in one go. |
| LLM inference | mWh per output token, tokens/sec — a dynamic model ladder ~1B–20B (CR-050): ollama pull <name> + tick in /settings; live panel on /llm. |
| Image generation | Wh per image — distilled diffusion panel ~0.6B–3.5B (live panel on /image). "Compare Models" fixes prompt + seed so the model is the only variable. |
| RAG energy test | Energy cost of retrieval-augmented generation vs plain LLM — baseline / rag / rag_large compared side-by-side |
All figures are delta above idle baseline, sampled at 1-second intervals via a Tapo P110 smart plug on the mains supply.
Scope: device layer only. Network, CDN, and CPE are explicitly excluded. No amortised training cost in LLM measurements. (One extension: since 2026-07 the findings catalog also carries client-device decode panels measured on a separate rig under the same protocol — each states its own device scope.)
These exclusions are deliberate. Scope statements appear on every result.
GoS1 — lab server in France
| Component | Spec |
|---|---|
| CPU | AMD Ryzen 9 7900, 24 cores |
| GPU | NVIDIA RTX 5080, 16 GB VRAM (NVENC / CUDA) |
| RAM | 61 GB |
| OS | Ubuntu 24, kernel 6.17 |
| Power meter | Tapo P110 smart plug (mains, 1s polling) |
| Idle draw | ~79 W (display-blanked) |
GPU swapped from an AMD Radeon RX 7800 XT in May 2026; AMD-era baselines and measurements are preserved in docs/gpu_swap_amd_baseline.md.
Published findings live at /findings — a catalog of citable energy measurements, each one backed by a stored result file. Examples currently published:
Ship-of-Theseus honesty: when methodology changes (full GPU pipeline, ABR rate control, VMAF measurement), older findings are versioned via supersedes: in the finding file — citable URLs stay stable; the new reading lives alongside, marked as the current one.
Three tiers, one URL — https://wattlab.greeningofstreaming.org. The same page renders different controls depending on who's looking:
| Tier | Who | How | What's unlocked |
|---|---|---|---|
| Anonymous | Public visitors | Just open the URL — Anonymous tier resolves automatically | Curated workloads, full guided tour at /demo, prev-result panels populated from curated demo runs |
| Member | GoS members on the allowlist | Sign in via the magic-link form on /auth/sign-in (email-based) | Custom prompts / ffmpeg commands, all-codecs sweeps, RAG corpus uploads, video uploads ≤ 1 GB, CSV/JSON bulk export |
| Lab | Operators on GoS1 | LAN address (192.168.x.x) or SSH tunnel | Full settings, variance calibration, thermal-recovery probe, all jobs unscoped |
Anonymous quick-look: https://wattlab.greeningofstreaming.org/demo — the nine-step Guided Tour with predetermined demo jobs (H.265 CPU vs GPU, a representative LLM run, SD-Turbo, RAG comparison).
Lab via SSH tunnel:
ssh -p 2222 -L 8000:localhost:8000 [email protected]
# then open http://localhost:8000
The capability matrix is product copy on /demo step 6, and lives in code at wattlab_service/capabilities.py (one row per capability). All routes gate on capabilities, not raw tier compares.
Requires GoS1 or equivalent hardware (P110 plug, GPU optional — NVENC/CUDA or VAAPI/ROCm auto-detected).
pip install -r requirements.txt # at repo root; see CLAUDE.md for full package list
cp .env.example .env # add TAPO_EMAIL, TAPO_PASSWORD, TAPO_P110_IP
cd wattlab_service
uvicorn main:app --host 0.0.0.0 --port 8000
The service runs as a systemd unit on GoS1 (systemctl status wattlab).
Run the tests: cd wattlab_service && pytest tests/ — the current count is in TESTING.md (it drifts upward and is deliberately not quoted here; the suite must be run from wattlab_service/ — its conftest.py sets up the import path).
ARCHITECTURE.md — module map and request/job flows (best orientation doc; start here)WATTLAB_SPEC.md — original v0.2 product spec (April 2026, mostly delivered; current architecture in CLAUDE.md)JOURNAL.md — session-by-session build log with findingsTESTING.md — three-tier testing strategy (pytest suite + manual checklist)STAGING.md — staging mode (swap onto a feature branch with a maintenance page)bin/README.md — operator-facing shell scripts (stage-on, stage-off, probe-thermal-recovery, owl-maintenance-watchdog)systemd/README.md — systemd unit files for OWL servicesCHANGE_REQUESTS.md — active design / change requestsCHANGE_REQUESTS_CLOSED.md — shipped CRs archivedocs/wattlab_traffic_light_confidence.md — Tania's statistical framework for the confidence flag (CR-028 Phase 2 spec)docs/wattlab_parameters_audit.md — every settings parameter classified and the path to principled valuesdocs/result_envelope.md — the mode → renderer contract for every persisted result typedecode_bench/README.md — the client decode rig (devices, plugs, protocol, origin)docs/vp9_oneoff_2026-08.md · docs/pi_decode_energy_2026-07.md · docs/encode_parity_calibration_2026-06.md — campaign reportsdocs/methodology_vs_code_2026-08-19.md — where /methodology and the implementation disagree (owner review list)GOS1_INFRA.md — the server: disks, network, backups, incident logCLAUDE.md — project context for Claude Code (AI assistant config)