<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mohd Altamish</title>
    <description>The latest articles on DEV Community by Mohd Altamish (@mohd-altamish).</description>
    <link>https://dev.to/mohd-altamish</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2832795%2Fbafcb9ef-ed17-4aa9-a69c-d93d52854c9e.jpeg</url>
      <title>DEV Community: Mohd Altamish</title>
      <link>https://dev.to/mohd-altamish</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohd-altamish"/>
    <language>en</language>
    <item>
      <title>How I Built Carbon Tracker — An AI Agent That Calculates CO2 Emissions from CI/CD Pipelines (Won GitLab AI Hackathon)</title>
      <dc:creator>Mohd Altamish</dc:creator>
      <pubDate>Thu, 07 May 2026 07:16:47 +0000</pubDate>
      <link>https://dev.to/mohd-altamish/how-i-built-carbon-tracker-an-ai-agent-that-calculates-co2-emissions-from-cicd-pipelines-won-1b83</link>
      <guid>https://dev.to/mohd-altamish/how-i-built-carbon-tracker-an-ai-agent-that-calculates-co2-emissions-from-cicd-pipelines-won-1b83</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7orbu63f576ou85sgkw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7orbu63f576ou85sgkw.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I just won an &lt;strong&gt;Honorable Mention&lt;/strong&gt; at the **GitLab Duo Agent Platform &lt;/p&gt;

&lt;p&gt;Hackathon 2026** — a global competition with &lt;strong&gt;6,971 participants&lt;/strong&gt; and &lt;/p&gt;

&lt;p&gt;which has a total &lt;strong&gt;$65,000 prize pool&lt;/strong&gt; — with a project called &lt;strong&gt;Carbon Tracker&lt;/strong&gt; I won in &lt;strong&gt;Sustainable Agent Category&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built it solo. In 5 days. With zero prior GitLab experience.&lt;/p&gt;

&lt;p&gt;This is the full story — what I built, why, how it works, and&lt;br&gt;
everything I learned.&lt;/p&gt;


&lt;h2&gt;
  
  
  🌍 The Problem Nobody Is Talking About
&lt;/h2&gt;

&lt;p&gt;I was reviewing a failed CI/CD pipeline when a thought hit me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This pipeline just retried 3 times. How much electricity did that waste?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I searched for a tool that could answer that. Nothing existed.&lt;br&gt;
No GitLab feature. No third-party plugin. No open source project.&lt;/p&gt;

&lt;p&gt;Developers obsess over pipeline speed, test coverage, and code quality —&lt;br&gt;
but the &lt;strong&gt;carbon footprint of their CI/CD infrastructure is completely&lt;br&gt;
invisible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the scale of the problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The software industry contributes &lt;strong&gt;2–3% of global carbon emissions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A team of 10 developers running 20 pipelines/day emits close to
&lt;strong&gt;1 tonne of CO2 per year&lt;/strong&gt; — just from pipelines&lt;/li&gt;
&lt;li&gt;A single flaky test retrying twice, running 20x/day =
&lt;strong&gt;440 kg CO2 per year&lt;/strong&gt; — from one test&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nobody knows. Nobody tracks it. No tool exists for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Until now.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🌱 What Is Carbon Tracker?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Carbon Tracker&lt;/strong&gt; is a 3-agent AI flow built on the&lt;br&gt;
&lt;strong&gt;GitLab Duo Agent Platform&lt;/strong&gt; that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔁 Triggers when you mention it in any GitLab Issue or MR&lt;/li&gt;
&lt;li&gt;📊 Calculates CO2 emissions per job using a physics-based energy model&lt;/li&gt;
&lt;li&gt;🤖 Uses &lt;strong&gt;Claude (Anthropic)&lt;/strong&gt; to detect waste patterns and generate tips&lt;/li&gt;
&lt;li&gt;💬 Posts a full sustainability report as an MR/Issue comment automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire project is &lt;strong&gt;2 YAML files.&lt;/strong&gt;&lt;br&gt;
No servers. No databases. No infrastructure to maintain.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚙️ Architecture — How the 3 Agents Work Together
&lt;/h2&gt;

&lt;p&gt;User mentions @ai-carbon-tracker-flow in an Issue or MR&lt;br&gt;
↓&lt;br&gt;
Agent 1: pipeline_fetcher&lt;br&gt;
Tools: get_merge_request, list_merge_requests&lt;br&gt;
→ Fetches job names, durations, statuses&lt;br&gt;
↓&lt;br&gt;
Agent 2: carbon_calculator&lt;br&gt;
→ Applies energy model&lt;br&gt;
→ Detects waste patterns&lt;br&gt;
→ Generates full markdown report&lt;br&gt;
↓&lt;br&gt;
Agent 3: report_publisher&lt;br&gt;
Tools: create_merge_request_note, create_issue_note&lt;br&gt;
→ Posts report as MR/Issue comment&lt;br&gt;
↓&lt;br&gt;
Report Live ✅&lt;/p&gt;

&lt;p&gt;Each agent has &lt;strong&gt;one job.&lt;/strong&gt; Output passes to the next via&lt;br&gt;
&lt;code&gt;from/as&lt;/code&gt; bindings in the flow definition.&lt;/p&gt;

&lt;p&gt;This is genuine multi-agent orchestration — not a chatbot.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔬 The Carbon Model — Simple Math, Real Impact
&lt;/h2&gt;

&lt;p&gt;The core logic in one sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Servers use electricity. Electricity produces CO2.&lt;br&gt;
We know how long each job ran. So we can calculate the CO2.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Energy consumed per job:&lt;/strong&gt;&lt;br&gt;
E(kWh) = (duration_seconds / 3600) × (150W / 1000)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — CO2 emitted per job:&lt;/strong&gt;&lt;br&gt;
CO2(g) = E(kWh) × 475&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Waste multiplier for retried jobs:&lt;/strong&gt;&lt;br&gt;
CO2_total = CO2_job × (1 + N_retries)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constants used:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;
| Parameter | Value | Source |
|-----------|-------|--------|
| Runner wattage | 150W | Typical shared GitLab runner |
| Carbon intensity | 475 gCO2/kWh | IEA Global Average 2024 |
| Km equivalent | CO2g ÷ 150 | Average car: 150gCO2/km |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real example:&lt;/strong&gt;&lt;br&gt;
test:unit ran 45 minutes&lt;br&gt;
45 ÷ 60       = 0.75 hours&lt;br&gt;
0.75 × 150W   = 112.5 Wh&lt;br&gt;
112.5 ÷ 1000  = 0.1125 kWh&lt;br&gt;
0.1125 × 475  = 53.4g CO2&lt;br&gt;
= Driving 0.35 km in a car&lt;br&gt;
From one job. One pipeline. One day.&lt;/p&gt;


&lt;h2&gt;
  
  
  📊 Real Output From a Real Pipeline
&lt;/h2&gt;

&lt;p&gt;This is an actual report Carbon Tracker auto-posted on my MR&lt;br&gt;
during development:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pipeline #2405610327 — Live Report&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;⚡ Energy&lt;/th&gt;
&lt;th&gt;💨 CO₂&lt;/th&gt;
&lt;th&gt;🚗 Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.0034 kWh&lt;/td&gt;
&lt;td&gt;1.62g&lt;/td&gt;
&lt;td&gt;~0.011 km driven&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;📋 Job Breakdown&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;th&gt;Energy (kWh)&lt;/th&gt;
&lt;th&gt;CO₂ (g)&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;unit-test-job&lt;/td&gt;
&lt;td&gt;~63s&lt;/td&gt;
&lt;td&gt;0.002625&lt;/td&gt;
&lt;td&gt;1.247g&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lint-test-job&lt;/td&gt;
&lt;td&gt;~13s&lt;/td&gt;
&lt;td&gt;0.000542&lt;/td&gt;
&lt;td&gt;0.257g&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;build-job&lt;/td&gt;
&lt;td&gt;~3s&lt;/td&gt;
&lt;td&gt;0.000125&lt;/td&gt;
&lt;td&gt;0.059g&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deploy-job&lt;/td&gt;
&lt;td&gt;~3s&lt;/td&gt;
&lt;td&gt;0.000125&lt;/td&gt;
&lt;td&gt;0.059g&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;📊 CO₂ Distribution&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;th&gt;%&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;unit-test-job&lt;/td&gt;
&lt;td&gt;🟧🟧🟧🟧🟧🟧🟧🟧&lt;/td&gt;
&lt;td&gt;77%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lint-test-job&lt;/td&gt;
&lt;td&gt;🟧🟧&lt;/td&gt;
&lt;td&gt;16%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;build-job&lt;/td&gt;
&lt;td&gt;🟨&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deploy-job&lt;/td&gt;
&lt;td&gt;🟨&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🔥 Waste Patterns Detected:&lt;/p&gt;

&lt;p&gt;Artificial sleep in unit-test-job → 77% of total CO₂&lt;br&gt;
Config-only change triggered full pipeline → wasted 1.56g&lt;br&gt;
Deploy ran on non-production branch unnecessarily&lt;/p&gt;

&lt;p&gt;💡 Optimization Tips:&lt;/p&gt;

&lt;p&gt;Replace sleep with real tests → saves ~96% emissions&lt;br&gt;
Add path rules for config changes → saves 1.56g/run&lt;br&gt;
Restrict deploy to main branch → saves 0.059g/push&lt;/p&gt;

&lt;p&gt;🏅 Sustainability Score: B+&lt;br&gt;
🤖 Carbon Tracker · GitLab Duo + Claude (Anthropic)&lt;/p&gt;

&lt;p&gt;Claude identified that a &lt;code&gt;sleep 60&lt;/code&gt; command was responsible for&lt;br&gt;
&lt;strong&gt;77% of the pipeline's total CO2.&lt;/strong&gt; That's the kind of specific,&lt;br&gt;
actionable insight that makes this tool genuinely useful —&lt;br&gt;
not just a novelty.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ The Code — How It's Built
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;flow.yml&lt;/code&gt; — The 3-Agent Orchestration
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Carbon&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Tracker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Flow"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calculates&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;CO2&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;emissions&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;per&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;CI/CD&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pipeline&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;job."&lt;/span&gt;
&lt;span class="na"&gt;public&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ambient&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pipeline_fetcher"&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AgentComponent&lt;/span&gt;
      &lt;span class="na"&gt;prompt_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fetch_prompt"&lt;/span&gt;
      &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;context:goal"&lt;/span&gt;
          &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;goal"&lt;/span&gt;
      &lt;span class="na"&gt;toolset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_merge_request"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list_merge_requests"&lt;/span&gt;
      &lt;span class="na"&gt;ui_log_events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;on_agent_final_answer&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;carbon_calculator"&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AgentComponent&lt;/span&gt;
      &lt;span class="na"&gt;prompt_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calculate_prompt"&lt;/span&gt;
      &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;context:goal"&lt;/span&gt;
          &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;goal"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pipeline_fetcher:output"&lt;/span&gt;
          &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pipeline_data"&lt;/span&gt;
      &lt;span class="na"&gt;ui_log_events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;on_agent_final_answer&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report_publisher"&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AgentComponent&lt;/span&gt;
      &lt;span class="na"&gt;prompt_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;publish_prompt"&lt;/span&gt;
      &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;context:goal"&lt;/span&gt;
          &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;goal"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;carbon_calculator:output"&lt;/span&gt;
          &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;carbon_report"&lt;/span&gt;
      &lt;span class="na"&gt;toolset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create_merge_request_note"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create_issue_note"&lt;/span&gt;
      &lt;span class="na"&gt;ui_log_events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;on_agent_final_answer&lt;/span&gt;

  &lt;span class="na"&gt;routers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pipeline_fetcher"&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;carbon_calculator"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;carbon_calculator"&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report_publisher"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report_publisher"&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end"&lt;/span&gt;

  &lt;span class="na"&gt;flow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;entry_point&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pipeline_fetcher"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;agent.yml&lt;/code&gt; — The Standalone Agent
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;yaml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Carbon&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Tracker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Agent"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calculates&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;CO2&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;emissions&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;CI/CD&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pipeline&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;jobs."&lt;/span&gt;
&lt;span class="na"&gt;public&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;system_prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;You are the Carbon Tracker Agent running inside GitLab Duo.&lt;/span&gt;
  &lt;span class="s"&gt;Calculate CO2 per job:&lt;/span&gt;
    &lt;span class="s"&gt;energy_kwh = (duration_seconds / 3600) * 150 / 1000&lt;/span&gt;
    &lt;span class="s"&gt;co2_grams  = energy_kwh * 475&lt;/span&gt;
  &lt;span class="s"&gt;Generate a markdown report with job breakdown and tips.&lt;/span&gt;
  &lt;span class="s"&gt;End with: "🤖 Carbon Tracker · GitLab Duo + Claude (Anthropic)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Why 3 Agents Instead of 1?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single agent&lt;/td&gt;
&lt;td&gt;Gets confused doing fetch + calculate + publish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 agents&lt;/td&gt;
&lt;td&gt;Each has one job — focused, debuggable, reliable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Separating concerns across agents produces &lt;strong&gt;dramatically better&lt;br&gt;
output quality&lt;/strong&gt; from Claude. Each prompt is laser-focused on&lt;br&gt;
one task, which means each agent does it exceptionally well.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚧 Challenges I Ran Into
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Learning GitLab Duo From Zero
&lt;/h3&gt;

&lt;p&gt;I had never used GitLab before this hackathon.&lt;/p&gt;

&lt;p&gt;Learning the Agent Platform, Flow schema, YAML configuration,&lt;br&gt;
CI/CD variables, and the tool system — simultaneously — under&lt;br&gt;
a 5-day deadline was the steepest part of the entire build.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. YAML Schema Validation Hell
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;toolset&lt;/code&gt; format for flow components was completely&lt;br&gt;
undocumented for custom flows. I went through this loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Attempt 1 — Failed ❌&lt;/span&gt;
&lt;span class="na"&gt;toolset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;get_merge_request&lt;/span&gt;

&lt;span class="c1"&gt;# Attempt 2 — Failed ❌&lt;/span&gt;
&lt;span class="na"&gt;toolset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;tool_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;get_merge_request&lt;/span&gt;

&lt;span class="c1"&gt;# Attempt 3 — Failed ❌&lt;/span&gt;
&lt;span class="na"&gt;toolset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;tool_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_merge_request"&lt;/span&gt;

&lt;span class="c1"&gt;# Final — Passed ✅&lt;/span&gt;
&lt;span class="na"&gt;toolset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_merge_request"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each attempt was a full &lt;strong&gt;commit → CI pipeline → read error → fix&lt;/strong&gt;&lt;br&gt;
cycle. That loop taught me more about the platform than any&lt;br&gt;
documentation could have.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. No Official Runner Energy Data
&lt;/h3&gt;

&lt;p&gt;GitLab's API doesn't expose runner power consumption anywhere.&lt;/p&gt;

&lt;p&gt;I researched cloud compute energy benchmarks from AWS, GCP,&lt;br&gt;
and Azure instance specs and settled on &lt;strong&gt;150W&lt;/strong&gt; as a&lt;br&gt;
physically grounded constant — accurate enough to be meaningful&lt;br&gt;
without overclaiming false precision.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Prompt Engineering for Consistent Output
&lt;/h3&gt;

&lt;p&gt;Getting Claude to produce a clean, consistently formatted&lt;br&gt;
markdown table on &lt;strong&gt;every single run&lt;/strong&gt; — with specific actionable&lt;br&gt;
tips referencing actual job names, not generic advice — required&lt;br&gt;
significant iteration across all 3 agent system prompts.&lt;/p&gt;

&lt;p&gt;The key insight: &lt;strong&gt;shorter, more focused prompts per agent&lt;/strong&gt;&lt;br&gt;
outperform a single long prompt trying to do everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Accomplishments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Built a fully working multi-agent flow on GitLab Duo with
&lt;strong&gt;zero prior GitLab experience&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Designed a &lt;strong&gt;physics-based carbon model&lt;/strong&gt; grounded in
real IEA 2024 energy data&lt;/li&gt;
&lt;li&gt;✅ Created what is (to my knowledge) the &lt;strong&gt;first per-job
CO2 breakdown tool&lt;/strong&gt; for GitLab CI/CD pipelines&lt;/li&gt;
&lt;li&gt;✅ Implemented genuine &lt;strong&gt;3-agent orchestration&lt;/strong&gt; —
not a chatbot, a real automated multi-step workflow&lt;/li&gt;
&lt;li&gt;✅ Made sustainability &lt;strong&gt;completely frictionless&lt;/strong&gt; —
developers get carbon data without changing their workflow&lt;/li&gt;
&lt;li&gt;✅ Shipped from &lt;strong&gt;zero GitLab knowledge to a validated,
catalog-published flow&lt;/strong&gt; in 5 days&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 What I Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Technical:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How &lt;code&gt;AgentComponent&lt;/code&gt; steps chain via routers and &lt;code&gt;from/as&lt;/code&gt;
input bindings in GitLab Duo Flows v1&lt;/li&gt;
&lt;li&gt;Prompt engineering for focused, single-purpose agents
produces far better output than one large prompt&lt;/li&gt;
&lt;li&gt;How to model real-world energy consumption from
infrastructure metadata using public carbon intensity data&lt;/li&gt;
&lt;li&gt;How Claude's system prompts can enforce structured,
consistent output formats across automated pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;About building under pressure:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ship fast, debug faster — each failed pipeline taught
me something the docs didn't&lt;/li&gt;
&lt;li&gt;Undocumented = opportunity. Nobody else figured it out
either, which means fewer competitors&lt;/li&gt;
&lt;li&gt;The best projects solve problems that feel obvious
in hindsight but nobody has tackled yet&lt;/li&gt;
&lt;li&gt;A first-year student can compete globally and win —
the internet doesn't care about your year of study&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔮 What's Next for Carbon Tracker
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Region-aware carbon intensity&lt;/strong&gt; — replace global 475 gCO2/kWh
with location-specific values using runner metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project carbon dashboard&lt;/strong&gt; — cumulative Wiki page with
monthly emissions trend graphs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carbon budget alerts&lt;/strong&gt; — notify teams when monthly
pipeline emissions exceed a threshold&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MR carbon diff&lt;/strong&gt; — predict how a code change affects
emissions &lt;em&gt;before&lt;/em&gt; merging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real runner wattage&lt;/strong&gt; — per-runner power draw via
GitLab runner metadata API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekly carbon digest&lt;/strong&gt; — Slack/email summary of
team-wide emissions and top savings&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏆 The Result
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Won Honorable Mention&lt;/strong&gt; — GitLab Duo Agent Platform&lt;br&gt;
Hackathon 2026&lt;/p&gt;

&lt;p&gt;6,971 global participants&lt;br&gt;
Won: $500 prize cash&lt;br&gt;
Solo build&lt;br&gt;
5 days&lt;br&gt;
First year B.Tech CSE student&lt;br&gt;
Zero prior GitLab experience&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Devpost:&lt;/strong&gt; &lt;a href="https://devpost.com/software/carbon-tracker-ij25kf" rel="noopener noreferrer"&gt;https://devpost.com/software/carbon-tracker-ij25kf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitLab Repo:&lt;/strong&gt; &lt;a href="https://gitlab.com/gitlab-ai-hackathon/participants/altamish6589" rel="noopener noreferrer"&gt;https://gitlab.com/gitlab-ai-hackathon/participants/altamish6589&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Let's Talk
&lt;/h2&gt;

&lt;p&gt;If you're building on GitLab Duo Agent Platform and have&lt;br&gt;
questions about flows, toolset declarations, or multi-agent&lt;br&gt;
orchestration — drop a comment. Happy to help.&lt;/p&gt;

&lt;p&gt;If your team runs CI/CD pipelines and cares about your&lt;br&gt;
carbon footprint — Carbon Tracker was built for you. 🌱&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with GitLab Duo Agent Platform + Claude (Anthropic)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;`&lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>ai</category>
      <category>agents</category>
      <category>sustainability</category>
    </item>
  </channel>
</rss>
