<?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>Forem: Damola Adegbite</title>
    <description>The latest articles on Forem by Damola Adegbite (@dax-side).</description>
    <link>https://forem.com/dax-side</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%2F2850111%2F47d0ff13-ee69-464f-a0aa-084f0ffb5ef0.png</url>
      <title>Forem: Damola Adegbite</title>
      <link>https://forem.com/dax-side</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dax-side"/>
    <language>en</language>
    <item>
      <title>I built a tool that shows developers what their backend costs the planet</title>
      <dc:creator>Damola Adegbite</dc:creator>
      <pubDate>Sat, 18 Apr 2026 19:44:55 +0000</pubDate>
      <link>https://forem.com/dax-side/i-built-a-tool-that-shows-developers-what-their-backend-costs-the-planet-jm1</link>
      <guid>https://forem.com/dax-side/i-built-a-tool-that-shows-developers-what-their-backend-costs-the-planet-jm1</guid>
      <description>&lt;p&gt;&lt;strong&gt;I built a tool that shows developers what their backend costs the planet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-04-16"&gt;Weekend Challenge: Earth Day Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;carbondebt is a cloud emissions dashboard for backend developers. Put in your cloud provider, region, and monthly compute hours. It calculates your CO2e footprint, breaks it down by service, and uses Google Gemini to return ranked actions with estimated carbon savings per month.&lt;/p&gt;

&lt;p&gt;No account. No setup. Results in under ten seconds.&lt;/p&gt;

&lt;p&gt;Developers track technical debt across quarters. We argue about it in code review, carry it into sprints. But there is another kind of debt building up in every infrastructure decision, one that never shows up in your AWS bill. Carbon debt works the same way. It compounds quietly and stays invisible until someone surfaces it. This tool surfaces it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://carbondebt-client.vercel.app" rel="noopener noreferrer"&gt;carbondebt-client.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the app, select AWS, set the region to us-east-1, leave compute hours at 720. Then switch to eu-north-1. Stockholm's grid is 76% cleaner than Virginia's. That difference is a decision most developers have never been asked to make.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/dax-side" rel="noopener noreferrer"&gt;
        dax-side
      &lt;/a&gt; / &lt;a href="https://github.com/dax-side/carbondebt" rel="noopener noreferrer"&gt;
        carbondebt
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;carbondebt&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;carbondebt is a cloud emissions dashboard for developers
Enter your workload numbers, then get a monthly footprint estimate and a ranked action list.&lt;/p&gt;
&lt;p&gt;Live demo: &lt;a href="https://carbondebt-client.vercel.app" rel="nofollow noopener noreferrer"&gt;carbondebt-client.vercel.app&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What you get&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Total monthly CO2e&lt;/li&gt;
&lt;li&gt;Grid intensity for the selected region&lt;/li&gt;
&lt;li&gt;Emissions split by service (compute, database, storage, network, lambda)&lt;/li&gt;
&lt;li&gt;Best lower-carbon region inside the same cloud provider&lt;/li&gt;
&lt;li&gt;Gemini suggestions sorted by estimated monthly savings&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How carbon is calculated&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The backend uses scope 2 location-based emissions from local region intensity data.
Intensity values come from Ember Global Electricity Review 2025.&lt;/p&gt;
&lt;p&gt;Formula:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;CO2e (kg) = kWh * grid_intensity (gCO2e/kWh) / 1000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Source file for region values: &lt;code&gt;server/src/data/regions.ts&lt;/code&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Stack&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Frontend: React, Vite, TypeScript, Tailwind CSS&lt;/li&gt;
&lt;li&gt;Backend: Node.js, Express, TypeScript&lt;/li&gt;
&lt;li&gt;Validation: Zod&lt;/li&gt;
&lt;li&gt;AI: Google Gemini&lt;/li&gt;
&lt;li&gt;Logging: Morgan + Winston&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;API&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;GET /api/health&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Returns service status.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;POST /api/carbon&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Request body:&lt;/p&gt;
&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;{
  &lt;span class="pl-ent"&gt;"provider"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;aws&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
  &lt;span class="pl-ent"&gt;"region"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;us-east-1&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
  &lt;span class="pl-ent"&gt;"computeHours"&lt;/span&gt;: &lt;span class="pl-c1"&gt;720&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/dax-side/carbondebt" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The frontend is React with TypeScript and Tailwind. The backend is Node.js and Express. No database. Every request is self-contained.&lt;/p&gt;

&lt;p&gt;Carbon calculations run locally on the server using regional grid intensity data from the Ember Global Electricity Review 2025 dataset. No third-party emissions API. The numbers are transparent and traceable to the source.&lt;/p&gt;

&lt;p&gt;One thing I added that changed how the data reads: the "equivalent to X km driven" metric. Saying a workload produces 125 kg CO2e per month is accurate but abstract. Converting it to kilometres driven makes the number land for people who have never thought about this before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini integration:&lt;/strong&gt; After the carbon report is calculated, it goes to Gemini which returns 3 to 5 ranked infrastructure suggestions specific to the submitted workload. Not generic advice. Things like "switch to Graviton3 instances" or "stop non-production servers outside business hours" with an estimated kg saving attached to each one. The formula gives you the number. Gemini tells you what to do with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Google Gemini&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gemini takes the carbon report and turns it into something a developer can act on today. Each suggestion is ranked by estimated monthly CO2e saving and tied to the actual workload submitted. If Gemini is unavailable, the carbon report still renders. The suggestions are an addition, not a dependency.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>GitNotion — GitHub to Notion sync with AI reports</title>
      <dc:creator>Damola Adegbite</dc:creator>
      <pubDate>Mon, 16 Mar 2026 11:09:57 +0000</pubDate>
      <link>https://forem.com/dax-side/i-built-an-mcp-server-that-syncs-github-into-notion-and-generates-ai-reports-5ao6</link>
      <guid>https://forem.com/dax-side/i-built-an-mcp-server-that-syncs-github-into-notion-and-generates-ai-reports-5ao6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/notion-2026-03-04"&gt;Notion MCP Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;GitNotion is an MCP server that pulls GitHub activity into Notion and uses Gemini to write reports on top of it. Point it at any repo and it syncs issues, PRs, and commits into structured Notion databases, then generates weekly summaries, release notes, and contributor breakdowns. All free APIs, ships via npx.&lt;/p&gt;

&lt;p&gt;Eight MCP tools, accessible from Claude Desktop, Copilot, or any MCP client:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;setup_workspace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Creates 4 Notion databases under a parent page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sync_issues&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pulls GitHub issues into Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sync_pull_requests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pulls PRs into Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sync_commits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Logs recent commits to Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generate_summary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sends last week of activity to Gemini, writes a summary page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generate_release_notes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generates release notes from merged PRs and commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_contributor_insights&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per-contributor stats with an AI written report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;full_sync&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs everything above in sequence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Re-running any sync tool updates existing entries. No duplicates.&lt;/p&gt;

&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%2Fq96nob80sygj17atbgm2.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%2Fq96nob80sygj17atbgm2.png" alt="Notion page showing 4 databases created by setup_workspace: Issues, Pull Requests, Commits, and Summaries for vuejs/core"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Demo
&lt;/h2&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/-S-R8Pg7BA4"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  Show us the code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/dax-side/gitnotion" rel="noopener noreferrer"&gt;https://github.com/dax-side/gitnotion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;npx -y gitnotion&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Notion MCP
&lt;/h2&gt;

&lt;p&gt;GitNotion embeds the official &lt;code&gt;@notionhq/notion-mcp-server&lt;/code&gt; as a dependency and uses it as the write layer for all page operations. The architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Agent (Claude, Copilot, etc.)
    ↓ MCP protocol
GitNotion MCP Server  ← custom server
    ├── GitHub API (read repo data)
    ├── Gemini API (generate reports)
    └── Official Notion MCP Server  ← all page/block writes go here
         └── Notion API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a sync or AI tool runs, GitNotion spawns the official Notion MCP server as a subprocess, connects to it as an MCP client, and routes all page create, update, and block append calls through it using &lt;code&gt;API-post-page&lt;/code&gt;, &lt;code&gt;API-patch-page&lt;/code&gt;, and &lt;code&gt;API-patch-block-children&lt;/code&gt;. Database creation goes through the Notion SDK directly since the official server doesn't expose that endpoint.&lt;/p&gt;

&lt;p&gt;Gemini returns markdown. Notion doesn't accept markdown — it wants structured block objects for every heading, list item, table row, and inline annotation. The converter handles all of that, then the blocks get sent to the official MCP server via &lt;code&gt;API-patch-block-children&lt;/code&gt; in chunks of 100. Chunking is needed because passing large content in a single call times out. The pattern is: create the page first with no children, then append in batches.&lt;/p&gt;

&lt;p&gt;To use it, add this to your MCP client config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"gitnotion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gitnotion"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"GITHUB_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"GITHUB_REPO"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"owner/repo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"NOTION_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"NOTION_PARENT_PAGE_ID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"GEMINI_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four free things needed: GitHub token, Notion integration token (connected to your page via &lt;code&gt;•••&lt;/code&gt; &amp;gt; Connections), Gemini API key, and the Notion parent page ID from the URL. Ask your MCP client to run &lt;code&gt;setup_workspace&lt;/code&gt;, then pass the returned database IDs to &lt;code&gt;full_sync&lt;/code&gt;.&lt;/p&gt;

&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%2F27zyial36zlzlvca4r4a.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%2F27zyial36zlzlvca4r4a.png" alt="Weekly summary page in Notion for vuejs/core showing bullet points, bold highlights, and inline code rendered from Gemini output"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fwx2perkdeu1mk902z2ky.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%2Fwx2perkdeu1mk902z2ky.png" alt="Contributor insights page in Notion showing a table with columns for Contributor, Commits, PRs Created, PRs Merged, and Issues"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>notionchallenge</category>
      <category>mcp</category>
      <category>devchallenge</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
