<?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: MakendranG</title>
    <description>The latest articles on DEV Community by MakendranG (@makendrang).</description>
    <link>https://dev.to/makendrang</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F850769%2F608fa2dc-f81b-4bdd-b8c0-6b06afdf99c1.jpeg</url>
      <title>DEV Community: MakendranG</title>
      <link>https://dev.to/makendrang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/makendrang"/>
    <language>en</language>
    <item>
      <title>🐾 PawSense AI — Your Dog’s AI Companion &amp; Canine Translator</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sat, 15 Aug 2026 16:29:30 +0000</pubDate>
      <link>https://dev.to/makendrang/pawsense-ai-your-dogs-ai-sidekick-powered-by-gemini-4e5f</link>
      <guid>https://dev.to/makendrang/pawsense-ai-your-dogs-ai-sidekick-powered-by-gemini-4e5f</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-08-13"&gt;Weekend Challenge: Dog Days Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0fkjjj5yd30bhrcdus7a.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0fkjjj5yd30bhrcdus7a.PNG" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PawSense AI&lt;/strong&gt; is an interactive, full-stack AI application designed to celebrate the unique bond between humans and their dogs. By simply uploading a photo, capturing a live webcam shot, or picking from a curated pack of sample pups, Google Gemini’s multimodal vision transforms that single image into an entertaining, comprehensive canine profile.&lt;/p&gt;

&lt;p&gt;PawSense AI delivers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧬 &lt;strong&gt;Multimodal Breed &amp;amp; Lineage Analysis&lt;/strong&gt;: Identifies primary breed matches with confidence scoring and estimated mixed-breed lineage percentages.&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Morphology &amp;amp; Physical Traits&lt;/strong&gt;: Analyzes coat patterns, ear and eye structure, distinguishing markings, and estimates life stages (Puppy, Young Adult, Adult, Senior) using observable visual cues.&lt;/li&gt;
&lt;li&gt;🎭 &lt;strong&gt;Playful Personality Archetypes &amp;amp; Radar Stats&lt;/strong&gt;: Assigns custom canine archetypes (e.g., &lt;em&gt;"The Velveteen Snuggle Monster"&lt;/em&gt;, &lt;em&gt;"Chief Operations Zoomer"&lt;/em&gt;), calculates energy scores (1–10), superpowers, kryptonite nemesis, spirit elements, love languages, and funny quirks.&lt;/li&gt;
&lt;li&gt;💭 &lt;strong&gt;Canine Brainwave Translator ("Dog Thoughts")&lt;/strong&gt;: Translates what the dog is thinking in real time—with hilarious stances on humans, mail carriers, and cheese wrappers—featuring Web Speech text-to-speech audio playback.&lt;/li&gt;
&lt;li&gt;📅 &lt;strong&gt;Personalized Daily Routine &amp;amp; Enrichment Schedule&lt;/strong&gt;: Generates a 5-part daily schedule (Morning, Midday, Afternoon, Evening, Bedtime) with checkable care milestones and breed-tailored mental/physical games.&lt;/li&gt;
&lt;li&gt;🪪 &lt;strong&gt;Collectible PawPort™ ID Card&lt;/strong&gt;: Generates an official Canine Registry Passport and trading card with rarity tiers and high-resolution PNG export for instant downloading and sharing.&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Interactive "Chat with Your Dog"&lt;/strong&gt;: Real-time conversational interface where Gemini adopts your dog's exact personality, complete with voice recognition input, cute simulated canine actions (&lt;em&gt;tail wags frantically&lt;/em&gt;), and spoken audio replies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was to build far more than a basic breed classifier — to create a &lt;strong&gt;delightful, deeply personal AI experience centered around the joy of dog companionship&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;🚀 &lt;strong&gt;Live Web Application&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://aistudio.google.com/apps/7c426e35-1292-4dc9-93d5-06117d4b365c?showPreview=true&amp;amp;project=gen-lang-client-0556648492&amp;amp;showAssistant=true&amp;amp;fullscreenApplet=true" rel="noopener noreferrer"&gt;https://aistudio.google.com/apps/7c426e35-1292-4dc9-93d5-06117d4b365c?showPreview=true&amp;amp;project=gen-lang-client-0556648492&amp;amp;showAssistant=true&amp;amp;fullscreenApplet=true&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Google AI Studio App Workspace&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://ai.studio/apps/7c426e35-1292-4dc9-93d5-06117d4b365c" rel="noopener noreferrer"&gt;https://ai.studio/apps/7c426e35-1292-4dc9-93d5-06117d4b365c&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;The application is built as a production-ready full-stack application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React 19, TypeScript, Tailwind CSS, Motion animations, Lucide Icons, Canvas Confetti, and native Web Audio / Speech Synthesis APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend API&lt;/strong&gt;: Node.js &amp;amp; Express server with &lt;code&gt;@google/genai&lt;/code&gt; SDK.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence&lt;/strong&gt;: Browser IndexedDB (&lt;code&gt;PawSenseDB&lt;/code&gt;) with client-side image compression for fast, persistent storage of scanned dog packs without storage quota limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience&lt;/strong&gt;: Automatic retry with exponential backoff and a model fallback chain (&lt;code&gt;gemini-3.7-flash&lt;/code&gt; ➔ &lt;code&gt;gemini-flash-latest&lt;/code&gt; ➔ &lt;code&gt;gemini-2.5-flash&lt;/code&gt;) to ensure continuous uptime during high-demand traffic spikes.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  1. Central Multimodal Gemini Intelligence
&lt;/h3&gt;

&lt;p&gt;Google Gemini is the core engine powering the entire experience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When a photo is uploaded, the image is sent securely to the backend &lt;code&gt;/api/analyze-dog&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;li&gt;Gemini evaluates the photo using multimodal vision understanding, extracting breed taxonomy, morphological characteristics, life stage clues, personality archetypes, and routine suggestions.&lt;/li&gt;
&lt;li&gt;The response is strictly validated against a typed JSON schema (&lt;code&gt;responseMimeType: "application/json"&lt;/code&gt;, &lt;code&gt;responseSchema&lt;/code&gt;), guaranteeing clean, structured data for the frontend in a single pass.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. Conversational Dog Persona Engine
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;/api/chat-dog&lt;/code&gt; endpoint injects the generated breed traits, quirks, fears, and relationship dynamics into the model's system instructions. Gemini assumes the dog's first-person perspective, reacting with authentic dog logic (obsessions with treats, squeaky toys, belly scritches, and naps) alongside expressive action markers.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Interactive Web Audio &amp;amp; Canvas Exporting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sound Effects&lt;/strong&gt;: Synthesized using the Web Audio API (happy yips, tail thumps, camera clicks) and Web Speech API for voice playback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PawPort Card Generator&lt;/strong&gt;: Renders high-definition collectible trading cards dynamically onto HTML5 Canvas with custom badges, QR verification stamps, and direct image download support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Robust Local Persistence with IndexedDB
&lt;/h3&gt;

&lt;p&gt;To handle multiple dog photo uploads without exceeding standard browser storage limits, the app employs an asynchronous IndexedDB storage layer (&lt;code&gt;PawSenseDB&lt;/code&gt;) alongside client-side image optimization.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbe9chyq1izh1yku6t1ne.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbe9chyq1izh1yku6t1ne.PNG" alt=" " width="799" height="401"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;🏆 &lt;strong&gt;Best Use of Google AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PawSense AI is submitted for the &lt;strong&gt;Best Use of Google AI&lt;/strong&gt; category.&lt;/p&gt;

&lt;p&gt;Rather than using AI as a simple chatbot widget, &lt;strong&gt;Google Gemini powers the foundational architecture of the application&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal Image Analysis&lt;/strong&gt;: Deep morphological visual understanding of dog breeds, age cues, and physical traits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Schema Synthesis&lt;/strong&gt;: Generating structured JSON profiles spanning genetics, behavioral traits, and custom care routines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roleplay &amp;amp; Dynamic Chat&lt;/strong&gt;: Conversational AI grounded in each dog's unique persona.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spontaneous Creative Generation&lt;/strong&gt;: Real-time translation of canine inner monologues and thoughts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🐕 &lt;strong&gt;Built for dogs. Powered by Gemini. Inspired by the bond between humans and their best friends.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>🍽️ Masala Dosa House — A Taste of Home</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sat, 15 Aug 2026 15:44:11 +0000</pubDate>
      <link>https://dev.to/makendrang/masala-dosa-house-a-taste-of-home-3hfi</link>
      <guid>https://dev.to/makendrang/masala-dosa-house-a-taste-of-home-3hfi</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge - Comfort Food Edition, Perfect Landing&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;For the &lt;strong&gt;Perfect Landing&lt;/strong&gt; prompt, I built &lt;strong&gt;Masala Dosa House&lt;/strong&gt;, a warm and modern landing page inspired by one of my favorite comfort foods — &lt;strong&gt;South Indian Masala Dosa&lt;/strong&gt;. 🇮🇳&lt;/p&gt;

&lt;p&gt;The idea was to create a fictional restaurant website that feels like stepping into a familiar neighborhood dosa spot.&lt;/p&gt;

&lt;p&gt;The landing page focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🍽️ Hero section featuring Masala Dosa&lt;/li&gt;
&lt;li&gt;🥞 Signature dishes&lt;/li&gt;
&lt;li&gt;🥥 Chutneys and sambar&lt;/li&gt;
&lt;li&gt;🌿 Traditional South Indian food experience&lt;/li&gt;
&lt;li&gt;❤️ A warm, welcoming visual design&lt;/li&gt;
&lt;li&gt;📱 Responsive layout for desktop and mobile&lt;/li&gt;
&lt;li&gt;✨ Smooth interactions and animations&lt;/li&gt;
&lt;li&gt;🎨 Food-inspired colors, typography, and visual elements&lt;/li&gt;
&lt;li&gt;📍 Restaurant-style call-to-action sections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than creating a generic restaurant landing page, I wanted the entire experience to communicate the feeling behind comfort food — &lt;strong&gt;warmth, familiarity, and home&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;🍽️ &lt;strong&gt;Live Project: Masala Dosa House — A Taste of Home&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/editor/Makendran-Gunasekaran/embed/01a00612-6b61-7283-b7b3-13bdb96fea7b?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/editor/Makendran-Gunasekaran/pen/01a00612-6b61-7283-b7b3-13bdb96fea7b?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;View the Masala Dosa House project on CodePen&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;I started by thinking about what makes a food website feel different from a regular landing page.&lt;/p&gt;

&lt;p&gt;For me, comfort food isn't only about the food itself. It's about the &lt;strong&gt;experience around it&lt;/strong&gt; — the aroma, the warmth, the familiar presentation, and the feeling of sitting down for a meal that you already know you'll enjoy.&lt;/p&gt;

&lt;p&gt;That became the design direction for &lt;strong&gt;Masala Dosa House&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I used a warm visual palette inspired by dosa, banana leaves, spices, chutneys, and traditional South Indian dining. The layout was designed to keep the food as the main focus while making the page easy to navigate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building the experience
&lt;/h3&gt;

&lt;p&gt;I structured the landing page around a simple restaurant journey:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discover → Explore → Choose → Visit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The hero section introduces the restaurant and immediately establishes the comfort-food theme.&lt;/p&gt;

&lt;p&gt;The menu section highlights signature dishes, while supporting sections provide more context about the restaurant and its food.&lt;/p&gt;

&lt;p&gt;I also focused on making the interface feel responsive and interactive rather than just presenting a static collection of cards.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I learned
&lt;/h3&gt;

&lt;p&gt;This project gave me an opportunity to think beyond individual UI components and focus on the &lt;strong&gt;overall user experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Some of the areas I focused on were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a strong visual hierarchy&lt;/li&gt;
&lt;li&gt;Designing clear calls to action&lt;/li&gt;
&lt;li&gt;Maintaining readability against food-inspired backgrounds&lt;/li&gt;
&lt;li&gt;Building responsive layouts&lt;/li&gt;
&lt;li&gt;Using animation without distracting from the content&lt;/li&gt;
&lt;li&gt;Creating a consistent visual identity across the page&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I'm proud of
&lt;/h3&gt;

&lt;p&gt;I'm particularly proud of turning a simple idea — &lt;strong&gt;"a restaurant that serves comfort food"&lt;/strong&gt; — into a complete visual experience.&lt;/p&gt;

&lt;p&gt;The goal wasn't just to show a dosa.&lt;/p&gt;

&lt;p&gt;It was to make the visitor feel:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"This looks like somewhere I'd love to eat."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That feeling became the main design principle behind the landing page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Comfort Food Edition&lt;/strong&gt; challenge was a fun opportunity to combine frontend development with something deeply relatable — food.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Masala Dosa House&lt;/strong&gt;, I wanted to create a fictional restaurant that feels familiar, welcoming, and distinctly South Indian while still looking like a modern web experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good food brings people together. Good design should do the same. 🍽️❤️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt; Masala Dosa House — A Taste of Home&lt;br&gt;
&lt;strong&gt;Built with:&lt;/strong&gt; HTML, CSS, JavaScript&lt;br&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; CodePen&lt;br&gt;
&lt;strong&gt;Challenge:&lt;/strong&gt; Frontend Challenge — Comfort Food Edition / Perfect Landing&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>CSS Masala Dosa — A Plate of Comfort 🍽️</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sat, 15 Aug 2026 15:41:39 +0000</pubDate>
      <link>https://dev.to/makendrang/css-masala-dosa-a-plate-of-comfort-3dh7</link>
      <guid>https://dev.to/makendrang/css-masala-dosa-a-plate-of-comfort-3dh7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge - Comfort Food Edition, CSS Art&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;For my CSS Art submission, I wanted to create something that represents &lt;strong&gt;comfort food from South India — Masala Dosa&lt;/strong&gt;. 🇮🇳&lt;/p&gt;

&lt;p&gt;A crispy, golden dosa served with potato masala, coconut chutney, tomato chutney, and a warm bowl of sambar is more than just a meal. It's one of those dishes that immediately feels familiar and comforting.&lt;/p&gt;

&lt;p&gt;I decided to recreate the entire plate using &lt;strong&gt;HTML and CSS&lt;/strong&gt;, without using food images or external graphics.&lt;/p&gt;

&lt;p&gt;The goal was to turn a simple plate of masala dosa into a small CSS illustration while keeping the focus on CSS techniques such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS gradients&lt;/li&gt;
&lt;li&gt;Radial and repeating gradients&lt;/li&gt;
&lt;li&gt;Border-radius based shapes&lt;/li&gt;
&lt;li&gt;Box shadows&lt;/li&gt;
&lt;li&gt;Pseudo-elements&lt;/li&gt;
&lt;li&gt;CSS animations&lt;/li&gt;
&lt;li&gt;Responsive layouts&lt;/li&gt;
&lt;li&gt;Layering and positioning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is called &lt;strong&gt;"CSS Masala Dosa — A Plate of Comfort"&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;🍽️ &lt;strong&gt;Live CodePen Project: CSS Masala Dosa — A Plate of Comfort&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/editor/Makendran-Gunasekaran/embed/01a00612-6b61-7283-b7b3-13bdb96fea7b?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/editor/Makendran-Gunasekaran/pen/01a00612-6b61-7283-b7b3-13bdb96fea7b?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;View the CSS Masala Dosa project on CodePen&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;I started with the idea of creating a &lt;strong&gt;single plate entirely from CSS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of using an image for the dosa, I built the main shape using layered gradients and rounded shapes. The different colors and textures help create the crispy, golden appearance of the dosa.&lt;/p&gt;

&lt;p&gt;Then I added the individual elements of the meal:&lt;/p&gt;

&lt;p&gt;🥞 &lt;strong&gt;Masala Dosa&lt;/strong&gt; — built using multiple gradients, shadows, and layered shapes.&lt;/p&gt;

&lt;p&gt;🥔 &lt;strong&gt;Potato Masala&lt;/strong&gt; — represented using small CSS shapes for potato pieces, onions, and curry leaves.&lt;/p&gt;

&lt;p&gt;🥥 &lt;strong&gt;Coconut Chutney&lt;/strong&gt; — created using a circular CSS shape with subtle texture details.&lt;/p&gt;

&lt;p&gt;🌶️ &lt;strong&gt;Tomato Chutney&lt;/strong&gt; — another CSS-only circular element with layered gradients.&lt;/p&gt;

&lt;p&gt;🥣 &lt;strong&gt;Sambar&lt;/strong&gt; — built as a small bowl using nested circular elements and gradients.&lt;/p&gt;

&lt;p&gt;🌿 &lt;strong&gt;Banana Leaf&lt;/strong&gt; — created with gradients, shadows, and a CSS vein to give it a natural appearance.&lt;/p&gt;

&lt;p&gt;♨️ &lt;strong&gt;Steam&lt;/strong&gt; — animated using CSS &lt;code&gt;@keyframes&lt;/code&gt; to give the dosa a freshly-served feeling.&lt;/p&gt;

&lt;p&gt;One of the things I particularly enjoyed was creating the &lt;strong&gt;food textures without images&lt;/strong&gt;. Radial gradients and repeating gradients made it possible to add subtle variations to the dosa instead of making it look like a simple flat shape.&lt;/p&gt;

&lt;p&gt;I also added a small interaction: clicking the plate gives it a subtle animation, making the otherwise static CSS artwork feel a little more alive.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I learned
&lt;/h3&gt;

&lt;p&gt;This project was a great reminder that CSS can be used for much more than layouts and styling.&lt;/p&gt;

&lt;p&gt;A combination of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gradients
+
Border Radius
+
Box Shadows
+
Pseudo Elements
+
Transforms
+
Animations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can create surprisingly detailed illustrations without requiring external image assets.&lt;/p&gt;

&lt;p&gt;It was also a fun exercise in thinking about &lt;strong&gt;how to break a real-world object into simple geometric shapes&lt;/strong&gt; and then reconstruct it using CSS.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'm proud of
&lt;/h3&gt;

&lt;p&gt;I'm particularly happy that the complete food scene is created using &lt;strong&gt;HTML + CSS&lt;/strong&gt;, with only a very small amount of JavaScript used for the click interaction.&lt;/p&gt;

&lt;p&gt;The main visual elements — dosa, banana leaf, chutneys, sambar, masala, garnish, and steam — are all CSS-generated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Masala dosa is one of those foods that feels like home, and that made it a perfect fit for the &lt;strong&gt;Comfort Food Edition&lt;/strong&gt; challenge.&lt;/p&gt;

&lt;p&gt;This challenge pushed me to look at CSS not just as a styling language, but as a tool for creating illustrations and experiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A little CSS, a little creativity, and a lot of dosa. 🍽️❤️&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt; CSS Masala Dosa — A Plate of Comfort&lt;br&gt;
&lt;strong&gt;Built with:&lt;/strong&gt; HTML, CSS, JavaScript&lt;br&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; CodePen&lt;br&gt;
&lt;strong&gt;Challenge:&lt;/strong&gt; Frontend Challenge — Comfort Food Edition / CSS Art&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
    </item>
    <item>
      <title>Solstice Runner — A Browser Game Tribute to Alan Turing</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sat, 13 Jun 2026 16:49:06 +0000</pubDate>
      <link>https://dev.to/makendrang/solstice-runner-a-browser-game-tribute-to-alan-turing-52fc</link>
      <guid>https://dev.to/makendrang/solstice-runner-a-browser-game-tribute-to-alan-turing-52fc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/june-game-jam-2026-06-03"&gt;June Solstice Game Jam&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Solstice Runner&lt;/strong&gt; is a browser-based endless runner where you play as a ray of sunlight racing across the June solstice sky — the longest day of the year. Your goal: jump over creeping shadow obstacles and survive as long as possible.&lt;/p&gt;

&lt;p&gt;As you play, the world transforms around you. The sky slowly shifts from warm midsummer gold to deep solstice night — a dawn-to-dusk progression tied to your score. Stars emerge, the moon rises, and the obstacles grow faster and taller. The game ends when shadow swallows you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alan Turing tribute&lt;/strong&gt;: the shadow obstacles are etched with binary code — fragments of the ASCII encoding of "ALAN" and bits from the binary patterns of early computing. As you play, facts about Turing appear at the bottom of the screen, reminding you whose birthday falls just after this solstice. He was a man whose brilliant light the world tried to extinguish. In this game, you fight to keep the light alive.&lt;/p&gt;




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

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




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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/MakendranG" rel="noopener noreferrer"&gt;
        MakendranG
      &lt;/a&gt; / &lt;a href="https://github.com/MakendranG/solstice-runner" rel="noopener noreferrer"&gt;
        solstice-runner
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A June Solstice browser game — tribute to Alan Turing
    &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;solstice-runner&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A June Solstice browser game — tribute to Alan Turing&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/MakendranG/solstice-runner" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;The full game is a single HTML file — no frameworks, no build tools, just vanilla Canvas 2D.&lt;/p&gt;

&lt;p&gt;Key files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;index.html&lt;/code&gt; — the entire game (canvas, game loop, rendering, input handling)&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The game is built entirely with the &lt;strong&gt;HTML5 Canvas API&lt;/strong&gt; and vanilla JavaScript — no libraries, no frameworks. Everything runs in a single &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Game loop&lt;/strong&gt;: A standard &lt;code&gt;requestAnimationFrame&lt;/code&gt; loop handles both update and draw each frame, keeping physics and rendering in sync.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Physics&lt;/strong&gt;: The player has a simple gravity accumulator (&lt;code&gt;vy += 0.58&lt;/code&gt; per frame) with a ground clamp. Jumping applies an instant upward velocity (&lt;code&gt;vy = -12.5&lt;/code&gt;). It's minimal but feels satisfying because the gravity is tuned to feel snappy rather than floaty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sky progression&lt;/strong&gt;: Instead of a timer, the sky phase is derived directly from the player's score — &lt;code&gt;skyPhase = score / 280&lt;/code&gt;. This means the longer you survive, the deeper into night you go. Colors are linearly interpolated between hex values for dawn and dusk, so the sky transitions feel smooth without any keyframe animation system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obstacle spawning&lt;/strong&gt;: Spawn interval shortens as the score rises (&lt;code&gt;interval = max(38, 88 - score * 0.38)&lt;/code&gt;), creating a natural difficulty curve. Tall obstacles (60–84px) appear once your score passes 8, requiring better-timed jumps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Turing layer&lt;/strong&gt;: Every shadow obstacle has a ~55% chance of displaying a binary string down its face — fragments of ASCII "ALAN", "10" (binary for 2, Turing's birthday month), and "T". These are purely decorative but reward players who notice them. Additionally, a fact about Alan Turing surfaces every ~420 frames, surfacing quietly below the game without interrupting play.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Celestial bodies&lt;/strong&gt;: The sun tracks across the sky and fades as &lt;code&gt;skyPhase&lt;/code&gt; rises. The moon fades in after &lt;code&gt;skyPhase &amp;gt; 0.35&lt;/code&gt; and gently bobs using a sine offset, giving the night sky a living quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Particles&lt;/strong&gt;: Jump particles are emitted from the player's base on each jump — 8 small circles that arc outward and fade over ~22 frames. They reinforce the feel of launching a burst of light.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Best Ode to Alan Turing
&lt;/h3&gt;

&lt;p&gt;Alan Turing was born on June 23 — two days after the solstice this game is built around. He was one of the greatest minds of the 20th century: the father of modern computing, the codebreaker who helped end World War II, and the man who first asked whether machines could think. He was also persecuted by the British government for being gay and died at 41.&lt;/p&gt;

&lt;p&gt;This game honors him in several ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The shadow obstacles carry binary&lt;/strong&gt; — the shadow in this game isn't random noise; it's encoded. Binary fragments of "ALAN" and early computing symbols are etched into each shadow pillar. The thing trying to stop you isn't mindless — it has structure, like the ciphers Turing spent his life breaking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The player is light&lt;/strong&gt; — Turing's work was about illuminating problems that seemed unsolvable. Playing as a sunbeam fighting off darkness felt like the right metaphor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turing facts surface during play&lt;/strong&gt; — players learn about his work and his life without it feeling like a lecture. A new fact appears every ~40 seconds, quietly, below the game.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The solstice timing&lt;/strong&gt; — June 23 is two days after June 21. The jam ends on the solstice. This game is set on that exact day. The connection felt too meaningful to ignore.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mechanics, the visual language, and the narrative are all built around one idea: light persists, even when the world tries to extinguish it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built during the June Solstice Game Jam, June 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gamechallenge</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>How I Ran a Local AI Assistant on AWS Cloud9 Using OpenClaw — A Complete Getting Started Guide</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sun, 26 Apr 2026 16:34:20 +0000</pubDate>
      <link>https://dev.to/makendrang/how-i-ran-a-local-ai-assistant-on-aws-cloud9-using-openclaw-a-complete-getting-started-guide-22h4</link>
      <guid>https://dev.to/makendrang/how-i-ran-a-local-ai-assistant-on-aws-cloud9-using-openclaw-a-complete-getting-started-guide-22h4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/openclaw-2026-04-16"&gt;OpenClaw Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Personal AI should belong to you. Not a subscription. Not a third-party server. Not someone else's cloud. Just your machine, your model, your data.&lt;/p&gt;

&lt;p&gt;That's exactly what OpenClaw makes possible — and in this guide, I'll walk you through how I set it up from scratch on AWS Cloud9, the challenges I ran into, and what I learned along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is OpenClaw?
&lt;/h2&gt;

&lt;p&gt;OpenClaw is an open-source personal AI assistant platform that you self-host. Think of it as your own private AI that runs on your hardware, uses open-source language models, and never sends your data anywhere you don't control.&lt;/p&gt;

&lt;p&gt;What makes it powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔒 &lt;strong&gt;Privacy-first&lt;/strong&gt; — everything runs locally&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;Hackable&lt;/strong&gt; — build custom skills and integrations&lt;/li&gt;
&lt;li&gt;🆓 &lt;strong&gt;Free&lt;/strong&gt; — no API costs, no subscriptions&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Deployable anywhere&lt;/strong&gt; — your laptop, a Raspberry Pi, or a cloud VM&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why AWS Cloud9?
&lt;/h2&gt;

&lt;p&gt;Cloud9 is AWS's browser-based IDE that comes with a full EC2 instance behind it. It's perfect for OpenClaw because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You get a real Linux environment instantly&lt;/li&gt;
&lt;li&gt;No local setup required — works from any browser&lt;/li&gt;
&lt;li&gt;Easy to scale storage and compute as needed&lt;/li&gt;
&lt;li&gt;Always online — your OpenClaw instance keeps running&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Set Up Your EC2 Instance
&lt;/h2&gt;

&lt;p&gt;Before anything else, make sure your EC2 instance has enough storage. AI models are large — LLaMA 3.2 alone is about 2GB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expand your EBS volume to at least 30GB:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AWS Console → EC2 → Volumes&lt;/li&gt;
&lt;li&gt;Select your volume → Actions → Modify Volume&lt;/li&gt;
&lt;li&gt;Change size to 30GB → Modify&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then resize the filesystem inside Cloud9:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;growpart /dev/nvme0n1 1
&lt;span class="nb"&gt;sudo &lt;/span&gt;xfs_growfs &lt;span class="nt"&gt;-d&lt;/span&gt; /
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;  &lt;span class="c"&gt;# verify the new size&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Install Ollama
&lt;/h2&gt;

&lt;p&gt;Ollama is the engine that runs open-source language models locally. Installing it on EC2 takes one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify it's running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama &lt;span class="nt"&gt;--version&lt;/span&gt;
curl http://127.0.0.1:11434
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Pull a Language Model
&lt;/h2&gt;

&lt;p&gt;I recommend starting with LLaMA 3.2 (3B) — it's fast enough on CPU and produces quality responses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull llama3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test it immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run llama3.2 &lt;span class="s2"&gt;"What is OpenClaw in one sentence?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Avoid &lt;code&gt;llama3.2:1b&lt;/code&gt; for production use — the 1B model gives inconsistent, low-quality responses. The 3B model is worth the extra 1.5GB.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Build the OpenClaw Agent
&lt;/h2&gt;

&lt;p&gt;Create your project folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/environment/openclaw-demo
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/environment/openclaw-demo
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
pip &lt;span class="nb"&gt;install &lt;/span&gt;flask requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the agent file &lt;code&gt;openclaw_agent.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jsonify&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;TASKS_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tasks.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_tasks&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TASKS_FILE&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TASKS_FILE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TASKS_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_ollama&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_task&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Missing text field&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;ai_summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ask_ollama&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;In one short sentence, rewrite this as a clear task: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Reply with only the task sentence.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;load_tasks&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai_summary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ai_summary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_tasks&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;save_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;added&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tasks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_tasks&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;load_tasks&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/health&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;health&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Run the Agent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Terminal 1:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/environment/openclaw-demo
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
python openclaw_agent.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;* Running on http://0.0.0.0:3000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Terminal 2 — Test it:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://127.0.0.1:3000/task &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "Review pull requests before standup"}'&lt;/span&gt; | python &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected response:&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"added"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Review pull requests before standup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ai_summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Review all open pull requests prior to the standup meeting."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-26T10:00:00.000000"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 6: Check the Health Endpoint
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://127.0.0.1:3000/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&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;
  
  
  Common Issues &amp;amp; Fixes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Port 3000 already in use&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;sudo fuser -k 3000/tcp&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;disk full&lt;/code&gt; error&lt;/td&gt;
&lt;td&gt;Expand EBS volume + run &lt;code&gt;xfs_growfs&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;venv/bin/activate not found&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;python3 -m venv venv&lt;/code&gt; first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empty JSON response&lt;/td&gt;
&lt;td&gt;Restart agent, check Ollama is running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow AI responses&lt;/td&gt;
&lt;td&gt;Normal on CPU-only EC2 — upgrade instance type for speed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What OpenClaw Gets Right
&lt;/h2&gt;

&lt;p&gt;After building with OpenClaw, here is what stands out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The privacy model is genuine.&lt;/strong&gt; Nothing leaves your instance. No telemetry, no API calls to external services, no usage data. For anyone building tools that handle personal or sensitive information, this is a game changer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The architecture is composable.&lt;/strong&gt; Every skill is just an endpoint. Adding a new capability means adding a new route. This is the right level of abstraction — simple enough for beginners, flexible enough for complex workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It works on modest hardware.&lt;/strong&gt; No GPU required. A standard EC2 &lt;code&gt;t3.medium&lt;/code&gt; instance runs LLaMA 3.2 perfectly well for personal use. The barrier to entry is genuinely low.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Now that the foundation is running, here is what I plan to build on top of it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📅 &lt;code&gt;/reminder&lt;/code&gt; endpoint — schedule tasks with time-based alerts&lt;/li&gt;
&lt;li&gt;🏷️ &lt;code&gt;/prioritize&lt;/code&gt; endpoint — AI ranks your task list by urgency&lt;/li&gt;
&lt;li&gt;🌐 Web UI — a simple HTML frontend instead of CLI&lt;/li&gt;
&lt;li&gt;📊 &lt;code&gt;/summary&lt;/code&gt; endpoint — daily digest of pending tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The beauty of OpenClaw is that each of these is just another Flask route + an Ollama prompt. The pattern scales naturally.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If you've been waiting for a reason to try self-hosted AI, OpenClaw is it. The setup is approachable, the architecture is clean, and the results are genuinely useful. You don't need a GPU, a paid API, or a powerful local machine — just an EC2 instance and curiosity.&lt;/p&gt;

&lt;p&gt;Start small. Build one skill. See what clicks. Then build another.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Full source code:&lt;/strong&gt; &lt;a href="https://github.com/MakendranG/openclaw-task-manager" rel="noopener noreferrer"&gt;github.com/MakendranG/openclaw-task-manager&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ClawCon Michigan
&lt;/h2&gt;

&lt;p&gt;I didn't attend ClawCon Michigan in person, but following the community online made it clear why this event exists. The people building with OpenClaw aren't just tinkering — they're making a genuine case that personal AI should be private, local, and owned by the user. That idea is worth celebrating in person, and I hope to join the next one. 🦞&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>openclawchallenge</category>
    </item>
    <item>
      <title>I Built an AI Task Manager on AWS Cloud9 with OpenClaw and LLaMA 3.2 — Fully Self-Hosted</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sun, 26 Apr 2026 16:30:19 +0000</pubDate>
      <link>https://dev.to/makendrang/i-built-an-ai-task-manager-on-aws-cloud9-with-openclaw-and-llama-32-fully-self-hosted-3b4p</link>
      <guid>https://dev.to/makendrang/i-built-an-ai-task-manager-on-aws-cloud9-with-openclaw-and-llama-32-fully-self-hosted-3b4p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/openclaw-2026-04-16"&gt;OpenClaw Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;OpenClaw Task Manager&lt;/strong&gt; — an AI-powered personal task assistant that runs entirely on AWS Cloud9 with no external APIs and no data leaving your server.&lt;/p&gt;

&lt;p&gt;The problem it solves is simple: most task managers are dumb. You type a task, it stores it. That's it. I wanted something smarter — where you type in plain English and an AI understands, summarizes, and organizes it for you automatically.&lt;/p&gt;

&lt;p&gt;The stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;strong&gt;LLaMA 3.2&lt;/strong&gt; (via Ollama) — local AI brain&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Flask&lt;/strong&gt; — lightweight backend agent API&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Python CLI&lt;/strong&gt; — simple terminal interface&lt;/li&gt;
&lt;li&gt;☁️ &lt;strong&gt;AWS Cloud9 + EC2&lt;/strong&gt; — fully cloud-hosted deployment&lt;/li&gt;
&lt;li&gt;📁 &lt;strong&gt;JSON&lt;/strong&gt; — local task storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/MakendranG/openclaw-task-manager" rel="noopener noreferrer"&gt;MakendranG/openclaw-task-manager&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Used OpenClaw
&lt;/h2&gt;

&lt;p&gt;OpenClaw acts as the intelligent middleware between raw user input and structured task storage. Here is the full workflow I set up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. User Input (CLI)&lt;/strong&gt;&lt;br&gt;
The user types a task in plain natural language via &lt;code&gt;app.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Enter command: add
Enter task: Remind me to deploy tomorrow at 10 AM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Agent Processing (Flask API)&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;app.py&lt;/code&gt; sends the task as a POST request to the OpenClaw agent running on port 3000:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000/task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. AI Summarization (LLaMA 3.2 via Ollama)&lt;/strong&gt;&lt;br&gt;
The agent passes the task to LLaMA 3.2 with a focused prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;ask_ollama&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;In one short sentence, rewrite this as a clear task: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Reply with only the task sentence, nothing else.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Storage&lt;/strong&gt;&lt;br&gt;
The task is saved to &lt;code&gt;tasks.json&lt;/code&gt; with full metadata — ID, original text, AI summary, timestamp, and completion status.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 REST Endpoints Powering the App:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add and AI-process a new task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/tasks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieve all stored tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Confirm agent is alive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


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

&lt;p&gt;&lt;strong&gt;Terminal 1 — AI Agent running:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;* Serving Flask app 'openclaw_agent'
* Running on http://0.0.0.0:3000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Terminal 2 — Adding a task:&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="err"&gt;OpenClaw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Task&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Manager&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Commands:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;add,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;list,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;exit&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Enter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;command:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Enter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;task:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Remind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;me&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tomorrow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;AM&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&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="err"&gt;Task&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;added:&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Remind me to deploy tomorrow at 10 AM"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ai_summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deploy the application tomorrow at 10 AM."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-26T15:44:45.014827"&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;strong&gt;Listing all tasks:&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;Enter command: list

📋 Current Tasks:
  1. ⏳ Remind me to deploy tomorrow at 10 AM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Health check:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://127.0.0.1:3000/health
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;: &lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Direct API test:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://127.0.0.1:3000/task &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "Finish the OpenClaw blog post"}'&lt;/span&gt; | python &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"added"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task"&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;"ai_summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Complete the OpenClaw blog post."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-26T16:00:00.000000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Finish the OpenClaw blog post"&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;strong&gt;Full source code:&lt;/strong&gt; &lt;a href="https://github.com/MakendranG/openclaw-task-manager" rel="noopener noreferrer"&gt;github.com/MakendranG/openclaw-task-manager&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;1. Ollama on EC2 is surprisingly easy&lt;/strong&gt;&lt;br&gt;
A single &lt;code&gt;curl&lt;/code&gt; install script set up Ollama with a systemd service automatically. No GPU required — it runs fine in CPU-only mode on a standard EC2 instance. Slower, but functional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Model size changes everything&lt;/strong&gt;&lt;br&gt;
I started with &lt;code&gt;llama3.2:1b&lt;/code&gt; and got noisy, confused responses. Switching to the full &lt;code&gt;llama3.2&lt;/code&gt; (3B) made the AI summaries clean and accurate immediately. For production use, always test multiple model sizes before settling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Port conflicts are a real gotcha on Cloud9&lt;/strong&gt;&lt;br&gt;
Cloud9 persists your environment between sessions, so old processes keep running on ports even after you close the browser. Always run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;fuser &lt;span class="nt"&gt;-k&lt;/span&gt; 3000/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;before restarting your agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Disk space fills up fast with AI models&lt;/strong&gt;&lt;br&gt;
LLaMA 3.2 is about 2GB. My EC2 instance started at 10GB and hit 100% disk usage. I had to expand the EBS volume from 10GB to 500GB and run &lt;code&gt;xfs_growfs&lt;/code&gt; to reclaim the space. Always size your storage generously before pulling models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The architecture is genuinely hackable&lt;/strong&gt;&lt;br&gt;
Adding a new OpenClaw skill is just adding a new Flask route. I can already see how to extend this with &lt;code&gt;/reminder&lt;/code&gt;, &lt;code&gt;/prioritize&lt;/code&gt;, or a full web UI frontend. The pattern is clean and composable.&lt;/p&gt;




&lt;h2&gt;
  
  
  ClawCon Michigan
&lt;/h2&gt;

&lt;p&gt;I didn't attend ClawCon Michigan in person, but the energy of the IRL OpenClaw community inspired this entire build. The core idea behind OpenClaw — that personal AI should run locally, on your own hardware, under your own control — really resonates with me as a developer.&lt;/p&gt;

&lt;p&gt;This project is proof that you don't need cloud AI APIs or subscriptions to build something genuinely useful. A free EC2 instance, Ollama, and an open-source model is all it takes. That's the spirit of OpenClaw, and that's what I wanted to demonstrate with this build. 🦞&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>openclawchallenge</category>
    </item>
    <item>
      <title>From Vertex AI to Agent Platform: Why Google's Rebrand Is Actually a Philosophical Shift</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sun, 26 Apr 2026 13:49:05 +0000</pubDate>
      <link>https://dev.to/makendrang/from-vertex-ai-to-agent-platform-why-googles-rebrand-is-actually-a-philosophical-shift-17in</link>
      <guid>https://dev.to/makendrang/from-vertex-ai-to-agent-platform-why-googles-rebrand-is-actually-a-philosophical-shift-17in</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-cloud-next-2026-04-22"&gt;Google Cloud NEXT Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;When Google announced the renaming of Vertex AI to &lt;strong&gt;Gemini Enterprise Agent Platform&lt;/strong&gt; at Cloud Next '26, the developer community's first instinct — including mine — was to roll their eyes. &lt;em&gt;Oh great, another rebrand.&lt;/em&gt; Another product with a longer name, a fresh landing page, and the same underlying tech wearing a new suit.&lt;/p&gt;

&lt;p&gt;But the more I dug into it, the more I realized this isn't a marketing exercise. It's a fundamental statement about how Google thinks AI development should work — and whether that bet pays off has real consequences for the millions of developers building on their platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Changed (Beyond the Name)
&lt;/h2&gt;

&lt;p&gt;The core announcement is this: Vertex AI is no more. All future services, features, and roadmap investments will flow exclusively through the Agent Platform. That's not a small thing. Vertex AI has been the workhorse of enterprise ML on Google Cloud for years. Killing its independent identity signals that Google believes the &lt;em&gt;standalone model API&lt;/em&gt; paradigm is over.&lt;/p&gt;

&lt;p&gt;In its place, the Agent Platform is organized around four explicit pillars: &lt;strong&gt;Build, Scale, Govern, and Optimize&lt;/strong&gt;. Each has real new substance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt; gets a dramatically upgraded Agent Development Kit (ADK), now capable of organizing agents into networks of sub-agents using a graph-based framework. Over six trillion tokens are processed monthly through ADK — and the new architecture lets you define explicit, auditable logic for how agents collaborate. That's a significant shift from "prompt and pray."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scale&lt;/strong&gt; is handled by Agent Runtime, which promises sub-second cold starts and natively supports long-running agents that can operate in the background inside secure sandboxed environments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Govern&lt;/strong&gt; introduces Agent Identity — granular permissions for agents — and Agent Gateway, which enforces runtime policies, handles traffic governance, and integrates with Model Armor for prompt-injection protection. This is the layer that has been conspicuously missing from most agentic frameworks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimize&lt;/strong&gt; gives you Agent Observability, Agent Simulation, and Agent Evaluation. These aren't buzzwords. If you've ever tried to debug a multi-agent pipeline, you know that without proper observability, you're flying blind.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Insight Google Is Actually Selling
&lt;/h2&gt;

&lt;p&gt;Here's the provocative thesis embedded in everything Google announced: &lt;strong&gt;agents aren't AI features, they're software workloads&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The old model — call an API, get a response, maybe chain a few prompts — treats AI as a capability you bolt onto existing software. The Agent Platform treats agents as first-class distributed systems citizens, complete with identity, permissions, runtime environments, observability, and deployment pipelines.&lt;/p&gt;

&lt;p&gt;As Thomas Kurian put it in the keynote: the era of the pilot is over. The era of the agent is here.&lt;/p&gt;

&lt;p&gt;That framing has an important implication for developers. The skills you already have — designing stateful systems, managing service-to-service auth, observing distributed workloads — are now directly applicable to AI development. The Agent Platform is essentially saying: &lt;em&gt;stop thinking of this as "AI stuff" and start thinking of it as software engineering&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Whether that resonates with you probably depends on what you've been building. If you've been frustrated by the gap between "AI demo" and "production system," this architecture starts to close it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Most Excited About: The Model Garden Honesty
&lt;/h2&gt;

&lt;p&gt;One detail that doesn't get enough attention: the Agent Platform's Model Garden now offers &lt;strong&gt;over 200 models&lt;/strong&gt;, including third-party models like Anthropic's Claude family, Llama, DeepSeek, Mistral, and Grok — alongside Google's own Gemini 3.1 Pro, Gemini 3.1 Flash Image (Nano Banana 2), Lyria 3, and Veo 3.1.&lt;/p&gt;

&lt;p&gt;This is a smart and somewhat gutsy call. Google is essentially saying: we're confident enough in our platform and infrastructure that we'll let you use a competitor's model on our cloud. The bet is that developer lock-in comes from the tooling, the data layer, and the runtime — not from forcing you onto a single model.&lt;/p&gt;

&lt;p&gt;For builders, this is the right approach. The model landscape changes every few months. Tying your production architecture to a single provider's model is a liability. A platform that abstracts that choice and lets you swap models without rearchitecting everything is genuinely valuable.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Critique: This Is Complex by Default
&lt;/h2&gt;

&lt;p&gt;There's a real risk buried in all this architectural ambition. The Agent Platform now has: Agent Studio, ADK, Agent Garden, Agent Runtime, Agent Gateway, Agent Identity, Agent Registry, Agent Observability, Agent Simulation, Agent Evaluation, Model Garden, RAG Engine, Vector Search, and Colab Enterprise Notebooks.&lt;/p&gt;

&lt;p&gt;That is a lot of surface area.&lt;/p&gt;

&lt;p&gt;For developers coming from simpler agentic frameworks — LangChain, CrewAI, bare API calls with a bit of orchestration logic — the on-ramp here is non-trivial. The low-code Agent Designer and Agent Studio help, but anyone building anything with real production requirements will quickly find themselves needing to understand the full stack.&lt;/p&gt;

&lt;p&gt;The governance and security features that make this genuinely enterprise-grade are also the same features that add complexity for smaller teams. There's a real question of whether a three-person startup building an AI-powered product actually benefits from Agent Identity and Agent Gateway, or whether those layers just slow them down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where This Lands
&lt;/h2&gt;

&lt;p&gt;Google Cloud Next '26 drew over 32,000 attendees, and the central message was clear: &lt;strong&gt;agentic AI is moving from experimentation to infrastructure&lt;/strong&gt;. The Gemini Enterprise Agent Platform is Google's answer to what that infrastructure should look like.&lt;/p&gt;

&lt;p&gt;I think they've gotten the architecture largely right. Treating agents as managed enterprise workloads — with identity, observability, evaluation, and runtime controls — is the correct mental model for production deployments. The multi-model openness is a genuine competitive differentiator.&lt;/p&gt;

&lt;p&gt;The challenge is execution. A platform this broad needs excellent documentation, sensible defaults, and a clear decision tree for developers figuring out which component they actually need. The history of developer platforms is littered with comprehensive systems that became comprehensive obstacles.&lt;/p&gt;

&lt;p&gt;If Google ships this with the developer experience it deserves, the Agent Platform could genuinely become the foundation of how enterprise AI gets built. If they treat completeness as a substitute for clarity, it'll be another sprawling cloud console that consultants bill hours navigating.&lt;/p&gt;

&lt;p&gt;The bones are good. The proof is in the build.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What are you most interested in exploring from Cloud Next '26? Drop a comment — particularly curious if anyone has already gotten their hands on the new ADK graph-based framework.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>cloudnextchallenge</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>EcoTrack — A Habit Tracker for the Planet 🌍</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sun, 19 Apr 2026 16:59:54 +0000</pubDate>
      <link>https://dev.to/makendrang/i-built-an-eco-habit-tracker-for-earth-day-using-only-vanilla-js-6hb</link>
      <guid>https://dev.to/makendrang/i-built-an-eco-habit-tracker-for-earth-day-using-only-vanilla-js-6hb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-04-16"&gt;Weekend Challenge: Earth Day Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;EcoTrack is a zero-dependency eco habit tracker that helps everyday people build and stick to planet-friendly habits — one small action at a time.&lt;/p&gt;

&lt;p&gt;The idea is simple: most people &lt;em&gt;want&lt;/em&gt; to live more sustainably but don't have a lightweight, friction-free way to stay accountable. EcoTrack makes it as easy as checking off a to-do list — but for the planet 🌍.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily one-tap habit check-in with per-habit streak tracking&lt;/li&gt;
&lt;li&gt;Progress ring showing today's completion at a glance&lt;/li&gt;
&lt;li&gt;7-day weekly heatmap to visualize consistency&lt;/li&gt;
&lt;li&gt;Cumulative impact dashboard — CO₂ saved, plastic avoided, energy and water conserved&lt;/li&gt;
&lt;li&gt;Browser push notification reminders at your chosen time&lt;/li&gt;
&lt;li&gt;Add custom habits beyond the defaults&lt;/li&gt;
&lt;li&gt;Fully offline — all data stored in localStorage, no account needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Default habits include: using a reusable bag, choosing public transport, eating plant-based meals, turning off unused lights, and carrying a reusable water bottle.&lt;/p&gt;

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

&lt;p&gt;🔗 &lt;strong&gt;Live App:&lt;/strong&gt; &lt;a href="https://makendrang.github.io/ecotrack/" rel="noopener noreferrer"&gt;EcoTrack — Eco Habit Tracker&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;🐙 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/makendrang/ecotrack" rel="noopener noreferrer"&gt;github.com/makendrang/ecotrack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The entire app lives in a single &lt;code&gt;index.html&lt;/code&gt; file — no build step, no dependencies, no framework. Clone it and open it directly in your browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ecotrack/
└── index.html   # Complete app — HTML + CSS + JS in one file
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;EcoTrack is built with pure vanilla HTML, CSS, and JavaScript — deliberately no frameworks or dependencies. The goal was to keep the app as lightweight and accessible as possible, something anyone could fork, modify, and host in minutes.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;localStorage&lt;/strong&gt; powers all persistence — habits, daily logs, streaks, and reminder settings all survive page reloads with no backend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streak algorithm&lt;/strong&gt; iterates backwards from today through the log to calculate per-habit and overall streaks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impact calculations&lt;/strong&gt; map each habit to an environmental category (carbon, plastic, energy, water) and compute cumulative totals across all logged days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Notifications API&lt;/strong&gt; handles the reminder system — the app requests permission, then schedules a &lt;code&gt;setTimeout&lt;/code&gt; to fire a browser notification at the user's chosen daily time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS-only animations&lt;/strong&gt; drive the progress ring (SVG &lt;code&gt;stroke-dashoffset&lt;/code&gt; transition) and impact bar reveals — no JS animation libraries needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How GitHub Copilot helped:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub Copilot was instrumental in keeping the build moving over a tight weekend window. Specific wins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated the streak calculation logic from a plain English comment in seconds&lt;/li&gt;
&lt;li&gt;Autocompleted repetitive localStorage get/set patterns without me writing boilerplate&lt;/li&gt;
&lt;li&gt;Suggested the SVG &lt;code&gt;stroke-dashoffset&lt;/code&gt; animation approach for the progress ring when I described what I wanted in a comment&lt;/li&gt;
&lt;li&gt;Wrote the Web Notifications API scheduling logic — I just described "fire a notification at a user-chosen time daily" and Copilot filled in the &lt;code&gt;setTimeout&lt;/code&gt; + &lt;code&gt;Notification&lt;/code&gt; constructor code&lt;/li&gt;
&lt;li&gt;Helped write the CSS dot-grid background texture and the radial gradient layering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What would have taken a full day of boilerplate and MDN lookups was compressed into a focused few hours, leaving more time to refine the UI and Earth Day theming.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;✅ Best Use of GitHub Copilot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub Copilot wasn't just a convenience here — it was a core part of making this build possible within a weekend. From streak logic to notification scheduling to SVG animation, Copilot accelerated nearly every technical decision in the project. I used inline suggestions throughout the codebase and Copilot Chat to reason through the localStorage data model before writing a single line.&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>Chaos vs Calm: An Interactive Frontend Art Experience</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sat, 04 Apr 2026 12:18:26 +0000</pubDate>
      <link>https://dev.to/makendrang/chaos-vs-calm-an-interactive-frontend-art-experience-5d0f</link>
      <guid>https://dev.to/makendrang/chaos-vs-calm-an-interactive-frontend-art-experience-5d0f</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;🔗 Live Demo: &lt;a href="https://makendrang.github.io/frontend-art-chaos-calm/" rel="noopener noreferrer"&gt;https://makendrang.github.io/frontend-art-chaos-calm/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is an interactive frontend artwork where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The left side represents calm&lt;/li&gt;
&lt;li&gt;The right side represents chaos&lt;/li&gt;
&lt;li&gt;Your mouse movement controls the balance between them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Move your mouse and experience the shift between stability and unpredictability.&lt;/p&gt;




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

&lt;p&gt;This piece is inspired by the constant balance we experience in life:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Focus vs distraction
&lt;/li&gt;
&lt;li&gt;Calm vs chaos
&lt;/li&gt;
&lt;li&gt;Control vs randomness
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes we feel completely in control, and sometimes everything feels chaotic.&lt;/p&gt;

&lt;p&gt;This artwork visualizes that emotional and mental balance in a simple, interactive way.&lt;/p&gt;




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

&lt;p&gt;💻 GitHub Repo: &lt;a href="https://github.com/MakendranG/frontend-art-chaos-calm.git" rel="noopener noreferrer"&gt;https://github.com/MakendranG/frontend-art-chaos-calm.git&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Frontend development is not just about building applications.&lt;/p&gt;

&lt;p&gt;It can also be a medium for expression.&lt;/p&gt;

&lt;p&gt;This project explores how simple code can create an emotional and interactive experience.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>art</category>
      <category>webdev</category>
      <category>creativity</category>
    </item>
    <item>
      <title>From Curiosity to Confidence: My Journey Through Code, Community, and Consistency</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sat, 04 Apr 2026 12:04:11 +0000</pubDate>
      <link>https://dev.to/makendrang/from-curiosity-to-confidence-my-journey-through-code-community-and-consistency-3hgl</link>
      <guid>https://dev.to/makendrang/from-curiosity-to-confidence-my-journey-through-code-community-and-consistency-3hgl</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;: Echoes of Experience&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I first stepped into the world of tech, I didn’t have a grand plan.&lt;br&gt;&lt;br&gt;
No roadmap. No perfect strategy.  &lt;/p&gt;

&lt;p&gt;Just curiosity… and a lot of questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌱 The Beginning: Learning Without a Clear Path
&lt;/h2&gt;

&lt;p&gt;Like many others, I started by exploring different technologies—trying to understand what “fits.”&lt;/p&gt;

&lt;p&gt;From cloud platforms to frontend development, from writing simple scripts to working on real-world projects, every step felt like:&lt;/p&gt;

&lt;p&gt;👉 &lt;em&gt;“Am I going in the right direction?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There were moments of confusion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too many tools to learn
&lt;/li&gt;
&lt;li&gt;Too many opinions on what’s “best”
&lt;/li&gt;
&lt;li&gt;Too many comparisons with others
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yet, the only thing that kept me moving forward was:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Consistency over clarity&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚧 The Challenges: Self-Doubt &amp;amp; Information Overload
&lt;/h2&gt;

&lt;p&gt;One of the biggest challenges wasn’t technical—it was mental.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seeing others move faster
&lt;/li&gt;
&lt;li&gt;Feeling like I needed to know everything
&lt;/li&gt;
&lt;li&gt;Questioning whether I was “good enough”
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In tech, it's easy to feel like you're always behind.&lt;/p&gt;

&lt;p&gt;But over time, I realized:&lt;/p&gt;

&lt;p&gt;👉 Everyone is figuring things out as they go  &lt;/p&gt;

&lt;p&gt;Even the people we look up to.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 The Turning Point: Building in Public
&lt;/h2&gt;

&lt;p&gt;Things changed when I started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Participating in challenges
&lt;/li&gt;
&lt;li&gt;Writing blogs
&lt;/li&gt;
&lt;li&gt;Sharing projects
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of waiting to be “perfect,” I started to &lt;strong&gt;ship and share&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s when I noticed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People appreciated honesty over perfection
&lt;/li&gt;
&lt;li&gt;Learning became more structured
&lt;/li&gt;
&lt;li&gt;Confidence started building naturally
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏆 Small Wins That Matter
&lt;/h2&gt;

&lt;p&gt;Some milestones that made a big difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contributing to technical blogs
&lt;/li&gt;
&lt;li&gt;Participating in developer challenges
&lt;/li&gt;
&lt;li&gt;Getting recognition for my work
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These weren’t just achievements—they were &lt;strong&gt;confidence boosters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They proved:&lt;/p&gt;

&lt;p&gt;👉 Progress is happening, even when it feels slow  &lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 The Power of Community
&lt;/h2&gt;

&lt;p&gt;One of the most underrated aspects of this journey has been the community.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developer platforms
&lt;/li&gt;
&lt;li&gt;Online challenges
&lt;/li&gt;
&lt;li&gt;Shared learning experiences
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They create an environment where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can learn openly
&lt;/li&gt;
&lt;li&gt;You can fail safely
&lt;/li&gt;
&lt;li&gt;You can grow collectively
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Lessons I Learned
&lt;/h2&gt;

&lt;p&gt;If I had to summarize my journey, it would be these:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. You don’t need to know everything to start
&lt;/h3&gt;

&lt;p&gt;Start small. Learn along the way.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Consistency beats intensity
&lt;/h3&gt;

&lt;p&gt;Daily effort &amp;gt; occasional bursts&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Build things—even if they’re imperfect
&lt;/h3&gt;

&lt;p&gt;Projects teach more than tutorials ever can&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Share your journey
&lt;/h3&gt;

&lt;p&gt;Your story can help someone else&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Comparison slows you down
&lt;/h3&gt;

&lt;p&gt;Focus on your own path&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 To Anyone Feeling Unsure
&lt;/h2&gt;

&lt;p&gt;If you’re someone who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feels lost in tech
&lt;/li&gt;
&lt;li&gt;Thinks you’re not “ready”
&lt;/li&gt;
&lt;li&gt;Wonders if you belong
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me tell you:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;You do belong here&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your journey doesn’t need to look like anyone else’s.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Looking back, I didn’t need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The perfect plan
&lt;/li&gt;
&lt;li&gt;The perfect skills
&lt;/li&gt;
&lt;li&gt;The perfect timing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I just needed to:&lt;/p&gt;

&lt;p&gt;👉 Start&lt;br&gt;&lt;br&gt;
👉 Continue&lt;br&gt;&lt;br&gt;
👉 Not give up  &lt;/p&gt;

&lt;p&gt;And that made all the difference.&lt;/p&gt;




&lt;p&gt;If my journey resonates with you in any way, that’s already a win. 💙&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>beginners</category>
      <category>community</category>
    </item>
    <item>
      <title>🛑 Procrastination-as-a-Service (PaaS): Avoid Work Efficiently</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sat, 04 Apr 2026 11:39:59 +0000</pubDate>
      <link>https://dev.to/makendrang/procrastination-as-a-service-paas-powered-by-google-ai-to-avoid-work-efficiently-2l32</link>
      <guid>https://dev.to/makendrang/procrastination-as-a-service-paas-powered-by-google-ai-to-avoid-work-efficiently-2l32</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  🛑 Procrastination-as-a-Service (PaaS)
&lt;/h3&gt;

&lt;p&gt;What if software helped you avoid work… efficiently?&lt;/p&gt;

&lt;p&gt;I built a completely useless web app that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generates smart excuses&lt;/li&gt;
&lt;li&gt;Distracts you with random websites&lt;/li&gt;
&lt;li&gt;Simulates progress… backwards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because productivity is overrated 😄&lt;/p&gt;




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

&lt;p&gt;🔗 Live Demo: &lt;a href="https://makendrang.github.io/paas-procrastination/" rel="noopener noreferrer"&gt;https://makendrang.github.io/paas-procrastination/&lt;/a&gt;&lt;/p&gt;




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

&lt;h2&gt;
  
  
  💻 GitHub Repo: &lt;a href="https://github.com/MakendranG/paas-procrastination.git" rel="noopener noreferrer"&gt;https://github.com/MakendranG/paas-procrastination.git&lt;/a&gt;
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;HTML, CSS, JavaScript
&lt;/li&gt;
&lt;li&gt;Randomized excuse engine
&lt;/li&gt;
&lt;li&gt;Reverse progress bar logic
&lt;/li&gt;
&lt;li&gt;Anti-UX interactions
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was simple:&lt;br&gt;
👉 Build something functional&lt;br&gt;&lt;br&gt;
👉 But completely useless  &lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If this app helped you avoid your work today…&lt;/p&gt;

&lt;p&gt;👉 It worked perfectly 🚀&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>My Portfolio Explains Itself: Building an AI-Powered Architecture Visualizer with Gemini</title>
      <dc:creator>MakendranG</dc:creator>
      <pubDate>Sun, 01 Feb 2026 11:52:36 +0000</pubDate>
      <link>https://dev.to/makendrang/my-portfolio-explains-itself-building-an-ai-powered-architecture-visualizer-with-gemini-444e</link>
      <guid>https://dev.to/makendrang/my-portfolio-explains-itself-building-an-ai-powered-architecture-visualizer-with-gemini-444e</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/new-year-new-you-google-ai-2025-12-31"&gt;New Year, New You Portfolio Challenge Presented by Google AI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;I'm a cloud and AI-focused developer who enjoys building systems that are not just functional, but &lt;strong&gt;explainable&lt;/strong&gt;. Over the years, I've worked with cloud-native architectures, DevOps workflows, and AI-powered applications, and I've noticed a recurring problem: great systems are often hard to understand at a glance.&lt;/p&gt;

&lt;p&gt;With this portfolio, I wanted to go beyond a static showcase of projects. My goal was to create an &lt;strong&gt;interactive experience&lt;/strong&gt; that reflects how I think as a developer — focused on clarity, scalability, and real-world impact — while also demonstrating how AI can make complex architectures easier to understand for everyone, not just engineers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolio
&lt;/h2&gt;

&lt;p&gt;My portfolio is a &lt;strong&gt;live, deployed application&lt;/strong&gt; that visualizes my app architecture and uses &lt;strong&gt;Gemini to explain how traffic flows&lt;/strong&gt; through the system in real time.&lt;/p&gt;

&lt;p&gt;It walks visitors through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entry points (user → Cloud Run)&lt;/li&gt;
&lt;li&gt;API interactions&lt;/li&gt;
&lt;li&gt;Data persistence layers&lt;/li&gt;
&lt;li&gt;AI model interactions&lt;/li&gt;
&lt;li&gt;End-to-end request flow&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%2Fnur73cin38jtv2irxz1m.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%2Fnur73cin38jtv2irxz1m.png" alt=" " width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Live Demo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AI Studio Interactive Demo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://ai.studio/apps/drive/1vBdmQDopRJUmXpjv1sdEF5x_CdsEzssf?fullscreenApplet=true" rel="noopener noreferrer"&gt;Launch Portfolio Visualizer →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/MakendranG/gemini-portfolio-visualizer" rel="noopener noreferrer"&gt;MakendranG/gemini-portfolio-visualizer →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This allows recruiters, engineers, and even non-technical visitors to understand what's happening under the hood &lt;strong&gt;without needing to read architecture diagrams or documentation&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Lightweight web UI for architecture visualization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Containerized service deployed on Google Cloud Run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI&lt;/strong&gt;: Gemini (via Google AI tools) for natural-language architecture explanations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure&lt;/strong&gt;: Google Cloud (Cloud Run, APIs, IAM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Container-based CI-friendly setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Code&lt;/strong&gt;: Available on &lt;a href="https://github.com/MakendranG/gemini-portfolio-visualizer" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Google AI Tools Used
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini models&lt;/strong&gt; to:

&lt;ul&gt;
&lt;li&gt;Interpret architecture components&lt;/li&gt;
&lt;li&gt;Generate step-by-step traffic flow explanations&lt;/li&gt;
&lt;li&gt;Adapt explanations based on user-selected components&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;AI Studio&lt;/strong&gt; for rapid prototyping and deployment&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Gemini APIs&lt;/strong&gt; to refine prompts and integrate intelligent explanations&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Design Decisions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kept the UI &lt;strong&gt;intentionally minimal&lt;/strong&gt; so the architecture and explanations stay front and center&lt;/li&gt;
&lt;li&gt;Focused on &lt;strong&gt;explainability&lt;/strong&gt;, not just visuals&lt;/li&gt;
&lt;li&gt;Designed prompts to explain the same architecture at &lt;strong&gt;different levels of depth&lt;/strong&gt;, depending on the viewer&lt;/li&gt;
&lt;li&gt;Made the entire project &lt;strong&gt;open source&lt;/strong&gt; so other developers can learn from and build upon it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire app is &lt;strong&gt;stateless, fast to spin up&lt;/strong&gt;, and well within the &lt;strong&gt;Google Cloud Free Tier&lt;/strong&gt;, making it practical as well as production-aligned.&lt;/p&gt;

&lt;h3&gt;
  
  
  Development Process
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prototyped in AI Studio&lt;/strong&gt; - Experimented with different Gemini prompts to find the best way to explain architecture concepts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built the visualization layer&lt;/strong&gt; - Created interactive components that respond to user clicks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrated Gemini API&lt;/strong&gt; - Connected the frontend to Gemini for real-time explanations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containerized &amp;amp; Deployed&lt;/strong&gt; - Packaged everything for Cloud Run deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open sourced&lt;/strong&gt; - Published the complete source code on GitHub for the community&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I'm Most Proud Of
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🧠 AI-powered explainability&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Gemini doesn't just describe components — it explains &lt;strong&gt;why&lt;/strong&gt; traffic flows the way it does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;☁️ Cloud-native by design&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Fully containerized and deployed on Cloud Run, following real-world best practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Audience-aware explanations&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The same architecture can be understood by a junior developer, a product manager, or a senior engineer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 A portfolio that does something&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Instead of &lt;em&gt;telling&lt;/em&gt; people I understand cloud architectures, this portfolio &lt;strong&gt;shows&lt;/strong&gt; it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💻 Open source contribution&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The complete source code is available on &lt;a href="https://github.com/MakendranG/gemini-portfolio-visualizer" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, making it a learning resource for the developer community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎨 Built with Google AI Studio&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Leveraged AI Studio's rapid prototyping capabilities to iterate quickly and deploy seamlessly.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://ai.studio/apps/drive/1vBdmQDopRJUmXpjv1sdEF5x_CdsEzssf?fullscreenApplet=true" rel="noopener noreferrer"&gt;AI Studio App&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Code&lt;/strong&gt;: &lt;a href="https://github.com/MakendranG/gemini-portfolio-visualizer" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture Docs&lt;/strong&gt;: See the README in the GitHub repo&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt; Click any component in the live demo and watch Gemini explain how your request travels through the system! 🎯&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
