How EmitCI estimates energy from CI pipeline metadata
Anand Srinivasan
6 Jun 2026 · 8 min read
GitHub does not expose CPU utilization data. So how does EmitCI know how much energy your workflow used?
The model
EmitCI uses an adaptation of the GreenAlgorithms v2.2 methodology. The core formula is: energy_kwh = (min_watts + utilization × (TDP − min_watts)) × duration_hours × PUE / 1000. TDP is the rated maximum power draw of the CPU. min_watts is the idle power floor (30% of TDP). Utilization is estimated from workflow type and step names. PUE accounts for datacenter overhead.
Runner TDP database
We maintain TDP values for every runner label GitHub exposes. ubuntu-latest maps to Azure DS2_v2, Intel Xeon. macos-14 maps to Apple M1, 10W TDP at peak. For new runner types we update within 48 hours.
Estimating utilization
Compile steps (cargo build, go build) run at 90% utilization. Test steps (pytest, jest) at 80%. Lint/check steps at 50%. Network-heavy steps (docker pull, npm install) at 30%. Setup steps at 20%. We over-estimate rather than under-estimate , the conservative choice for ESG reporting.
Carbon intensity
We multiply energy by the carbon intensity of the grid region where the runner runs, using Electricity Maps API data averaged over the day.
Accuracy
Our estimates are within ±30% of measured values in lab testing. All methodology parameters are open and documented.