<?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: Dickson Kanyingi</title>
    <description>The latest articles on Forem by Dickson Kanyingi (@kanyingidickson-dev).</description>
    <link>https://forem.com/kanyingidickson-dev</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%2F3664534%2Fcd603e4f-719d-4d57-83b6-a61644064ce5.jpeg</url>
      <title>Forem: Dickson Kanyingi</title>
      <link>https://forem.com/kanyingidickson-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kanyingidickson-dev"/>
    <language>en</language>
    <item>
      <title>EcoOS Intelligence: Reimagining Sustainability with AI</title>
      <dc:creator>Dickson Kanyingi</dc:creator>
      <pubDate>Mon, 20 Apr 2026 03:21:21 +0000</pubDate>
      <link>https://forem.com/kanyingidickson-dev/ecoos-intelligence-reimagining-sustainability-with-ai-1d4e</link>
      <guid>https://forem.com/kanyingidickson-dev/ecoos-intelligence-reimagining-sustainability-with-ai-1d4e</guid>
      <description>&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;blockquote&gt;
&lt;p&gt;What if every daily decision showed its carbon cost &lt;em&gt;before&lt;/em&gt; you made it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Built for the &lt;strong&gt;DEV Earth Day Challenge&lt;/strong&gt;, &lt;strong&gt;EcoOS Intelligence&lt;/strong&gt; is a real-time, AI-powered system that transforms sustainability from abstract awareness into &lt;strong&gt;clear, measurable action&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of static calculators, EcoOS acts as a &lt;strong&gt;behavioral operating system for climate action&lt;/strong&gt;—helping users understand, simulate, and improve their impact across everyday life.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ What Makes This Different?
&lt;/h2&gt;

&lt;p&gt;Most climate tools tell you &lt;em&gt;what happened&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EcoOS shows you what will happen before you act.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;strong&gt;AI reasoning engine&lt;/strong&gt; → breaks down lifestyle into real CO₂ impact
&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;What-if simulator&lt;/strong&gt; → test decisions before committing
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Personal AI coach&lt;/strong&gt; → adapts to your behavior over time
&lt;/li&gt;
&lt;li&gt;♻️ &lt;strong&gt;Image-based waste analysis&lt;/strong&gt; → classify real-world waste instantly
&lt;/li&gt;
&lt;li&gt;🏆 &lt;strong&gt;Gamified system&lt;/strong&gt; → turns sustainability into daily action
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is not a tracker. It's a &lt;strong&gt;decision-making system.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 The Problem
&lt;/h2&gt;

&lt;p&gt;People care about sustainability—but don't act consistently.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data is complex and hard to interpret &lt;/li&gt;
&lt;li&gt;Tools are passive (no feedback loop)
&lt;/li&gt;
&lt;li&gt;Advice is generic and not personalized
&lt;/li&gt;
&lt;li&gt;Impact is invisible in daily decisions
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The gap isn't awareness—it's &lt;strong&gt;actionability&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 The Solution: EcoOS Intelligence
&lt;/h2&gt;

&lt;p&gt;EcoOS is a modular ecosystem focused on turning intention into action across the most impactful areas of personal sustainability:&lt;/p&gt;

&lt;h3&gt;
  
  
  🌱 Carbon Mirror — The Intelligence Engine
&lt;/h3&gt;

&lt;p&gt;Describe your lifestyle in plain English. Gemini performs &lt;strong&gt;multi-step reasoning&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decomposition&lt;/strong&gt; — Parse activities into discrete categories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category Scoring&lt;/strong&gt; — Estimate CO₂ using established emission factors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synthesis&lt;/strong&gt; — Compute confidence-weighted totals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommendations&lt;/strong&gt; — Generate prioritized, quantified action plans&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON Schema Validation&lt;/strong&gt; — 6 custom validators ensure structured, type-safe responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Platform Sharing&lt;/strong&gt; — Share results to X/Twitter, Facebook, LinkedIn, or copy for Instagram &amp;amp; TikTok&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🎯 What-If Simulator — The "Wow" Feature
&lt;/h3&gt;

&lt;p&gt;Ask &lt;em&gt;"What if I stop using Uber for a month?"&lt;/em&gt; and get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timeline projections&lt;/strong&gt; (1 month, 6 months, 1 year)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Money saved&lt;/strong&gt; alongside CO₂ saved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tangible equivalences&lt;/strong&gt; (trees, flights, driving distance)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community scale&lt;/strong&gt; — "If 10,000 people did this..."&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💬 Carbon Coach — Your AI Advisor
&lt;/h3&gt;

&lt;p&gt;A conversational AI that &lt;strong&gt;remembers your history&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Knows your eco-score, past analyses, completed quests&lt;/li&gt;
&lt;li&gt;Gives realistic, specific advice — not generic platitudes&lt;/li&gt;
&lt;li&gt;Persists conversations across sessions&lt;/li&gt;
&lt;li&gt;Adjusts your eco-score based on engagement&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏆 Eco-Quest — The Behavior Engine
&lt;/h3&gt;

&lt;p&gt;AI-generated daily challenges that &lt;strong&gt;adapt to what you've already done&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never repeats previously completed quests&lt;/li&gt;
&lt;li&gt;Every mission includes quantified impact metrics&lt;/li&gt;
&lt;li&gt;Points system feeds into your overall sustainability grade&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ♻️ WasteWise Vision (The "WOW" Multi-Modal Feature)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Image-based waste classification&lt;/strong&gt; powered by Gemini 2.0 Flash's visual reasoning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload or drag-and-drop a photo of your waste.&lt;/li&gt;
&lt;li&gt;Gemini visually decomposes the materials, checks for contamination, and provides the exact disposal category.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚗 EcoRoute
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Transport optimization&lt;/strong&gt; comparing 9 modes (Car, EV, Motorcycle, Bus, Train, Bike, Walk, Plane, Boat) with annual projections and community scale impact.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://eco-os.vercel.app/" rel="noopener noreferrer"&gt;EcoOS.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📸 Visual Walkthrough
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Screenshot&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;🌱 Carbon Mirror&lt;/strong&gt; — AI analyzes your lifestyle&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkanyingidickson-dev%2FEcoOS%2Fmain%2Fpublic%2Fscreenshot-carbon-mirror.png" alt="Carbon Mirror" width="800" height="400"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;🎯 What-If Simulator&lt;/strong&gt; — See impact before you act&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkanyingidickson-dev%2FEcoOS%2Fmain%2Fpublic%2Fscreenshot-whatif.png" alt="What-If" width="800" height="400"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;♻️ WasteWise&lt;/strong&gt; — Image-based classification&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkanyingidickson-dev%2FEcoOS%2Fmain%2Fpublic%2Fscreenshot-wastewise.png" alt="WasteWise" width="800" height="400"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;🚗 EcoRoute&lt;/strong&gt; — 9-mode transport comparison&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkanyingidickson-dev%2FEcoOS%2Fmain%2Fpublic%2Fscreenshot-ecoroute.png" alt="EcoRoute" width="800" height="400"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;💬 Carbon Coach&lt;/strong&gt; — Personalized AI advisor&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkanyingidickson-dev%2FEcoOS%2Fmain%2Fpublic%2Fscreenshot-carboncoach.png" alt="Carbon Coach" width="800" height="400"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;📊 Dashboard&lt;/strong&gt; — Your sustainability command center&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkanyingidickson-dev%2FEcoOS%2Fmain%2Fpublic%2Fscreenshot-dashboard.png" alt="Dashboard" width="800" height="400"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🎥 Quick Demo Flow (2 minutes)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Carbon Mirror&lt;/strong&gt; → Describe your lifestyle → watch real-time breakdown
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What-If Simulator&lt;/strong&gt; → "What if I stop using Uber for a month?" → see yearly impact
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carbon Coach&lt;/strong&gt; → Ask anything → get personalized advice
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WasteWise&lt;/strong&gt; → Upload an image → get disposal guidance
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard&lt;/strong&gt; → See your eco-score evolve
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 Full flow takes under 2 minutes.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/kanyingidickson-dev/EcoOS.git" rel="noopener noreferrer"&gt;github.com/kanyingidickson-dev/EcoOS&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h2&gt;
  
  
  🧠 Best Use of Google Gemini: Built for Reliability
&lt;/h2&gt;

&lt;p&gt;For a tool like EcoOS, &lt;strong&gt;speed and reliability are everything&lt;/strong&gt;. We built a &lt;strong&gt;production-grade AI reasoning engine&lt;/strong&gt; with multi-layered resilience — not just a chat wrapper.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Structured JSON Mode
&lt;/h3&gt;

&lt;p&gt;Every response uses &lt;code&gt;responseMimeType: "application/json"&lt;/code&gt; for &lt;strong&gt;100% reliable UI rendering&lt;/strong&gt;:&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;"estimate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"breakdown"&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="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Transport"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Daily 20km commute"&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="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Food"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Occasional meat consumption"&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="nl"&gt;"suggestions"&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="s2"&gt;"Switch to public transit 3 days/week — saves ~48kg CO2/month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Adopt plant-based meals on weekdays — saves ~35kg CO2/month"&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;h3&gt;
  
  
  2. Multi-Step Reasoning (Chain-of-Thought)
&lt;/h3&gt;

&lt;p&gt;Every prompt follows a structured pipeline, not a simple "input → output":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STEP 1 — DECOMPOSITION: Parse input into categories
STEP 2 — SCORING: Estimate using emission factors
STEP 3 — SYNTHESIS: Confidence-weighted totals
STEP 4 — RECOMMENDATIONS: Prioritized by impact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Response Validation &amp;amp; Reliability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;6 custom validators&lt;/strong&gt; ensure every response has correct structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numeric sanitization&lt;/strong&gt; prevents NaN/undefined from reaching the UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry with exponential backoff&lt;/strong&gt; before graceful mock fallback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12-second timeout&lt;/strong&gt; prevents UI hangs on slow networks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Personalization Engine
&lt;/h3&gt;

&lt;p&gt;The system &lt;strong&gt;adapts over time&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores carbon history, waste scans, quest completions, coach topics&lt;/li&gt;
&lt;li&gt;Injects user context into every AI prompt&lt;/li&gt;
&lt;li&gt;Quest generator explicitly avoids repeating past challenges&lt;/li&gt;
&lt;li&gt;Coach references your previous analyses in conversation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Model Cascade with Automatic Failover
&lt;/h3&gt;

&lt;p&gt;Production resilience through tiered fallback when quotas are hit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gemini 2.5-flash (primary) → Gemini 2.0-flash (fallback) → Intelligent Mock (offline)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Request Optimization
&lt;/h3&gt;

&lt;p&gt;Performance optimizations for scale and cost-efficiency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In-memory caching&lt;/strong&gt;: 5-minute TTL eliminates redundant API calls for identical inputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token usage logging&lt;/strong&gt;: Cost monitoring for every API call&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Circuit Breaker Pattern
&lt;/h3&gt;

&lt;p&gt;Quota protection prevents cascade failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic detection&lt;/strong&gt; of rate limit (429) errors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5-minute cooldown&lt;/strong&gt; after 2+ quota errors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful degradation&lt;/strong&gt; to intelligent mock responses without user interruption&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Mock Fallback System
&lt;/h3&gt;

&lt;p&gt;Even without an API key, the entire app remains functional with &lt;strong&gt;intelligent mock data&lt;/strong&gt; that matches the exact JSON schema — perfect for offline demos and development.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Built for Real-World Constraints
&lt;/h2&gt;

&lt;p&gt;EcoOS is designed to work even under API limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works &lt;strong&gt;without an API key&lt;/strong&gt; (intelligent fallback system)&lt;/li&gt;
&lt;li&gt;Handles &lt;strong&gt;rate limits gracefully&lt;/strong&gt; (circuit breaker)&lt;/li&gt;
&lt;li&gt;Prevents UI failures with &lt;strong&gt;strict JSON validation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Optimized for &lt;strong&gt;low-cost, high-efficiency AI usage&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This ensures reliability in real-world conditions—not just ideal demos.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Testing &amp;amp; Quality Assurance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10 test files&lt;/strong&gt; with 51+ tests covering validators, sanitization, and UI components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response validation&lt;/strong&gt; tests ensure Gemini JSON schema compliance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mock fallback&lt;/strong&gt; tests verify 100% offline functionality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vitest + React Testing Library&lt;/strong&gt; for fast, reliable test execution&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎨 Design Strategy: Premium Sustainability
&lt;/h2&gt;

&lt;p&gt;We avoided the "clinical" look of traditional carbon tools. Instead, we built a &lt;strong&gt;high-end, dark-mode experience&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Animated SVG Ring Score&lt;/strong&gt; — real-time eco-grade with glow effects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glassmorphism&lt;/strong&gt; — translucent cards with backdrop blur&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion&lt;/strong&gt; — spring animations, staggered reveals, page transitions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Slider&lt;/strong&gt; — gradient thumb with glow shadow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Micro-Interactions&lt;/strong&gt; — points popup, toast notifications, pulsing badges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outfit + Inter fonts&lt;/strong&gt; — modern, premium typography&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎥 Demo Flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard&lt;/strong&gt; → See the animated ring score and live community feed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carbon Mirror&lt;/strong&gt; → Describe your lifestyle → Watch the breakdown animate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What-If&lt;/strong&gt; → Try "What if I go vegetarian?" → See yearly projections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coach&lt;/strong&gt; → Notice it says "I already know your history" → Get personalized advice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard&lt;/strong&gt; → Your eco-score has increased ✨&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🌍 Impact
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Per User&lt;/th&gt;
&lt;th&gt;At Scale (10K users)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CO₂ Awareness&lt;/td&gt;
&lt;td&gt;Instant footprint visibility&lt;/td&gt;
&lt;td&gt;245,000 kg CO₂ analyzed/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behavior Change&lt;/td&gt;
&lt;td&gt;Personalized action plans&lt;/td&gt;
&lt;td&gt;10,000+ daily eco-quests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision Support&lt;/td&gt;
&lt;td&gt;What-if before you commit&lt;/td&gt;
&lt;td&gt;Collective behavior shift&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 Future Vision
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;City-level integrations&lt;/strong&gt; — aggregate neighborhood sustainability data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carbon credit marketplace&lt;/strong&gt; — earn real credits from verified behavior changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart home integration&lt;/strong&gt; — automated energy tracking via IoT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corporate partnerships&lt;/strong&gt; — employee sustainability programs&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Built with 💚 for the planet.&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best use of Google Gemini&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Why Gemini 2.5 Flash? It's fast, cost-effective, and perfect for real-time interactions. The AI Magic behind the scenes makes it feel alive and responsive.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;#devchallenge #earthday #gemini #sustainability #nextjs #ai&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>earthday</category>
      <category>gemini</category>
    </item>
    <item>
      <title># The Useless Machine™ 🫖 - A Premium Enterprise SaaS That Solves Absolutely Nothing</title>
      <dc:creator>Dickson Kanyingi</dc:creator>
      <pubDate>Sat, 04 Apr 2026 17:09:32 +0000</pubDate>
      <link>https://forem.com/kanyingidickson-dev/-the-useless-machine-a-premium-enterprise-saas-that-solves-absolutely-nothing-15n8</link>
      <guid>https://forem.com/kanyingidickson-dev/-the-useless-machine-a-premium-enterprise-saas-that-solves-absolutely-nothing-15n8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The Useless Machine™&lt;/strong&gt; is a satirical, high-fidelity, and intentionally dysfunctional web application that presents itself as a premium, hyper-optimized enterprise SaaS dashboard. But every single feature is a carefully engineered betrayal of user experience.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;22 interconnected sub-apps&lt;/strong&gt; and the &lt;strong&gt;Premium Chaos v3.0&lt;/strong&gt; engine, it scales its dysfunction across four distinct phases (chaos engines):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Pristine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Perfect Glassmorphism. Smooth animations. Looks enterprise-ready.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Suspicious&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Subtle UI wobbles. Fake AI sentience alerts. "The Watcher" starts staring harder.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unstable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Evasive buttons activate. Flashbangs happen. Teapots rain from the sky.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Meltdown&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Screen flips 180°. Rage-click triggers Panic screens, elements teleport. Full BSOD simulated.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Key "Features"
&lt;/h3&gt;

&lt;p&gt;🧠 &lt;strong&gt;AI Code Surgery&lt;/strong&gt; — Reviews your code and "fixes" it by adding useless complexity and renaming every variable to &lt;code&gt;teapot&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🎭 &lt;strong&gt;Watcher v3 (3D)&lt;/strong&gt; — A Three.js mascot with eyeballs that track your cursor and jitter nervously in chaos mode&lt;/p&gt;

&lt;p&gt;🫖 &lt;strong&gt;Larry Mode&lt;/strong&gt; — Type &lt;code&gt;larry&lt;/code&gt; anywhere to activate a global &lt;code&gt;MutationObserver&lt;/code&gt; that replaces ALL text with &lt;code&gt;418: I'm a teapot&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;☕ &lt;strong&gt;Teapot Server&lt;/strong&gt; — An interactive console that violently refuses coffee requests and redirects all traffic to &lt;code&gt;/dev/null&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Evasive Buttons&lt;/strong&gt; — High-stakes buttons (like "Delete Account") use spring physics to physically jump away from your cursor&lt;/p&gt;

&lt;p&gt;🎊 &lt;strong&gt;Tea Rain&lt;/strong&gt; — Type &lt;code&gt;tea&lt;/code&gt; to trigger a &lt;code&gt;canvas-confetti&lt;/code&gt; storm of boba and teapots&lt;/p&gt;

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

&lt;p&gt;👉 &lt;strong&gt;Live App: The Useless Machine: &lt;a href="https://useless-machine.vercel.app" rel="noopener noreferrer"&gt;https://useless-machine.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;(Warning: May cause existential debugging and high-pitched ringing)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;All the terrible decisions are open source: &lt;a href="https://github.com/kanyingidickson-dev/useless-machine.git" rel="noopener noreferrer"&gt;repo@github/useless-machine.git&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Tech Stack (Over-Engineered for Nothing)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vite + React 19&lt;/strong&gt; — For that "fast but useless" developer experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion 12.38&lt;/strong&gt; — Gesture-driven chaos, evasive buttons, shared layout transitions with spring physics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Three Fiber 9.5 + @react-three/drei 10.7&lt;/strong&gt; — 3D cursor-tracking mascot with WebGL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three.js 0.183&lt;/strong&gt; — The 3D engine powering The Watcher eyeballs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas Confetti 1.9.4&lt;/strong&gt; — High-performance "Tea Rain" particle physics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Audio API&lt;/strong&gt; — Synthesizes dramatic buzzes, panic drones, and 17+ MP3 sound effects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vanilla CSS&lt;/strong&gt; — Premium glassmorphism aesthetic for maximum betrayal&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Animation Architecture
&lt;/h3&gt;

&lt;p&gt;The chaos system uses a phased approach based on user interaction count:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Phase detection in App.jsx&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPhase&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;interactionCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInteractionCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newPhase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interactionCount&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;setPhase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newPhase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;interactionCount&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Phase 1 (Pristine)&lt;/strong&gt;: Clean animations, no chaos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 2 (Suspicious)&lt;/strong&gt;: Subtle glitches, text wobbles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 3 (Unstable)&lt;/strong&gt;: Evasive buttons activate, flashbangs trigger&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 4 (Meltdown)&lt;/strong&gt;: Screen rotation, UI melting effects&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Key Technical Achievements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Evasive Buttons&lt;/strong&gt;: Spring physics calculation to calculate "escape" vectors from cursor position&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Eye Tracking&lt;/strong&gt;: Mouse position mapped to Three.js spherical rotations in real-time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Larry Mode&lt;/strong&gt;: MutationObserver intercepts ALL DOM text node changes and replaces content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panic Mode&lt;/strong&gt;: Click velocity detection (&amp;gt;10 clicks/second) triggers meltdown sequence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tea Rain&lt;/strong&gt;: Hardware-accelerated canvas particles with emoji sprites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MP3 Audio System&lt;/strong&gt;: 17 royalty-free sound effects with AudioContext management&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🫖 Best Ode to Larry Masinter (RFC 2324)
&lt;/h3&gt;

&lt;p&gt;This project doesn't just reference teapots—it &lt;strong&gt;enforces&lt;/strong&gt; them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global Teapot Mutation&lt;/strong&gt;: The &lt;code&gt;larry&lt;/code&gt; Easter egg trigger forces a system-wide "Teapot Only" state.  A &lt;code&gt;MutationObserver&lt;/code&gt; intercepts ALL DOM text updates and replaces them with &lt;code&gt;418: I'm a teapot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teapot Rain&lt;/strong&gt;: A high-performance particle system (&lt;code&gt;canvas-confetti&lt;/code&gt;) that rains teapots when "tea" is detected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug Reports&lt;/strong&gt;: Every Jira-style ticket is prefixed with &lt;code&gt;TEA-4180&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;418 Server&lt;/strong&gt;: A dedicated terminal simulation that only returns teapot status codes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict RFC 2324 Compliance&lt;/strong&gt;: Every error is &lt;code&gt;418&lt;/code&gt;. Every API response is a teapot. The HTTP Server component only serves &lt;code&gt;418 I'm a teapot&lt;/code&gt; responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hyper-Premium Hostility&lt;/strong&gt;: The contrast between the beautiful glassmorphism UI and the aggressive dysfunction creates a unique UX comedy that honors the absurdity of HTCPCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Watcher&lt;/strong&gt;: A 3D mascot that judges your lack of productivity in real-time, staring at your cursor with judgmental red pupils.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire application is essentially a love letter to the most famous HTTP status code that should have been: &lt;strong&gt;418 I'm a teapot&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Easter Eggs to Try
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Konami Code&lt;/strong&gt;: (↑ ↑ ↓ ↓ ← → ← → B A) — Activates "Useful Mode" only to immediately delete itself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panic Alert&lt;/strong&gt;: Click the background rapidly 10+ times to trigger meltdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Larry Truth&lt;/strong&gt;: Type &lt;code&gt;larry&lt;/code&gt; on your keyboard at any time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tea Rain&lt;/strong&gt;: Type &lt;code&gt;tea&lt;/code&gt; anywhere to trigger confetti storm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Destruct&lt;/strong&gt;: Find the ☢️ button in the footer... if you can catch it&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧠 Best Google AI Usage
&lt;/h3&gt;

&lt;p&gt;I built this entire project in collaboration with &lt;strong&gt;Antigravity&lt;/strong&gt; (Google's agentic AI coding assistant). Leveraging an AI to build something intentionally "useless" turned out to be a masterclass in prompt-driven chaos. We also implemented a &lt;strong&gt;Simulated Gemini Hub&lt;/strong&gt; that mimics the UI of modern AI assistants but delivers confidently wrong advice with absolute certainty.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If it breaks, that's intentional. If it works, that's a bug. Built with React and an unreasonable amount of setTimeout().&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🫖 &lt;strong&gt;RFC 2324 Compliant&lt;/strong&gt; | ⚠️ &lt;strong&gt;Not Production Ready&lt;/strong&gt; | 🎯 &lt;strong&gt;Zero Purpose Achieved&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Project Valkyrie: AI-Powered Crisis Logistics &amp; Response Hub (Notion Workspace)</title>
      <dc:creator>Dickson Kanyingi</dc:creator>
      <pubDate>Sat, 07 Mar 2026 17:07:35 +0000</pubDate>
      <link>https://forem.com/kanyingidickson-dev/project-valkyrie-ai-powered-crisis-logistics-response-hub-5gff</link>
      <guid>https://forem.com/kanyingidickson-dev/project-valkyrie-ai-powered-crisis-logistics-response-hub-5gff</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;&lt;strong&gt;Valkyrie&lt;/strong&gt; is an AI-powered crisis response and logistics command center that uses the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; to turn Notion into a real-time operations hub.&lt;/p&gt;

&lt;p&gt;In modern logistics, &lt;strong&gt;"latency kills."&lt;/strong&gt; When a natural disaster or geopolitical event occurs, operators lose precious minutes switching between news feeds, weather maps, and internal databases. Valkyrie solves this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bridging external threat data with internal asset data&lt;/strong&gt; via MCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autonomously staging incident responses&lt;/strong&gt; in Notion for human approval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintaining relational integrity&lt;/strong&gt; between incidents and affected assets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔍 &lt;strong&gt;Autonomous Threat Monitoring&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Scans simulated global feeds for risks near tracked assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📋 &lt;strong&gt;Instant Incident Staging&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Creates Notion pages with threat analysis and mitigation steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔗 &lt;strong&gt;Relational Asset Resolver&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Maps coordinates to Notion Page IDs for data integrity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👤 &lt;strong&gt;Human-in-the-Loop&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;AI proposes solutions; humans approve and execute&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  MCP Tools Exposed
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;analyze_global_threats  → Check asset for threats, stage incident if detected
scan_all_assets         → Batch scan all tracked assets
get_asset_details       → Retrieve full asset information
list_all_assets         → List assets with risk levels (🔴🟡🟢)
find_nearest_safe_asset → Find rerouting destination during crisis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;

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


&lt;br&gt;
&lt;em&gt;[Demo video - showing threat detection, incident staging, and human approval workflow]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo Workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask AI: &lt;em&gt;"Valkyrie, scan all assets for threats"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;AI detects tropical storm near Singapore Hub&lt;/li&gt;
&lt;li&gt;Incident page created in Notion with status "Awaiting Approval"&lt;/li&gt;
&lt;li&gt;Operator reviews, changes status to "In Progress"&lt;/li&gt;
&lt;li&gt;Crisis Response Playbook triggered&lt;/li&gt;
&lt;/ol&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%2Fbqnuzvifbxcl8gl7d272.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%2Fbqnuzvifbxcl8gl7d272.png" alt="Demo Workflow"&gt;&lt;/a&gt;&lt;em&gt;[Data Flow &amp;amp; Human-in-the-Loop Sequence - From threat detection to human approval]&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Show us the code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/kanyingidickson-dev/valkyrie-mcp-server" rel="noopener noreferrer"&gt;kanyingidickson-dev/valkyrie-mcp-server&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP Server&lt;/strong&gt;: TypeScript with &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion API&lt;/strong&gt;: v2022-06-28 with direct HTTP queries for database operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threat Simulator&lt;/strong&gt;: Python FastAPI generating realistic crisis scenarios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Docker Compose + GitHub Actions CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Project Structure
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;valkyrie-mcp-server/
├── src/                              # MCP server source code
│   ├── index.ts                      # MCP server entry point
│   ├── config.ts                     # Configuration management
│   ├── lib/                          # Core libraries
│   │   ├── assets.ts                 # Asset data utilities
│   │   └── assets.d.ts               # Type definitions
│   ├── tools/                        # MCP tool implementations
│   │   ├── index.ts                  # Tool exports
│   │   ├── analyze-threats.ts        # analyze_global_threats tool
│   │   ├── scan-assets.ts            # scan_all_assets tool
│   │   ├── get-asset-details.ts      # get_asset_details tool
│   │   ├── list-assets.ts            # list_all_assets tool
│   │   └── find-nearest-safe.ts      # find_nearest_safe_asset tool
│   └── types/                        # Type definitions
├── mock-api/                         # Threat simulator API
│   ├── valkyrie_mock_api.py          # FastAPI threat simulator
│   ├── requirements.txt
│   └── Dockerfile
├── scripts/                          # Orchestration &amp;amp; utility scripts
│   ├── seed_assets.py                # Populate Notion logistics DB
│   ├── clean_duplicates.py           # Remove duplicate assets
│   ├── scan_and_stage.js             # Scan assets and stage incidents
│   ├── trigger_and_stage.js          # Trigger threats and stage incidents
│   ├── notion_watcher.js             # Poll Notion for status changes
│   ├── webhook_server.js             # Handle Slack actions
│   ├── scheduler.js                  # Periodic scan scheduler
│   ├── notify.js                     # Notification utilities
│   └── requirements.txt
├── tests/                            # Test files
├── docs/                             # Documentation assets
│   ├── logical-overview.png
│   ├── deployment-overview.png
│   └── demo-workflow.png
├── .github/                          # CI/CD workflows
│   └── workflows/
│       └── valkyrie-deploy.yml
├── .data/                            # Local data storage
├── .husky/                           # Git hooks
├── dist/                             # Compiled output
├── package.json                      # Dependencies &amp;amp; scripts
├── tsconfig.json                     # TypeScript config
├── jest.config.cjs                   # Jest test config
├── .eslintrc.json                    # ESLint config
├── .prettierrc                       # Prettier config
├── docker-compose.yml                # Docker orchestration
├── Dockerfile                        # MCP server container
├── .env.example                      # Environment template
├── MCP_INSTRUCTIONS.md               # MCP usage guide
├── LICENSE
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Key Code: Relational Asset Resolver
&lt;/h3&gt;

&lt;p&gt;From &lt;code&gt;src/lib/assets.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Maps external telemetry coordinates to Notion Page IDs&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;queryNotionDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;databaseId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;NotionPageObject&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.notion.com/v1/databases/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;databaseId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/query`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOTION_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Notion-Version&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2022-06-28&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Incident Staging with Human-in-the-Loop
&lt;/h3&gt;

&lt;p&gt;From &lt;code&gt;src/tools/analyze-threats.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Creates Notion page with "Awaiting Approval" status&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createIncidentPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;assetName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;assetPageId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;threatLevel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;threatLevelText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;threatLevel&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Critical (Red)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Elevated (Yellow)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;incidentPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;notion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;database_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DASHBOARD_DB_ID&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Incident Name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`🚨 ALERT: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assetName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Awaiting Approval&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Threat Level&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;threatLevelText&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Affected Assets&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;relation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assetPageId&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assetPageId&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;incidentPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  The Integration
&lt;/h3&gt;

&lt;p&gt;Valkyrie uses the &lt;strong&gt;Model Context Protocol&lt;/strong&gt; to give AI assistants (like Windsurf's Cascade) direct access to Notion databases as tools. This unlocks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Autonomous Database Queries&lt;/strong&gt; - AI can query assets without manual API calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent Incident Creation&lt;/strong&gt; - AI stages responses with proper relations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual Awareness&lt;/strong&gt; - AI understands asset locations and risk profiles&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Notion Database Schema
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Operations Dashboard (Incidents DB)&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;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Incident Name&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Auto-generated: &lt;code&gt;🚨 ALERT: {Category} - {Asset}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Draft&lt;/code&gt; → &lt;code&gt;Awaiting Approval&lt;/code&gt; → &lt;code&gt;In Progress&lt;/code&gt; → &lt;code&gt;Resolved&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Threat Level&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Critical (Red)&lt;/code&gt; / &lt;code&gt;Elevated (Yellow)&lt;/code&gt; / &lt;code&gt;Stable (Green)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected Assets&lt;/td&gt;
&lt;td&gt;Relation&lt;/td&gt;
&lt;td&gt;Links to Logistics DB for relational integrity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Assessments&lt;/td&gt;
&lt;td&gt;Rich Text&lt;/td&gt;
&lt;td&gt;Threat summary from simulation engine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Global Assets &amp;amp; Logistics DB&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;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Asset Name&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Unique facility identifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coordinates&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;Latitude, Longitude (e.g., &lt;code&gt;1.2902, 103.8519&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risk Sensitivity&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;1-10 scale for prioritization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Active&lt;/code&gt; / &lt;code&gt;Inactive&lt;/code&gt; / &lt;code&gt;Maintenance&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Facility Type&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Distribution Hub&lt;/code&gt; / &lt;code&gt;Transport Node&lt;/code&gt; / &lt;code&gt;Data Center&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary Contact&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;On-site lead name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary Phone&lt;/td&gt;
&lt;td&gt;Phone&lt;/td&gt;
&lt;td&gt;Emergency contact number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary Email&lt;/td&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Escalation contact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Facility Manager&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;Responsible party&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last Audit&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Compliance tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What This Unlocks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-context-switching&lt;/strong&gt;: Operators see threats and assets in one Notion workspace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-assisted decisions&lt;/strong&gt;: AI proposes actions, humans approve&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relational data integrity&lt;/strong&gt;: Incidents automatically link to affected assets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time monitoring&lt;/strong&gt;: Continuous scanning with instant notification&lt;/li&gt;
&lt;/ul&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%2Fp4nc5ry3x9smlkquinsi.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%2Fp4nc5ry3x9smlkquinsi.png" alt="Deployment Overview"&gt;&lt;/a&gt;&lt;em&gt;[Technical Component Stack - Docker containers for MCP Server and Mock API]&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone and setup&lt;/span&gt;
git clone https://github.com/kanyingidickson-dev/valkyrie-mcp-server.git
&lt;span class="nb"&gt;cd &lt;/span&gt;valkyrie-mcp-server
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Configure Notion&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# Add your NOTION_TOKEN and database IDs&lt;/span&gt;

&lt;span class="c"&gt;# Seed assets&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; scripts/requirements.txt
python scripts/seed_assets.py

&lt;span class="c"&gt;# Run mock API&lt;/span&gt;
python mock-api/valkyrie_mock_api.py

&lt;span class="c"&gt;# Build and run MCP server&lt;/span&gt;
npm run build
npm start

&lt;span class="c"&gt;# Run a one-off scan:&lt;/span&gt;
node scripts/scan_and_stage.js

&lt;span class="c"&gt;# Optional scheduler:&lt;/span&gt;
node scripts/scheduler.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add 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;"valkyrie"&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;"node"&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;"/path/to/valkyrie-mcp-server/dist/index.js"&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;"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;"your-token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"DASHBOARD_DB_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;"your-dashboard-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"LOGISTICS_DB_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;"your-logistics-id"&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;h2&gt;
  
  
  Files of interest
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/index.ts&lt;/code&gt; — MCP server entry point and tool orchestration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/lib/assets.ts&lt;/code&gt; — Relational Asset Resolver implementation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/tools/analyze-threats.ts&lt;/code&gt; — Threat detection and incident staging&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mock-api/valkyrie_mock_api.py&lt;/code&gt; — FastAPI threat simulator&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/seed_assets.py&lt;/code&gt; — Populate Notion databases with sample assets&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/scan_and_stage.js&lt;/code&gt; — Batch scan + incident staging&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/trigger_and_stage.js&lt;/code&gt; — Single-target trigger + staging&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/scheduler.js&lt;/code&gt; — Periodic scan runner&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/notion_watcher.js&lt;/code&gt; — Notion status change listener&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/notify.js&lt;/code&gt; — Slack and email notifications&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/webhook_server.js&lt;/code&gt; — Action link handler for approvals&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The system is intentionally conservative: AI stages incidents as &lt;code&gt;Awaiting Approval&lt;/code&gt; for human review.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://github.com/kanyingidickson-dev/valkyrie-mcp-server" rel="noopener noreferrer"&gt;repo&lt;/a&gt; includes seeding and demo scripts to make the submission easy to reproduce.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://notion.so" rel="noopener noreferrer"&gt;Notion&lt;/a&gt; for the MCP SDK and API&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; for the integration framework&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to"&gt;DEV Community&lt;/a&gt; for the challenge platform&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Built for the Notion MCP Challenge 2026&lt;/strong&gt; 🚀&lt;/p&gt;

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