<?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: Ronald Alejandro Azuero Maldonado</title>
    <description>The latest articles on DEV Community by Ronald Alejandro Azuero Maldonado (@sherman95).</description>
    <link>https://dev.to/sherman95</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%2F3740343%2F49185674-0c9e-4611-b364-35474b0a2a94.png</url>
      <title>DEV Community: Ronald Alejandro Azuero Maldonado</title>
      <link>https://dev.to/sherman95</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sherman95"/>
    <language>en</language>
    <item>
      <title>🌌 The Equity Pulse: Turning Chaotic Code into an Interactive Constellation of Equality</title>
      <dc:creator>Ronald Alejandro Azuero Maldonado</dc:creator>
      <pubDate>Sat, 28 Mar 2026 14:33:18 +0000</pubDate>
      <link>https://dev.to/sherman95/the-equity-pulse-turning-chaotic-code-into-an-interactive-constellation-of-equality-58g4</link>
      <guid>https://dev.to/sherman95/the-equity-pulse-turning-chaotic-code-into-an-interactive-constellation-of-equality-58g4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Frontend Art&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Show us your Art
&lt;/h2&gt;

&lt;p&gt;Art is rarely static, and neither is the pursuit of equity. I wanted to build a living, breathing digital canvas—an experience that requires the user's active participation to find its final form. &lt;/p&gt;

&lt;p&gt;I present to you &lt;strong&gt;The Equity Pulse&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;For the best experience, please &lt;strong&gt;turn on your sound&lt;/strong&gt;, explore the canvas with your mouse, and don't be afraid to grab and drag the nodes once the system is aligned! &lt;em&gt;(If you are on a mobile device, you will also feel haptic feedback as you uncover the artwork).&lt;/em&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://Sherman95.github.io/wecoded-frontend-art/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;Sherman95.github.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Accessibility Note: If you have sensory sensitivities, please use the &lt;code&gt;Sparkles / Accessibility&lt;/code&gt; toggle in the top right corner to enable the Reduced Motion mode, which disables the parallax effects and pulsing animations.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;When I read the prompt for "Gender Equity in Tech," I didn't want to just draw a shattered glass ceiling. I wanted to build a representation of the &lt;em&gt;system&lt;/em&gt; itself. The tech industry often celebrates the myth of the "solitary male genius," while the profound, foundational contributions of women are pushed into the background. I wanted to bring those invisible threads to the forefront.&lt;/p&gt;

&lt;p&gt;My inspiration is broken down into four interactive acts within the art piece:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act I: The Fragmented Chaos&lt;/strong&gt;&lt;br&gt;
When you load the canvas, you are greeted with a simple, cinematic question: &lt;em&gt;"Technology changed the world. But who wrote the code?"&lt;/em&gt; Upon entering, the canvas is filled with floating, chaotic programming symbols (&lt;code&gt;{&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;). This represents the raw, historically fragmented state of our industry. Code without human alignment is just chaos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act II: The Catalyst (The Click)&lt;/strong&gt;&lt;br&gt;
Equity does not happen naturally in a state of rest. It requires an active catalyst—a conscious effort. When the user clicks the screen, a glassmorphic shockwave ripples across the void. The chaotic code melts into smooth nodes that mathematically align to form the &lt;strong&gt;"=" (Equals)&lt;/strong&gt; symbol. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act III: The Constellation of Collaboration&lt;/strong&gt;&lt;br&gt;
True equity is built on collaboration. Among the purple nodes of the equals sign, there are bright yellow ones. These represent the hidden history of tech. As the user hovers over them, a gamified &lt;em&gt;Gender Equity Index&lt;/em&gt; tracks their discovery, revealing the brilliant women and men who built our modern world together—from Margaret Hamilton's Apollo 11 software to Ada Lovelace's first algorithms. &lt;br&gt;
As each story is uncovered, a generative pentatonic chime echoes (via the Web Audio API), and laser-like SVG lines connect the nodes, proving that innovation is a literal constellation of shared human effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act IV: The Climax&lt;/strong&gt;&lt;br&gt;
When the user discovers all 8 historical collaborations, the system reaches 100% on the Equity Index. The entire equals symbol synchronizes, glowing with an intense cyan light, displaying the final message: &lt;em&gt;"Equity emerges through true collaboration."&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  My Code
&lt;/h2&gt;

&lt;p&gt;This art piece was built with a Senior-level approach to architecture, performance, and physics. &lt;/p&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/Sherman95" rel="noopener noreferrer"&gt;
        Sherman95
      &lt;/a&gt; / &lt;a href="https://github.com/Sherman95/wecoded-frontend-art" rel="noopener noreferrer"&gt;
        wecoded-frontend-art
      &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;🌌 The Equity Pulse&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;A gamified, interactive tech-art experience built for the &lt;strong&gt;&lt;a href="https://dev.to/challenges/wecoded-2026" rel="nofollow"&gt;2026 WeCoded Challenge&lt;/a&gt; (Frontend Art: Gender Equity)&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://Sherman95.github.io/wecoded-frontend-art/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/35c3637d731ea31341f8c0660a0919ba03f5d94f09ea4fa953152d03f55ecc14/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6976655f44656d6f2d506c61795f4e6f772d3232643365653f7374796c653d666f722d7468652d6261646765" alt="Live Demo"&gt;&lt;/a&gt;
&lt;a href="https://reactjs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/adcb96bef5b0c67d57d0f8b6a9ec4c84b282bf37c81dc768e5dc18ad8c55e0f1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31392e302d3631444146423f7374796c653d666c61742d737175617265266c6f676f3d7265616374" alt="React"&gt;&lt;/a&gt;
&lt;a href="https://vitejs.dev/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1832bda7d82c7fdb75fbbaae7dc0401d89741cc1caf604d64ce96746f350bd3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f566974652d382e302d3634364346463f7374796c653d666c61742d737175617265266c6f676f3d76697465" alt="Vite"&gt;&lt;/a&gt;
&lt;a href="https://tailwindcss.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d7d8f4c21206cb3567e4eee126f292f88e31de7fe84bb88c5104da2cdacd2ff0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461696c77696e645f76342d3338423241433f7374796c653d666c61742d737175617265266c6f676f3d7461696c77696e642d637373" alt="Tailwind CSS"&gt;&lt;/a&gt;
&lt;a href="https://www.framer.com/motion/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4e36ccf53443a1e3a9d6c7d766e1b9a4b61ae7063e63d03e0d854005110a47f4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4672616d65725f4d6f74696f6e2d626c61636b3f7374796c653d666c61742d737175617265266c6f676f3d6672616d6572" alt="Framer Motion"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎨 The Concept&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The Equity Pulse&lt;/strong&gt; represents gender equity not as a static painting, but as an interactive, dynamic system that requires human action to find alignment.&lt;/p&gt;
&lt;p&gt;It starts with a cinematic question: &lt;em&gt;"Technology changed the world. But who wrote the code?"&lt;/em&gt; Initially, the canvas is filled with chaotic programming symbols (&lt;code&gt;{&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;), representing the raw, fragmented state of the tech industry. When the user interacts with the system, the chaos melts into glowing nodes that align to form the &lt;strong&gt;"=" (equals)&lt;/strong&gt; symbol.&lt;/p&gt;
&lt;p&gt;This piece goes beyond visual art—it's a &lt;strong&gt;gamified discovery experience&lt;/strong&gt; honoring the historical collaborations between men and women that shaped modern technology.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Key Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cinematic &amp;amp; Narrative Progression:&lt;/strong&gt; An evolving story unfolds as you discover nodes, guided…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Sherman95/wecoded-frontend-art" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;The Tech &amp;amp; Engineering Behind the Art:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core Engine:&lt;/strong&gt; React 19 and Vite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physics &amp;amp; Kinematics:&lt;/strong&gt; Powered by &lt;strong&gt;Framer Motion&lt;/strong&gt;. I utilized complex spring physics to calculate the trajectory of the 60 particles. The &lt;code&gt;drag&lt;/code&gt; and &lt;code&gt;dragSnapToOrigin&lt;/code&gt; constraints allow users to physically grab the nodes and stretch them like rubber bands, adding a highly tactile feel to the art.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generative Audio &amp;amp; Haptics:&lt;/strong&gt; No external &lt;code&gt;.mp3&lt;/code&gt; files were used. The musical chimes are synthesized in real-time using the native &lt;code&gt;window.AudioContext&lt;/code&gt; oscillator. Mobile users experience tactile immersion via &lt;code&gt;navigator.vibrate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extreme Optimization:&lt;/strong&gt; 60 nodes constantly reacting to mouse parallax can destroy browser performance. I engineered the canvas for a buttery-smooth 60fps by wrapping the particles in &lt;code&gt;React.memo&lt;/code&gt;, throttling the mouse event listeners with &lt;code&gt;requestAnimationFrame&lt;/code&gt;, and utilizing &lt;code&gt;will-change: transform&lt;/code&gt; to force GPU hardware acceleration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aesthetics:&lt;/strong&gt; Tailwind CSS v4 handles the deep space background, glowing box-shadows, and the frosted Glassmorphism cards that display the historical text.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with passion and late-night coffee by Ronald Azuero.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;IT Student (7th Semester) at Universidad Técnica de Machala (UTMACH).&lt;/em&gt;&lt;br&gt;
&lt;em&gt;From Piñas, Ecuador 🇪🇨 to the world.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>devchallenge</category>
      <category>frontend</category>
      <category>css</category>
    </item>
    <item>
      <title>AI Founder OS — Turn Notion into a Multi-Agent Startup Command Center</title>
      <dc:creator>Ronald Alejandro Azuero Maldonado</dc:creator>
      <pubDate>Sat, 21 Mar 2026 20:43:13 +0000</pubDate>
      <link>https://dev.to/sherman95/from-notion-idea-graveyard-to-founder-os-run-plan-review-with-mcp-1gn</link>
      <guid>https://dev.to/sherman95/from-notion-idea-graveyard-to-founder-os-run-plan-review-with-mcp-1gn</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;Every founder has the same dirty little secret: a Notion database called "Startup Ideas" where dreams go to die.&lt;/p&gt;

&lt;p&gt;We get an idea. We write it down. But then comes the grueling part: opening 50 browser tabs to research competitors, mapping out feature matrices, digging through SaaS pricing pages, and trying to validate if the idea even makes sense. The paralysis of analysis hits hard. Instead of building, we drown in research.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;AI Founder OS&lt;/strong&gt; out of pure frustration. I wanted a system where I could drop a raw, messy idea into my Notion workspace, change a status property to &lt;code&gt;Run&lt;/code&gt;, and have an entire team of AI agents do the heavy lifting for me. &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%2Fjmirs5fmvqspoz9403lx.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%2Fjmirs5fmvqspoz9403lx.png" alt=" " width="800" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Powered by Gemini 2.5 Flash and Tavily, AI Founder OS orchestrates four distinct agents to produce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Competitive intelligence&lt;/strong&gt; — grounded on real web search evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product roadmap&lt;/strong&gt; — a prioritized feature plan with complexity ratings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketing strategy&lt;/strong&gt; — channel-specific campaigns and content ideas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viability scorecard&lt;/strong&gt; — a 0–100 mathematical score with risk flags and an executive summary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything writes back autonomously to structured Notion databases. No more "idea graveyards." It's a living, queryable startup command center.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(Plus, it's polyglot:&lt;/strong&gt; Write your idea in Spanish, French, or Japanese. The system auto-detects the script and returns all AI-generated research in that exact language).&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;(Agrega aquí el enlace a tu video de demostración en YouTube, Loom, o sube tu video directamente a DEV.to)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Show us the 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/Sherman95" rel="noopener noreferrer"&gt;
        Sherman95
      &lt;/a&gt; / &lt;a href="https://github.com/Sherman95/ai-founder-os" rel="noopener noreferrer"&gt;
        ai-founder-os
      &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;AI Founder OS - Notion Run Center Backend (v0.4.0 Agentic Run Audit)&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;AI Founder OS is a production-ready basic backend that uses Notion as UI + database + memory
The system polls a Notion database for startup ideas with Status &lt;code&gt;Run&lt;/code&gt; or &lt;code&gt;Queued&lt;/code&gt;, executes a multi-agent workflow, and writes outputs into Notion databases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Competitor Research&lt;/li&gt;
&lt;li&gt;Product Roadmap&lt;/li&gt;
&lt;li&gt;Marketing Strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Competitor research is grounded on real web search evidence (when enabled) and then structured by Gemini
The workflow now supports an auditable Run Center model in Notion with optional entities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Runs&lt;/li&gt;
&lt;li&gt;Evidence&lt;/li&gt;
&lt;li&gt;Claims&lt;/li&gt;
&lt;li&gt;Feature Matrix&lt;/li&gt;
&lt;li&gt;Competitor Scorecards&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also writes a startup viability score and executive summary back to the idea.&lt;/p&gt;
&lt;p&gt;This release includes MCP support in two directions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provider mode switch for Notion access: &lt;code&gt;NOTION_MODE=api|mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Founder OS MCP server exposing high-level tools (&lt;code&gt;founder.*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Human-in-the-loop corrections loop for output rows flagged in Notion&lt;/li&gt;
&lt;li&gt;Run operations: Retry, Replay and…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Sherman95/ai-founder-os" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  System Architecture &amp;amp; Flow
&lt;/h2&gt;

&lt;p&gt;To make this work seamlessly without building a custom frontend, I used Notion as both my Database layer and my UI layer.&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%2Fej1x4mlltvb7qw79re55.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%2Fej1x4mlltvb7qw79re55.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The System Flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Trigger:&lt;/strong&gt; The system polls the &lt;code&gt;Startup Ideas&lt;/code&gt; database for ideas entering the &lt;code&gt;Run&lt;/code&gt; state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analysis:&lt;/strong&gt; The &lt;em&gt;Idea Analyzer Agent&lt;/em&gt; extracts core concepts and detects the language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research:&lt;/strong&gt; The &lt;em&gt;Market Research Agent&lt;/em&gt; executes live web searches (via Tavily) to find competitors and actual market evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planning:&lt;/strong&gt; The &lt;em&gt;Product Planner Agent&lt;/em&gt; generates an actionable MVP roadmap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth:&lt;/strong&gt; The &lt;em&gt;Marketing Agent&lt;/em&gt; generates GTM campaigns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence:&lt;/strong&gt; The &lt;code&gt;notionWrites&lt;/code&gt; module idempotently upserts the formatted results into their respective Notion databases.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;When I started building this, the problem was getting the AI to interact with Notion securely and predictably. &lt;strong&gt;AI Founder OS integrates Notion MCP in two directions&lt;/strong&gt;, turning a simple workspace into a full-stack operating system:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. As an MCP Consumer
&lt;/h3&gt;

&lt;p&gt;Instead of wrestling with static API keys, the backend consumes the Notion MCP hosted endpoint (&lt;code&gt;NOTION_MODE=mcp&lt;/code&gt;) for OAuth-based access. It securely reads the "Startup Ideas" database, discovers properties dynamically, and injects the context directly into the AI pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. As an MCP Provider
&lt;/h3&gt;

&lt;p&gt;The Node.js backend exposes its own MCP server (supporting HTTP and &lt;code&gt;stdio&lt;/code&gt; transports for VS Code/Claude Desktop clients). This exposes 10 high-level JSON-RPC tools to any MCP environment. &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%2Ftk9z2no4xagcwwq4ypzv.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%2Ftk9z2no4xagcwwq4ypzv.png" alt=" " width="743" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Key tools include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;founder.inspect_schemas&lt;/code&gt;: Validates that your Notion databases have the required properties before execution.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;founder.run_idea&lt;/code&gt;: Executes the 4-agent multi-step pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;founder.claim_idea&lt;/code&gt;: Uses Notion properties as a distributed lock to prevent duplicate agent runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Magic: Human-in-the-Loop Corrections
&lt;/h3&gt;

&lt;p&gt;AI hallucinations happen. But because Notion is the UI, fixing them is seamless. &lt;br&gt;
If an agent hallucinates a competitor's feature:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I review the row directly in Notion.&lt;/li&gt;
&lt;li&gt;I check the &lt;code&gt;Needs Review&lt;/code&gt; checkbox and type my feedback in the &lt;code&gt;Correction Notes&lt;/code&gt; property (e.g., &lt;em&gt;"Actually, this competitor only offers this on the Enterprise plan"&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;I trigger the &lt;code&gt;founder.apply_corrections&lt;/code&gt; MCP tool.&lt;/li&gt;
&lt;li&gt;The system re-analyzes &lt;em&gt;only&lt;/em&gt; that specific row and safely updates Notion.&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%2F9azef5k6pq1tmkbntea5.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%2F9azef5k6pq1tmkbntea5.png" alt=" " width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The "WOW Mode": Absolute Traceability
&lt;/h3&gt;

&lt;p&gt;Any AI can generate text. But an enterprise-grade &lt;em&gt;Command Center&lt;/em&gt; needs traceability. By enabling &lt;code&gt;NOTION_UI_WOW_MODE=true&lt;/code&gt;, the system creates a forensic audit trail across 5 extra Notion databases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runs&lt;/strong&gt;: Execution logs, durations, and error tracking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence&lt;/strong&gt;: Raw web search results (URLs, domains, and AI confidence scores) proving &lt;em&gt;why&lt;/em&gt; the AI made a claim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claims&lt;/strong&gt;: Competitor marketing claims cross-referenced with the evidence to output verdicts (&lt;code&gt;supported&lt;/code&gt;, &lt;code&gt;unknown&lt;/code&gt;, &lt;code&gt;contradicts&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scorecards&lt;/strong&gt;: Mathematical viability scoring (0-100) penalizing hidden pricing or lack of traction.&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%2F2bq7z4cksaxzruw93ojf.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%2F2bq7z4cksaxzruw93ojf.png" alt=" " width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;By leveraging Notion MCP, I didn't just build an AI wrapper. I built a resilient, multi-agent operating system that lives entirely where founders already work: inside Notion.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>notionchallenge</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
    <item>
      <title>From Burned Sensors to Sunset Algorithms: My Full-Stack IoT Journey with Google Gemini</title>
      <dc:creator>Ronald Alejandro Azuero Maldonado</dc:creator>
      <pubDate>Sun, 01 Mar 2026 20:52:39 +0000</pubDate>
      <link>https://dev.to/sherman95/from-burned-sensors-to-sunset-algorithms-my-full-stack-iot-journey-with-google-gemini-5fae</link>
      <guid>https://dev.to/sherman95/from-burned-sensors-to-sunset-algorithms-my-full-stack-iot-journey-with-google-gemini-5fae</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I built (1) an ESP32 + Home Assistant IoT BMI kiosk and (2) a sunset prediction + analytics dashboard for an archaeological viewpoint in Ecuador. Google Gemini helped me across hardware wiring, ESPHome/Home Assistant configuration, and backend architecture.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;As an Information Technology university student from Piñas, Ecuador, my true passion lies far beyond writing software on a screen: &lt;strong&gt;I am absolutely fascinated by physical hardware.&lt;/strong&gt; I love getting my hands dirty with jumper wires, microcontrollers, and bringing the physical and digital worlds together.&lt;/p&gt;

&lt;p&gt;Throughout my university journey, I haven't just used Google Gemini as an autocomplete tool; I've used it as my Senior DevOps Engineer, Electronics Engineer, and Full-Stack Architect. To demonstrate this, I’m showcasing two of my most complex engineering projects—one rooted in raw hardware, the other in software algorithms—and how I plan to merge them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 1: The Hardware Hub — IoT BMI Diagnostic Station
&lt;/h3&gt;

&lt;p&gt;I built a smart, low-cost, and open-source automated health kiosk that measures weight and height, calculates Body Mass Index (BMI), and logs a historical record for multiple users.&lt;/p&gt;

&lt;p&gt;The architecture is highly integrated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Hardware Brain:&lt;/strong&gt; I used an ESP32 development board. Using ESPHome, I configured it to serve a dual purpose. First, it acts as a Bluetooth Low Energy (BLE) proxy to actively scan and intercept weight data from a Xiaomi Mi Smart Scale 2. Second, it reads distance from a JSN-SR04M ultrasonic sensor mounted on the ceiling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Logic Engine:&lt;/strong&gt; The ESP32 streams raw data locally to a Home Assistant OS server. I built custom Jinja2 template sensors to subtract the measured ultrasonic distance from the calibrated ceiling height to get the user's exact height. It then calculates the BMI and classifies the semantic result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Storage &amp;amp; UI:&lt;/strong&gt; The UI is a locked-down Kiosk tablet running a custom Home Assistant dashboard. Every measurement triggers an automated script that uses OAuth credentials to securely push a JSON payload directly into a Google Sheets database.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Project 2: The Software Brain — Yacuviña Sunset Predictor &amp;amp; Analytics
&lt;/h3&gt;

&lt;p&gt;Beyond health tech, I built &lt;strong&gt;&lt;a href="https://predictor-yacuvina.vercel.app/" rel="noopener noreferrer"&gt;Algorithm Yacuviña 3.0&lt;/a&gt;&lt;/strong&gt;, a specialized meteorological prediction system and analytics dashboard for a local archaeological viewpoint. It predicts whether visitors will experience a spectacular &lt;strong&gt;"Sea of Clouds"&lt;/strong&gt; or a &lt;strong&gt;"Clear Panoramic"&lt;/strong&gt; sunset.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Core Algorithm:&lt;/strong&gt; The backend concurrently fetches data from Open-Meteo, OpenWeather, and AccuWeather. It uses the &lt;code&gt;SunCalc&lt;/code&gt; library to pinpoint the exact local sunset time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Dual-Scoring Model:&lt;/strong&gt; It evaluates two distinct scenarios: the &lt;em&gt;Sea of Clouds&lt;/em&gt; model (weighting low cloud density and visibility) and the &lt;em&gt;Clear Sunset&lt;/em&gt; model (prioritizing total cloud cover and UV index).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Frontend &amp;amp; Analytics:&lt;/strong&gt; The client is a React/Vite app with a glassmorphism UI. The backend exposes JWT-protected analytics endpoints to track geo-distribution and unique API hits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Role Did Google Gemini Play?
&lt;/h3&gt;

&lt;p&gt;For the BMI Station, Gemini 2.5 Pro was my virtual electrical engineer. In fact, &lt;strong&gt;I explicitly cited Gemini as my official "AI Assistant"&lt;/strong&gt; in the project presentation document and technical paper submitted to my university. It mapped out my physical hardware, explained ESP32 GPIO pinouts, and generated the text prompts I used to render Fritzing-style schematic diagrams.&lt;/p&gt;

&lt;p&gt;For Yacuviña, Gemini helped architect my Node.js backend. It guided my JWT rotation logic, helped me design a caching strategy to avoid rate-limiting the weather APIs, and even helped me optimize the frontend CSS.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Transparency / Credits:&lt;/strong&gt; All system design, scoring logic, backend implementation, dashboards, and integrations were built by me. Weather inputs come from Open-Meteo, OpenWeather, and AccuWeather, and sunset timing is calculated using &lt;code&gt;SunCalc&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; Check out my deployed &lt;strong&gt;&lt;a href="https://predictor-yacuvina.vercel.app/" rel="noopener noreferrer"&gt;Yacuviña Sunset Predictor &amp;amp; Analytics Dashboard&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Yacuviña Screenshot (add yours here)
&lt;/h3&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%2Fmijfvyx8ugf5nswhtrdi.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%2Fmijfvyx8ugf5nswhtrdi.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  IoT BMI Diagnostic Station (screenshots from documentation)
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;(Note: Since my physical BMI setup is currently disassembled, here are real screenshots and diagrams from my project documentation.)&lt;/em&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%2F9p5wawqf1wl08a8b6xhb.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%2F9p5wawqf1wl08a8b6xhb.png" alt="IoT BMI Diagnostic Station dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The BMI Station in Action:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;(Here is the physical IoT BMI kiosk scanning and calculating in real-time.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

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

&lt;p&gt;This journey was a masterclass in the collision between perfect software logic and chaotic physical realities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Deep Dives
&lt;/h3&gt;

&lt;p&gt;Connecting the ESP32 to the Xiaomi scale wasn't plug-and-play. I had to learn how to turn the ESP32 into a BLE "radar" (a Bluetooth scanner) to sniff out the exact MAC address of the scale amidst the wireless noise.&lt;/p&gt;

&lt;p&gt;For Yacuviña, I learned how to handle asynchronous data streams in Node.js using &lt;code&gt;Promise.allSettled&lt;/code&gt;, ensuring my dashboard didn't crash if one of the weather APIs timed out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unexpected Lessons (The Magic Smoke)
&lt;/h3&gt;

&lt;p&gt;Software forgives; hardware absolutely does not.&lt;/p&gt;

&lt;p&gt;Gemini correctly taught me that the JSN-SR04M ultrasonic sensor outputs a 5V signal, which would instantly fry the ESP32's 3.3V GPIO pin. It taught me how to build a voltage divider circuit using two 1kΩ resistors to safely step down the voltage.&lt;/p&gt;

&lt;p&gt;However, I was using old, cheap jumper wires that were internally broken. Frustrated by the lack of sensor readings in Home Assistant, I started blindly unplugging and plugging the wires directly into the breadboard. In my haste, I mixed up the positive and negative wires. &lt;em&gt;Kaboom.&lt;/em&gt; A puff of magic smoke, and the 5V sensor was dead.&lt;/p&gt;

&lt;p&gt;It taught me that while AI can provide perfect pinouts, it cannot fix your faulty cables or save you from a reversed polarity mistake. Measure twice, plug once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;p&gt;Having Gemini 2.5 Pro (and now 3.1 Pro) by my side has been like having a Senior IoT and DevOps Engineer on call 24/7.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Worked Flawlessly
&lt;/h3&gt;

&lt;p&gt;Gemini is an absolute beast when it comes to infrastructure syntax. Writing the script to authenticate Home Assistant with the Google Cloud OAuth API requires incredibly specific JSON/YAML structures—Gemini generated the exact formatting on the first try.&lt;/p&gt;

&lt;p&gt;In the Yacuviña project, it also helped me generate the logic to dynamically switch between the &lt;em&gt;Sea of Clouds&lt;/em&gt; and &lt;em&gt;Clear Sky&lt;/em&gt; algorithms based on cloud strata percentages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where I Ran Into Friction
&lt;/h3&gt;

&lt;p&gt;LLMs often assume errors lie entirely within the code logic, completely missing the physical constraints of the real world.&lt;/p&gt;

&lt;p&gt;Before my ultrasonic sensor exploded, my ESP32 was returning null distance values. Gemini kept suggesting software fixes like: &lt;em&gt;"Increase the update_interval," "modify the median filters," "check the firmware buffer size."&lt;/em&gt; It took me a fried sensor to realize the code was perfect—my broken jumper wires were the culprit.&lt;/p&gt;

&lt;p&gt;I had to learn a completely new way of prompting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Assuming the YAML code is 100% correct, what physical hardware, breadboard wiring, or voltage issues could cause this specific sensor reading to fail?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once I established strict physical boundaries in my prompts, Gemini transformed from a generic code generator into an outstanding hardware debugger.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beyond These Projects: My Long-Term AI Co-Pilot
&lt;/h3&gt;

&lt;p&gt;While these two projects are my proudest achievements, the truth is that Gemini has been my co-pilot throughout my entire university degree. Our history together goes way beyond Home Assistant and React.&lt;/p&gt;

&lt;p&gt;Gemini was there when I had to configure a 4-node Big Data cluster using Apache Spark, Hadoop, and Jupyter. It helped me survive setting up an Oracle 19c database on Linux, configuring &lt;code&gt;firewalld&lt;/code&gt; rules, proxies, and webmail servers. When I went down the rabbit hole of distro-hopping between Linux Mint, CachyOS, and Ubuntu, Gemini helped me rescue my Windows bootloader.&lt;/p&gt;

&lt;p&gt;We’ve built point-of-sale systems ("pos-carmita-villegas"), tackled a road alert app for Ecuador deployed on Vercel ("Vialert EC"), and even developed "DevFlow," a custom CLI wrapper for GitHub Copilot CLI. From troubleshooting IPv6 dual-stack RIPng networks in Cisco Packet Tracer to diagnosing the sickest hardware bugs, Gemini hasn't just been an API I call for code snippets—it has been the mentor that taught me how to become a full-stack, DevOps, and IoT engineer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Looking Forward: Bridging the Gap
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;My ultimate goal is to merge my hardware passion with my software algorithms.&lt;/strong&gt; If I win the &lt;strong&gt;Raspberry Pi AI Kit&lt;/strong&gt; in this challenge, my plan is to build a physical edge-computing weather station and deploy it directly at the Yacuviña archaeological viewpoint.&lt;/p&gt;

&lt;p&gt;Instead of pulling generic data from web APIs, I will wire real humidity, barometric, and temperature sensors to the Raspberry Pi. I will run Algorithm 3.0 locally on the Pi, utilizing its edge AI capabilities to process hyper-local data in real-time.&lt;/p&gt;

&lt;p&gt;If you try the predictor, I’d love your feedback—especially ideas on what sensors or edge features would make the next version even better.&lt;/p&gt;

&lt;p&gt;Hardware is hard, and software is complex. But with a soldering iron in one hand, a keyboard in the other, and Google Gemini guiding the architecture, there is no limit to what we can build.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
      <category>iot</category>
    </item>
    <item>
      <title>UTMACH Rides -- I Built a Carpooling App So My Classmates Stop Paying $3 for a 10-Minute Ride</title>
      <dc:creator>Ronald Alejandro Azuero Maldonado</dc:creator>
      <pubDate>Sat, 28 Feb 2026 19:57:48 +0000</pubDate>
      <link>https://dev.to/sherman95/utmach-rides-i-built-a-carpooling-app-so-my-classmates-stop-paying-3-for-a-10-minute-ride-162p</link>
      <guid>https://dev.to/sherman95/utmach-rides-i-built-a-carpooling-app-so-my-classmates-stop-paying-3-for-a-10-minute-ride-162p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;I'm an 8th-semester &lt;strong&gt;Information Technology&lt;/strong&gt; student at the &lt;strong&gt;Facultad de Ingenieria Civil, Universidad Tecnica de Machala (UTMACH)&lt;/strong&gt; in El Oro province, Ecuador. I live in &lt;strong&gt;Pinas&lt;/strong&gt; -- a small town up in the highlands, about 1.5 hours from campus by road. Every single day I make that commute, and so do &lt;strong&gt;14,000+ students&lt;/strong&gt; spread across &lt;strong&gt;5 campuses&lt;/strong&gt; and &lt;strong&gt;14 different cantons&lt;/strong&gt; -- Pasaje, Santa Rosa, Zaruma, El Guabo, Huaquillas, and more.&lt;/p&gt;

&lt;p&gt;Here's the problem: there is &lt;strong&gt;no public transit system&lt;/strong&gt; connecting most of these towns to the campuses. Students either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pay &lt;strong&gt;$2-3 each way&lt;/strong&gt; for informal taxi/bus rides (on a student budget, that's $20-30/week gone)&lt;/li&gt;
&lt;li&gt;Stand on the highway hoping to catch a shared pickup truck&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skip class entirely&lt;/strong&gt; when they can't afford the ride&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But cost isn't even the scariest part. &lt;strong&gt;Security is a real, daily concern.&lt;/strong&gt; Ecuador has been going through one of the worst spikes in violent crime in its history. As CS/IT students, &lt;strong&gt;we carry our laptops every single day&lt;/strong&gt;. Taking public transport or flagging random rides on the highway means you're a visible target -- alone, with expensive gear, on a predictable route. Students at UTMACH have been robbed. This isn't hypothetical. It's why some of us travel in groups or avoid certain bus routes altogether.&lt;/p&gt;

&lt;p&gt;That's why riding with &lt;strong&gt;people you can verify are from your own university&lt;/strong&gt; matters so much. It's not just convenience -- &lt;strong&gt;it's a layer of safety&lt;/strong&gt;. And that's the core reason UTMACH Rides &lt;strong&gt;only allows &lt;code&gt;@utmachala.edu.ec&lt;/code&gt; emails&lt;/strong&gt;: if you're in the app, you're a verified UTMACH student. You know the person you're riding with is your classmate, not a stranger.&lt;/p&gt;

&lt;p&gt;Carpooling already happens organically -- students coordinate via chaotic WhatsApp groups where messages get buried in minutes. There's no structure, no way to search by route or time, and no way to verify that the person offering a ride is actually a UTMACH student.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;UTMACH Rides&lt;/strong&gt; to fix all of that.&lt;/p&gt;

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

&lt;p&gt;UTMACH Rides is a &lt;strong&gt;mobile-first PWA&lt;/strong&gt; (Progressive Web App) that lets verified UTMACH students publish, find, request, and review shared rides between the 14 cantons of El Oro and the 5 university campuses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key flows
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sign up with your &lt;code&gt;@utmachala.edu.ec&lt;/code&gt; email&lt;/strong&gt; -- this is the only way in. No institutional email, no access. Every user is a real, verified UTMACH student.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2-step onboarding&lt;/strong&gt; -- After email verification, a guided form collects: full name, Ecuadorian cedula (validated with the official modulo-10 algorithm), faculty (5 UTMACH faculties), career (40+ programs), and WhatsApp number. Duplicate cedula detection prevents multi-accounting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Publish a ride&lt;/strong&gt; -- Pick a direction (going to campus or heading home), select your campus, your canton, departure time, available seats, and a price contribution ($0-$50). The bidirectional flow automatically handles origin/destination based on your selection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Find a ride&lt;/strong&gt; -- The feed shows all active rides with future departure times, filterable by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direction: &lt;em&gt;Ir a la U&lt;/em&gt; (going to campus) / &lt;em&gt;Volver&lt;/em&gt; (heading home)&lt;/li&gt;
&lt;li&gt;Specific campus (Matriz, 10 de Agosto, El Cambio, Arenillas, Pinas)&lt;/li&gt;
&lt;li&gt;Canton of origin/destination&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each trip card shows driver name, rating, total completed trips (InDrive-style), vehicle info, price, and available seats.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Me apunto" trip request system&lt;/strong&gt; -- Passengers tap "Me apunto" (I'm in) to request a seat. The driver sees all requests with passenger info (name, career, rating) and has &lt;strong&gt;3 actions for each pending request&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp&lt;/strong&gt; -- verify with a pre-filled message: &lt;em&gt;"Puedes confirmar que si vas?"&lt;/em&gt; (before accepting)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accept&lt;/strong&gt; -- confirms the seat, decrements availability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reject&lt;/strong&gt; -- declines the request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After accepting, the driver gets a different WhatsApp link for coordination: &lt;em&gt;"Acepte tu solicitud, coordinamos punto de encuentro?"&lt;/em&gt;. Drivers can also &lt;strong&gt;revoke&lt;/strong&gt; an accepted passenger if plans change (seat is re-incremented). A &lt;strong&gt;red badge&lt;/strong&gt; on the trip card shows how many pending requests are waiting.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Passenger self-service&lt;/strong&gt; -- Passengers can cancel their own request at any time. If they were already accepted, canceling returns the seat to the pool. No more being stuck waiting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mutual rating system&lt;/strong&gt; -- After a trip is completed, both driver and passenger can rate each other with 1-5 stars (Malo / Regular / Bien / Muy bien / Excelente) plus an optional comment. Ratings are bidirectional: the driver rates each accepted passenger, and each passenger rates the driver. A database trigger auto-computes average ratings. Duplicate rating detection prevents abuse.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-cleanup on completion&lt;/strong&gt; -- When the driver marks a trip as completed or cancelled, all remaining pending requests are automatically rejected. No ghost requests lingering.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manage your vehicles&lt;/strong&gt; -- Add, edit, delete vehicles with brand, model, color, and plate. Can't delete a vehicle that has active trips.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edit or cancel trips&lt;/strong&gt; -- Inline editing with validation. Mark trips as completed when you arrive.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What makes it different from generic carpooling apps
&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;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Institutional email gate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@utmachala.edu.ec&lt;/code&gt; only -- safety through verified identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cedula verification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ecuadorian ID validated with modulo-10 algorithm, duplicate detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Academic profile&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Faculty + career displayed on requests -- you know who's riding with you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real geography&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;14 actual cantons of El Oro + 5 real UTMACH campuses with addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Me apunto" request flow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verify via WhatsApp first, then accept -- no blind seat assignments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mutual ratings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Both driver and passenger rate each other, InDrive-style trust building&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WhatsApp-native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pre-filled messages for both verification and coordination phases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bidirectional routing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"To campus" vs "heading home" automatically swaps origin/destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;USD amounts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ecuador uses US dollars; students share $0.50-$2.00 for gas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security by design&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Server-side middleware, CSP headers, input validation, cookie-based auth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;h3&gt;
  
  
  Video Walkthrough
&lt;/h3&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Full demo: signup -&amp;gt; onboarding (cedula + faculty) -&amp;gt; dashboard -&amp;gt; filter rides -&amp;gt; "Me apunto" -&amp;gt; driver accepts via WhatsApp -&amp;gt; rate after trip -&amp;gt; profile stats.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  User Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@utmachala.edu.ec signup
        |
        v
  Email verification
        |
        v
  2-step onboarding
  [Name + Cedula] -&amp;gt; [Faculty + Career + WhatsApp]
        |
        v
   +----+----+
   |         |
   v         v
 DRIVER    PASSENGER
   |         |
   v         v
Publish    Browse feed
 ride      (filter by direction/campus/canton)
   |         |
   v         v
Receive    Tap "Me apunto"
requests       |
   |           v
   +-----&amp;lt;-----+
   |
   v
3 actions per request:
  [WhatsApp: verify] [Accept] [Reject]
        |
        v
   Accepted? -&amp;gt; WhatsApp: coordinate pickup
        |
        v
   Trip happens
        |
        v
   Driver marks "Completado"
   (pending requests auto-rejected)
        |
        v
   Mutual rating
   Driver &amp;lt;-&amp;gt; Passenger (1-5 stars + comment)
        |
        v
   Stats updated (avg rating, total trips)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Live App
&lt;/h3&gt;

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

&lt;p&gt;&lt;strong&gt;Demo credentials&lt;/strong&gt; (pre-seeded account for judges):&lt;br&gt;
| | |&lt;br&gt;
|---|---|&lt;br&gt;
| Email | &lt;code&gt;demo@utmachala.edu.ec&lt;/code&gt; |&lt;br&gt;
| Password | &lt;code&gt;DemoRides2026!&lt;/code&gt; |&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The demo account has a complete profile (cedula, career, faculty), a vehicle, and sample trips pre-loaded. You can publish trips, request seats on other trips, rate passengers, manage vehicles, and test the full flow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Landing page -- institutional email gate with glass morphism UI:&lt;/strong&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%2Fdf0z0gi3qhwhm692a56d.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%2Fdf0z0gi3qhwhm692a56d.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboard -- trip feed with direction and campus filters:&lt;/strong&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%2Fbgc9k7on5yhh03w41cxb.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%2Fbgc9k7on5yhh03w41cxb.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New trip -- bidirectional campus/canton selector with smart validation:&lt;/strong&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%2F5py9xp8t736jvlwaravo.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%2F5py9xp8t736jvlwaravo.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trip card -- driver info, rating, trip count, vehicle, price, seats, and "Me apunto" button:&lt;/strong&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%2Fhgp71hrp4reb42tx6lbf.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%2Fhgp71hrp4reb42tx6lbf.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Profile -- 3-column stats (trips/rating/published), academic info, vehicle editor, trip history:&lt;/strong&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%2F39trwudm1hxm5p3swjeb.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%2F39trwudm1hxm5p3swjeb.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Onboarding -- 2-step form: cedula + name, then faculty/career + WhatsApp:&lt;/strong&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%2F939rpk7x0810ejfj9i6o.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%2F939rpk7x0810ejfj9i6o.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&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/Sherman95" rel="noopener noreferrer"&gt;
        Sherman95
      &lt;/a&gt; / &lt;a href="https://github.com/Sherman95/UTMACH-RIDES" rel="noopener noreferrer"&gt;
        UTMACH-RIDES
      &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;UTMACH Rides&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;University carpooling platform for &lt;strong&gt;14,000+ students&lt;/strong&gt; at &lt;strong&gt;Universidad Tecnica de Machala (UTMACH)&lt;/strong&gt; in El Oro, Ecuador.&lt;/p&gt;

&lt;p&gt;Students share rides between &lt;strong&gt;14 cantons&lt;/strong&gt; of El Oro province and &lt;strong&gt;5 UTMACH campuses&lt;/strong&gt;, with identity verification, trip requests, WhatsApp coordination, and mutual ratings. Only &lt;code&gt;@utmachala.edu.ec&lt;/code&gt; emails allowed.&lt;/p&gt;

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




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tech Stack&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Next.js (App Router, Turbopack)&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;16.1.6&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;UI Library&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;19.2.3&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;TypeScript (strict mode)&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;5.x&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Tailwind CSS v4 + PostCSS&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;4.x&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Auth &amp;amp; Database&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Supabase (Auth + PostgreSQL + RLS)&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;2.98.0&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;SSR Auth&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;@supabase/ssr (cookie-based sessions)&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;0.8.0&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Icons&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;lucide-react&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;0.575.0&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Animations&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;canvas-confetti (dynamic import)&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;1.9.4&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Vercel (auto-deploy on push)&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;br&gt;
&lt;/p&gt;


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Identity &amp;amp; Onboarding&lt;/h3&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Institutional email gate&lt;/strong&gt; -- only &lt;code&gt;@utmachala.edu.ec&lt;/code&gt; can register&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2-step onboarding&lt;/strong&gt; -- Step 1: full name + cedula (Ecuadorian ID validated with modulo-10 algorithm, duplicate detection). Step 2: faculty (5 UTMACH faculties) + career (40+ programs) + WhatsApp number&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middleware-enforced completeness&lt;/strong&gt; --…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Sherman95/UTMACH-RIDES" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&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;app/
  (main)/                  # Protected routes (middleware-guarded)
    dashboard/             # Trip feed + stats + filters
    profile/               # User info + vehicles + trip history + passenger trips
    rides/new/             # Publish a ride form
  auth/callback/           # Email verification handler
  onboarding/              # 2-step profile setup (cedula, faculty, career)
components/
  trips/
    TripFeed.tsx           # Main feed with direction/campus/canton filters
    TripCard.tsx           # Individual card with driver stats + "Me apunto"
    TripRequestButton.tsx  # Passenger: request/cancel seat
    TripRequests.tsx       # Driver: manage requests (verify/accept/reject/revoke)
    RateButton.tsx         # 5-star inline rating with optional comment
    CompletedPassengers.tsx # Driver rates passengers after trip
    MyPassengerTrips.tsx   # Passenger trip history with status badges
    MyTrips.tsx            # Driver's published trips with edit/complete/cancel
  vehicles/
    VehicleManager.tsx     # Inline CRUD for vehicles
lib/
  auth-context.tsx         # AuthProvider + useAuth() hook
  supabase.ts              # Typed browser client (cookie-based)
  supabase-middleware.ts   # Server client for middleware
  constants.ts             # Cantons, campuses, faculties, careers, validators
middleware.ts              # Server-side route protection + profile completeness
types/database.ts          # Full Database generic for Supabase (6 tables)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Next.js 16.1.6&lt;/strong&gt; (App Router + Turbopack)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;React 19&lt;/strong&gt; + &lt;strong&gt;Tailwind CSS v4&lt;/strong&gt; + &lt;strong&gt;lucide-react&lt;/strong&gt; icons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth &amp;amp; DB&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; (Auth + PostgreSQL + Row Level Security)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSR Auth&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;@supabase/ssr&lt;/strong&gt; -- cookie-based sessions shared between browser and middleware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PWA&lt;/td&gt;
&lt;td&gt;Web manifest + dynamic icon generation via OG &lt;code&gt;ImageResponse&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effects&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;canvas-confetti&lt;/strong&gt; (dynamically imported on trip creation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; (auto-deploy on push)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Architecture decisions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cookie-based auth, not localStorage.&lt;/strong&gt; The browser client uses &lt;code&gt;createBrowserClient&lt;/code&gt; from &lt;code&gt;@supabase/ssr&lt;/code&gt; so auth tokens live in cookies. The server middleware uses &lt;code&gt;createServerClient&lt;/code&gt; reading those same cookies. This means the middleware validates sessions server-side with &lt;code&gt;getUser()&lt;/code&gt; (which hits Supabase's auth server) instead of the deprecated &lt;code&gt;getSession()&lt;/code&gt; (which only reads the cached JWT and can be spoofed).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server-side route protection via middleware.&lt;/strong&gt; Protected routes (&lt;code&gt;/dashboard&lt;/code&gt;, &lt;code&gt;/profile&lt;/code&gt;, &lt;code&gt;/rides&lt;/code&gt;) redirect to &lt;code&gt;/&lt;/code&gt; if no valid session exists. The landing page redirects authenticated users to &lt;code&gt;/dashboard&lt;/code&gt; or &lt;code&gt;/onboarding&lt;/code&gt; depending on profile completeness (name + cedula + career + faculty + WhatsApp). All validated server-side before a single React component renders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AuthProvider + useAuth() hook.&lt;/strong&gt; A React context wraps the entire app. It calls &lt;code&gt;getUser()&lt;/code&gt; on mount, listens to &lt;code&gt;onAuthStateChange&lt;/code&gt; for login/logout/token refresh events, and exposes &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;profile&lt;/code&gt;, &lt;code&gt;loading&lt;/code&gt;, and &lt;code&gt;refreshProfile()&lt;/code&gt;. Every component consumes auth state from this single source -- no more scattered &lt;code&gt;getSession()&lt;/code&gt; calls duplicated across files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typed Supabase client.&lt;/strong&gt; The &lt;code&gt;Database&lt;/code&gt; generic type maps every table's &lt;code&gt;Row&lt;/code&gt;, &lt;code&gt;Insert&lt;/code&gt;, and &lt;code&gt;Update&lt;/code&gt; shapes across 6 tables (users, vehicles, trips, bookings, trip_requests, ratings). This gives full autocomplete and compile-time type-checking on every &lt;code&gt;.from('trips').update({...})&lt;/code&gt; call. Had to use &lt;code&gt;type&lt;/code&gt; aliases instead of &lt;code&gt;interface&lt;/code&gt; because TypeScript interfaces don't produce implicit index signatures, which breaks Supabase's internal &lt;code&gt;extends Record&amp;lt;string, unknown&amp;gt;&lt;/code&gt; constraint resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ecuadorian cedula validation.&lt;/strong&gt; The onboarding form validates cedula numbers using Ecuador's official modulo-10 algorithm -- checking province code (01-24), computing the verification digit with alternating multipliers (2,1,2,1...), and rejecting invalid numbers client-side. Combined with server-side duplicate detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trip request lifecycle.&lt;/strong&gt; The "Me apunto" system implements a full state machine: &lt;code&gt;none -&amp;gt; pending -&amp;gt; accepted/rejected&lt;/code&gt;, with the driver controlling transitions. Seat counts are managed atomically on accept (decrement) and revoke/cancel (re-increment). Drivers verify passengers via WhatsApp before accepting. Auto-rejection of pending requests on trip completion prevents orphaned state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bidirectional rating with DB triggers.&lt;/strong&gt; Both driver and passenger rate each other after trip completion. A PostgreSQL trigger (&lt;code&gt;update_user_rating&lt;/code&gt;) auto-computes &lt;code&gt;average_rating&lt;/code&gt; and &lt;code&gt;total_ratings&lt;/code&gt; on the users table whenever a new rating is inserted. A separate trigger (&lt;code&gt;update_user_trips&lt;/code&gt;) increments &lt;code&gt;total_trips&lt;/code&gt; when a trip is marked as completed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security headers on every response.&lt;/strong&gt; &lt;code&gt;next.config.ts&lt;/code&gt; injects &lt;code&gt;Content-Security-Policy&lt;/code&gt;, &lt;code&gt;X-Frame-Options: DENY&lt;/code&gt;, &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;, &lt;code&gt;Referrer-Policy: strict-origin-when-cross-origin&lt;/code&gt;, and &lt;code&gt;Permissions-Policy&lt;/code&gt; (disabling camera, microphone, geolocation access).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input validation everywhere.&lt;/strong&gt; Cedula validated with modulo-10. WhatsApp numbers validated with &lt;code&gt;/^(09\d{8}|\+?593\d{9})$/&lt;/code&gt; (Ecuadorian mobile format). Names validated as 2+ words, letters only, 3-100 chars. Prices capped at $50. Origin != destination enforced. Departure must be in the future. Rating comments capped at 200 chars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error boundaries on every route.&lt;/strong&gt; Each route segment under &lt;code&gt;(main)/&lt;/code&gt; has its own &lt;code&gt;error.tsx&lt;/code&gt; (with a retry button and console error logging) and &lt;code&gt;loading.tsx&lt;/code&gt; (shimmer skeletons that match the actual page layout). Component-level data fetches are all wrapped in &lt;code&gt;try/catch&lt;/code&gt; with &lt;code&gt;fetchError&lt;/code&gt; state and retry UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lazy loading for non-critical components.&lt;/strong&gt; Vehicle manager, trip history, and passenger trips on the profile page are loaded via &lt;code&gt;next/dynamic&lt;/code&gt; so the initial JS bundle stays lean. Trip cards use &lt;code&gt;React.memo&lt;/code&gt; to avoid re-renders. Confetti is dynamically imported only on successful trip creation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Database schema (Supabase PostgreSQL)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;users               vehicles         trips                trip_requests       ratings
├── id (uuid)       ├── id (uuid)    ├── id (uuid)        ├── id (uuid)       ├── id (uuid)
├── email           ├── driver_id -&amp;gt;  ├── driver_id -&amp;gt;      ├── trip_id -&amp;gt;       ├── trip_id -&amp;gt;
├── full_name       ├── brand        ├── vehicle_id -&amp;gt;     ├── passenger_id -&amp;gt;  ├── from_user_id -&amp;gt;
├── cedula          ├── model        ├── origin            ├── status           ├── to_user_id -&amp;gt;
├── carrera         ├── color        ├── destination       │   (pending/        ├── score (1-5)
├── facultad        └── plate        ├── departure_time    │    accepted/       ├── comment
├── whatsapp                         ├── seats_available   │    rejected)       └── created_at
├── average_rating                   ├── price_contribution└── created_at
├── total_ratings                    └── status
├── total_trips                          (active/completed/cancelled)
└── created_at
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;All 6 tables protected with &lt;strong&gt;Row Level Security&lt;/strong&gt; policies. Users can only read/update their own profile, manage their own vehicles, create/edit/cancel their own trips. Passengers can create/read/delete their own trip requests. Drivers can read/update requests for their trips. All users can read active trips (the public feed) and read ratings.&lt;/p&gt;
&lt;h3&gt;
  
  
  What I'd add next
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Push notifications&lt;/strong&gt; when someone requests your ride&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time feed&lt;/strong&gt; via Supabase Realtime subscriptions (live trip updates without refresh)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route map&lt;/strong&gt; -- static SVG of El Oro showing active canton-to-campus routes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recurring trips&lt;/strong&gt; -- "Every Mon/Wed at 7am" instead of creating each one manually&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin dashboard&lt;/strong&gt; with usage analytics and trip heatmaps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RLS migration files&lt;/strong&gt; committed to the repo (currently policies live only in Supabase dashboard)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Built with real frustration from standing on the Panamericana highway at 6 AM, laptop in my backpack, hoping someone from Pinas has an empty seat heading to campus. The app is in Spanish because that's what my community speaks, but the codebase and documentation are fully in English.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;8th semester, Information Technology -- Facultad de Ingenieria Civil, UTMACH.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;El Oro, Ecuador -- 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Silent Triage: The Zero-Chat War Room Protocol (Algolia Agent Studio Challenge)</title>
      <dc:creator>Ronald Alejandro Azuero Maldonado</dc:creator>
      <pubDate>Sun, 08 Feb 2026 04:02:26 +0000</pubDate>
      <link>https://dev.to/sherman95/silent-triage-the-zero-chat-war-room-protocol-algolia-agent-studio-challenge-2nkf</link>
      <guid>https://dev.to/sherman95/silent-triage-the-zero-chat-war-room-protocol-algolia-agent-studio-challenge-2nkf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Downtime costs an average of $9,000 per minute. In a 3 AM production crisis, you don't need a conversation. You need a deterministic decision."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💡 The Inspiration: Beyond the Chatbot
&lt;/h2&gt;

&lt;p&gt;Every SRE knows the "Alert Fatigue." When a P0 incident hits, every second counts. Traditional AI assistants are too conversational—they waste time with greetings and "How can I help you today?".&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Silent Triage&lt;/strong&gt; to implement the &lt;strong&gt;Zero-Chat Protocol&lt;/strong&gt;: a high-speed, RAG-driven interface that turns raw, messy logs into actionable fixes without the small talk.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛡️ What is Silent Triage?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Silent Triage&lt;/strong&gt; is a specialized Incident Response agent that acts as a digital first responder.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Analyzes messy logs&lt;/strong&gt;: Paste raw stack traces or alerts directly.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Classifies Severity&lt;/strong&gt;: Automatically detects if an issue is P0 (Critical) or P3 (Minor).&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Retrieves Ground Truth&lt;/strong&gt;: Uses Algolia to search for past incident resolutions.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Prescribes Action&lt;/strong&gt;: Delivers a structured JSON-based remediation plan.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎥 Watch the 90-second Demo
&lt;/h2&gt;

&lt;p&gt;See how the agent identifies a &lt;strong&gt;Database Connection Timeout&lt;/strong&gt; and suggests a fix based on historical data.&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Technical Architecture: The "Ground Truth" Engine
&lt;/h2&gt;

&lt;p&gt;The system is built on a high-performance &lt;strong&gt;RAG (Retrieval-Augmented Generation)&lt;/strong&gt; stack using &lt;strong&gt;Algolia Agent Studio&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  1️⃣ The Memory: Algolia Search Index
&lt;/h3&gt;

&lt;p&gt;I populated an Algolia index named &lt;code&gt;incident_history&lt;/code&gt; with structured data from past production failures. This ensures the agent's logic is grounded in reality, not hallucinations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Knowledge Base (&lt;code&gt;incident_history.json&lt;/code&gt;):&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"objectID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inc-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Database Connection Timeout - Production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Error: SequelizeConnectionError: connect ETIMEDOUT. The database cluster is not responding to heartbeat checks."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"P0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Database connection pool exhausted due to unclosed connections."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Restart the primary database node and increase the max_connections limit in RDS."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tags"&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;"database"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"critical"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"backend"&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;"objectID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inc-002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Slow Page Loads - Frontend Assets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Users reporting 5+ seconds to load the dashboard. Static assets (JS/CSS) are taking too long to download."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"P2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CDN cache invalidation failed after the last deploy."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Purge CloudFront cache and verify S3 bucket permissions."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tags"&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;"frontend"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"performance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cdn"&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;"objectID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inc-003"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Failed User Registration - API 500"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST /api/v1/register returning 500 Internal Server Error. Log: null pointer exception at UserService.java:45."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"P1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Missing validation for null email addresses in the legacy registration flow."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rollback to the previous stable build (v1.2.4) and add null-check in the UserService."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tags"&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;"api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"java"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"500-error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth"&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;"objectID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inc-004"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Broken Images in Product Catalog"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Images not rendering in the mobile app. Getting 403 Forbidden when fetching from the media server."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"P3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Expired SSL certificate on the media subdomain."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Renew the Let's Encrypt certificate via Certbot."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tags"&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;"images"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ssl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minor"&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;&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%2Fmm2pbr4kpehj8jcmsf0k.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%2Fmm2pbr4kpehj8jcmsf0k.png" alt="Algolia incident_history index dashboard showing 4 production incidents with severity levels and tags"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2️⃣ The Brain: Algolia Agent Studio
&lt;/h3&gt;

&lt;p&gt;I used &lt;strong&gt;Agent Studio&lt;/strong&gt; to orchestrate the intelligence layer. By connecting the &lt;code&gt;incident_history&lt;/code&gt; index as a &lt;strong&gt;Search Tool&lt;/strong&gt;, the agent "researches" historical data before formulating a response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Configuration &amp;amp; System Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Role: Professional SRE &amp;amp; DevOps Incident Triage Expert.
Objective: Analyze the user's error/incident report, SEARCH the 'incident_history' index for context, and provide a structured JSON decision.

Context: You have access to a database of past incidents via the Algolia Search Tool. Use it to find similar patterns.

Instructions:
1. Analyze the user's input.
2. Search the index for similar past issues.
3. Classify severity and recommend actions based on search results.
4. Output ONLY valid JSON. Do not use Markdown formatting.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fc3zxzz3o56qqucfvvlrt.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%2Fc3zxzz3o56qqucfvvlrt.png" alt="Algolia Agent Studio configuration screen showing system prompt and search tool integration"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The "Silent" Protocol: Structured Output
&lt;/h2&gt;

&lt;p&gt;To maintain the "Zero-Chat" standard, I engineered a strict JSON schema. This allows the frontend to render the solution in a tactical &lt;strong&gt;HUD (Heads-Up Display)&lt;/strong&gt; immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response Schema:&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;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"P0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"P1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"P2"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"P3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"probable_cause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Brief technical explanation (max 1 sentence)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommended_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Concrete steps to fix or mitigate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"related_incident_ids"&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;"List of objectIDs found"&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_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0-100&lt;/span&gt;&lt;span class="err"&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;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&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;
  
  
  🏗️ Frontend Architecture: React + Custom Hooks
&lt;/h2&gt;

&lt;p&gt;The UI is built with &lt;strong&gt;React&lt;/strong&gt; following a clean architecture pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── components/     # Reusable UI components
├── hooks/          # Custom React hooks for state management
├── services/       # API integration layer (Algolia Agent Studio)
└── utils/          # Helper functions and parsers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ffgd3lg1h0dvqg24vpi3y.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%2Ffgd3lg1h0dvqg24vpi3y.png" alt="VS Code project structure showing React components, hooks, services, and utils folders"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key technical decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Custom hooks&lt;/strong&gt; for agent communication&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Service layer&lt;/strong&gt; abstraction for API calls&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Component-based&lt;/strong&gt; architecture for maintainability&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Dark theme&lt;/strong&gt; optimized for high-stress environments  &lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 Why This Wins: Reliability Over Hallucination
&lt;/h2&gt;

&lt;p&gt;Most AI agents "guess" when they encounter an error. &lt;strong&gt;Silent Triage&lt;/strong&gt; is different. By grounding the model with Algolia's &lt;strong&gt;Search Tool&lt;/strong&gt;, the agent retrieves actual historical context.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Tactical HUD&lt;/strong&gt;: A React-based interface designed for dark "War Room" environments.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Telemetry Extraction&lt;/strong&gt;: Automatically identifies IPs and endpoints from raw text.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Confidence Score&lt;/strong&gt;: Transparent scoring based on how well the input matches historical records.&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%2F670b30apjpr0zxo43x3r.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%2F670b30apjpr0zxo43x3r.png" alt="Silent Triage app interface showing a P0 critical alert analysis with severity classification and recommended actions"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  📋 Post-Incident Automation
&lt;/h2&gt;

&lt;p&gt;Beyond triage, &lt;strong&gt;Silent Triage&lt;/strong&gt; automates the post-mortem workflow:&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;One-Click PDF Report Generation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;After analyzing an incident, the system generates a professional &lt;strong&gt;PDF Audit Report&lt;/strong&gt; using &lt;code&gt;jspdf&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Incident Summary&lt;/strong&gt;: Severity, timestamp, and confidence score&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Root Cause Analysis&lt;/strong&gt;: Grounded in historical data&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Recommended Actions&lt;/strong&gt;: Step-by-step remediation plan&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Related Incidents&lt;/strong&gt;: References to past similar cases  &lt;/p&gt;

&lt;p&gt;This eliminates the manual copy-paste process that wastes critical minutes during P0 events.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Jira-Ready Format&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The analysis can be exported in &lt;strong&gt;Jira/Textile syntax&lt;/strong&gt;, allowing instant ticket creation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;h2. [P0] Database Connection Timeout - Production

*Probable Cause:* Database connection pool exhausted due to unclosed connections.

*Recommended Action:* 
# Restart the primary database node
# Increase max_connections limit in RDS
# Review connection pooling configuration

*Related Incidents:* INC-001
*Confidence:* 92%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This bridges the gap between AI-powered triage and enterprise ticketing systems.&lt;/p&gt;







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

&lt;p&gt;🌐 &lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://silent-triage-hackathon.vercel.app" rel="noopener noreferrer"&gt;silent-triage-hackathon.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;Source Code&lt;/strong&gt;: &lt;a href="https://github.com/Sherman95/silent-triage-agent" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👤 Developed by &lt;strong&gt;Sherman95&lt;/strong&gt; for the &lt;strong&gt;Algolia Agent Studio Challenge&lt;/strong&gt;.&lt;/p&gt;




</description>
      <category>algoliachallenge</category>
      <category>ai</category>
      <category>devops</category>
      <category>react</category>
    </item>
  </channel>
</rss>
