<?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: abdullah haroon</title>
    <description>The latest articles on DEV Community by abdullah haroon (@abdullah_haroon_092cf10d3).</description>
    <link>https://dev.to/abdullah_haroon_092cf10d3</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%2F3372552%2F75ee3d6d-25aa-47f9-bd92-d72689e0c776.jpg</url>
      <title>DEV Community: abdullah haroon</title>
      <link>https://dev.to/abdullah_haroon_092cf10d3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdullah_haroon_092cf10d3"/>
    <language>en</language>
    <item>
      <title>MAYHEM: A Monster-Collecting Battle Game built with AdaL and Cloudinary ⚔️</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Tue, 27 Oct 2026 01:16:40 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/mayhem-a-monster-collecting-battle-game-built-with-adal-and-cloudinary-hf3</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/mayhem-a-monster-collecting-battle-game-built-with-adal-and-cloudinary-hf3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Create your legend. Collect the extraordinary. Fight for glory.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What if you could upload an image, turn it into a collectible monster, build a squad of three, and take it into a turn-based battle?&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;MAYHEM — Monster Fighting Arena&lt;/strong&gt;, an open-source browser game where you collect creatures, create your own fighters from images, and battle rival tamers in a dark-fantasy world.&lt;/p&gt;

&lt;p&gt;I built MAYHEM using &lt;strong&gt;AdaL, an AI-assisted development workflow&lt;/strong&gt;, and integrated &lt;strong&gt;Cloudinary&lt;/strong&gt; to handle monster artwork uploads, image transformations, optimized delivery, and shareable collectible cards. Here’s a look at the project, the technology behind it, and what you can explore in the game.&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%2Fy5uf8bhqf3bt1kn21mfl.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%2Fy5uf8bhqf3bt1kn21mfl.PNG" alt=" " width="799" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎮 What is MAYHEM?
&lt;/h2&gt;

&lt;p&gt;MAYHEM is a browser-based monster-collecting and turn-based battle game. It runs on desktop, tablet, and mobile without requiring installation or an account. The core idea is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collect:&lt;/strong&gt; Discover monsters across six elemental types and four rarity tiers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create:&lt;/strong&gt; Upload an image and transform it into a custom monster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build:&lt;/strong&gt; Assemble a team of three monsters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battle:&lt;/strong&gt; Fight opponents using attacks, special abilities, defensive moves, items, and team switching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress:&lt;/strong&gt; Earn coins and XP, unlock new species, complete quests, and improve your monsters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The game combines collectible-card mechanics with RPG-style progression and turn-based combat.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Explore the game
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Discover: Enter the arena
&lt;/h3&gt;

&lt;p&gt;The home screen introduces the world of MAYHEM through a cinematic fantasy scene, animated effects, featured discoveries, daily rewards, and progression information.&lt;/p&gt;

&lt;p&gt;The interface uses a dark purple atmosphere, glowing accents, and fiery orange calls to action to create an arcade-inspired fantasy experience.&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%2Fybhqi4da2rivvod3r05p.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%2Fybhqi4da2rivvod3r05p.PNG" alt=" " width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Collection: Build your bestiary
&lt;/h3&gt;

&lt;p&gt;Every monster has its own identity, elemental type, rarity, stats, and special ability.&lt;/p&gt;

&lt;p&gt;The collection includes four rarity tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Common&lt;/li&gt;
&lt;li&gt;Rare&lt;/li&gt;
&lt;li&gt;Epic&lt;/li&gt;
&lt;li&gt;Legendary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can search for monsters, filter by element or rarity, sort your collection, and mark favourites. Higher rarity cards can feature foil and holographic-style finishes.&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%2Fxghlay5hr8y536cx9tws.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%2Fxghlay5hr8y536cx9tws.PNG" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create Your Monster: Turn images into fighters
&lt;/h3&gt;

&lt;p&gt;This is one of my favourite parts of the project.&lt;/p&gt;

&lt;p&gt;Instead of choosing only from predefined creatures, players can upload an image, drag and drop a file, paste an image, or use bundled sample artwork. They can then customize the monster's name, element, and rarity, choose a battle style, and preview its collectible card before creating it. The creation studio also includes generated stats, special abilities, and a full-screen reveal when a new monster is born.&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%2Fyiswn0s4ule4pr772h6y.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%2Fyiswn0s4ule4pr772h6y.PNG" alt=" " width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Battle Arena: Strategy matters
&lt;/h3&gt;

&lt;p&gt;Players select a squad of three monsters and face rival tamers in turn-based battles.&lt;/p&gt;

&lt;p&gt;Available actions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attack:&lt;/strong&gt; Deal damage to the opponent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Special:&lt;/strong&gt; Use a powerful monster ability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defend:&lt;/strong&gt; Reduce incoming damage and gain defensive benefits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch:&lt;/strong&gt; Change the active monster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Items:&lt;/strong&gt; Use available battle items.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combat also includes elemental matchups, speed-based turn order, critical hits, status effects, shields, and buffs. The arena has three difficulty tiers, each with its own setting: Verdant Ruins, Stormspire Citadel, and Infernal Throne.&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%2F6ksml6n9rep6k5si9smm.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%2F6ksml6n9rep6k5si9smm.PNG" alt=" " width="799" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Progression and Shop: Keep getting stronger
&lt;/h3&gt;

&lt;p&gt;Battles and quests feed into the game's progression system. Players earn XP and coins, level up their summoner, unlock additional monster species, purchase stat boosts, learn skills, and acquire battle items. Achievements, collection milestones, daily quests, and login streaks provide more goals beyond simply winning fights.&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%2F16e3l6w43tsqmcswozi9.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%2F16e3l6w43tsqmcswozi9.PNG" alt=" " width="799" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤖 Building with AdaL
&lt;/h2&gt;

&lt;p&gt;MAYHEM was designed and developed with AdaL, an AI-assisted development workflow. AdaL helped with several parts of the project, including game design, UI and UX, the battle engine, procedural audio, and Cloudinary integration.&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%2Fbwxp9y02yu8qeua2kaaw.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%2Fbwxp9y02yu8qeua2kaaw.PNG" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A project like this requires more than generating a few screens. The interface, game rules, monster stats, battle actions, progression, image uploads, and saved state all need to work together. That made MAYHEM an opportunity to bring several pieces into one playable experience rather than build a static mockup.&lt;/p&gt;

&lt;h2&gt;
  
  
  ☁️ How Cloudinary powers MAYHEM
&lt;/h2&gt;

&lt;p&gt;Monster creation depends on images, so image handling is a core part of the experience—not just an extra feature.&lt;/p&gt;

&lt;p&gt;I integrated &lt;strong&gt;Cloudinary&lt;/strong&gt; to manage monster artwork and make it suitable for different parts of the game.&lt;/p&gt;

&lt;p&gt;Here's how it is used:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cloudinary capability&lt;/th&gt;
&lt;th&gt;How MAYHEM uses it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unsigned uploads&lt;/td&gt;
&lt;td&gt;Upload monster artwork directly from the browser using an upload preset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image transformations&lt;/td&gt;
&lt;td&gt;Crop and resize images for collectible cards and thumbnails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automatic format and quality&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;f_auto,q_auto&lt;/code&gt; for optimized image delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smart cropping&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;c_fill,g_auto&lt;/code&gt; to fill the card frame while focusing on the subject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional background removal&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;e_background_removal&lt;/code&gt; when the required add-on is available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareable card images&lt;/td&gt;
&lt;td&gt;Render monster details, rarity, stats, abilities, and borders into shareable cards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN delivery&lt;/td&gt;
&lt;td&gt;Load artwork at responsive sizes with lazy loading and fallbacks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, the transformation settings can request an automatically selected format and quality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f_auto,q_auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a card image that needs to fill a portrait frame while keeping the main subject in focus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c_fill,g_auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These transformations help serve artwork in a form suited to the game's collectible cards.&lt;/p&gt;

&lt;h3&gt;
  
  
  A small but important security detail
&lt;/h3&gt;

&lt;p&gt;The browser uses an unsigned upload preset and browser-safe Cloudinary configuration. The Cloudinary API secret is never exposed through a &lt;code&gt;VITE_&lt;/code&gt; environment variable.&lt;/p&gt;

&lt;p&gt;Game data—such as monster stats, inventory, progression, and battle rules—remains separate from image hosting. Cloudinary handles the images, while the game handles the gameplay.&lt;/p&gt;

&lt;p&gt;MAYHEM also has a fallback: if Cloudinary isn't configured, the game can process uploaded artwork in the browser and save it on the device. It reports that fallback rather than pretending a cloud upload succeeded.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Tech stack
&lt;/h2&gt;

&lt;p&gt;The project uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React 18&lt;/strong&gt; — UI and reusable components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript 5&lt;/strong&gt; — typed game data and application logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite 5&lt;/strong&gt; — development server and production build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS 4&lt;/strong&gt; — styling and interface design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudinary&lt;/strong&gt; — image uploads, transformations, and delivery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Audio API&lt;/strong&gt; — procedural music and sound effects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;localStorage&lt;/strong&gt; — local game saves and player progression&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AdaL&lt;/strong&gt; — AI-assisted development workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The game logic is organized into modules for elements, monster data, stats, combat rules, turn order, progression, and persistence. The UI is divided into screens and reusable components.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌱 What's next?
&lt;/h2&gt;

&lt;p&gt;MAYHEM is open source under the &lt;strong&gt;MIT License&lt;/strong&gt;. The project can be forked, modified, reskinned, and extended.&lt;/p&gt;

&lt;p&gt;Some areas where contributors could help include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding new monsters, elements, and abilities&lt;/li&gt;
&lt;li&gt;Improving battle balance&lt;/li&gt;
&lt;li&gt;Online Multiplayer&lt;/li&gt;
&lt;li&gt;Creating new arena environments&lt;/li&gt;
&lt;li&gt;Improving accessibility and translations&lt;/li&gt;
&lt;li&gt;Exploring a real backend for persistent player accounts and shared progression&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current game saves progress locally through &lt;code&gt;localStorage&lt;/code&gt;, with a storage adapter that can support a future backend implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Try it, fork it, improve it
&lt;/h2&gt;

&lt;p&gt;MAYHEM brings together creature collection, image-driven customization, turn-based combat, progression systems, and cloud-powered image handling in one browser game.&lt;/p&gt;

&lt;p&gt;I'm especially interested in the possibilities of letting players create their own creatures instead of being limited to a predefined roster. If you're interested in game development, AI-assisted coding, React, or Cloudinary image workflows, I'd love for you to explore the project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project repository:&lt;/strong&gt; &lt;a href="https://github.com/ab2030909/MAYHEM-monsters-card-game" rel="noopener noreferrer"&gt;https://github.com/ab2030909/MAYHEM-monsters-card-game&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Website Link:&lt;/strong&gt; &lt;a href="https://mayhem-monsters.vercel.app/" rel="noopener noreferrer"&gt;https://mayhem-monsters.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built with:&lt;/strong&gt; AdaL + React + TypeScript + Cloudinary&lt;/p&gt;

&lt;p&gt;If you check it out, let me know: &lt;strong&gt;what kind of monster would you create first?&lt;/strong&gt; 🔥&lt;/p&gt;




&lt;p&gt;⚔️ &lt;strong&gt;Enter the arena. Unleash MAYHEM.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Meet NEXI: A Windows Focus Companion Built with Python and AdaL</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Mon, 26 Oct 2026 02:09:50 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/meet-nexi-a-windows-focus-companion-built-with-python-and-adal-252l</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/meet-nexi-a-windows-focus-companion-built-with-python-and-adal-252l</guid>
      <description>&lt;p&gt;What if your computer could help you understand where your time goes and gently remind you when it's time to get back on track?&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;strong&gt;NEXI: Your Focus Companion&lt;/strong&gt;, a Windows desktop productivity app I've been building with Python, PySide6, and AdaL.&lt;/p&gt;

&lt;p&gt;NEXI combines activity tracking, focus sessions, intention-based work, visual analytics, and a small floating companion into one desktop application. The goal isn't to control every minute of your day. It's to make your digital habits easier to understand and help you work with more intention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built NEXI
&lt;/h2&gt;

&lt;p&gt;We spend hours switching between code editors, browsers, chats, and other applications. Sometimes that time is productive. Sometimes we open a browser to look up one thing and end up somewhere completely different. I wanted a desktop tool that could help answer a few simple questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where did my computer time actually go?&lt;/li&gt;
&lt;li&gt;Which applications and websites occupied most of it?&lt;/li&gt;
&lt;li&gt;When am I most active?&lt;/li&gt;
&lt;li&gt;Can I set a clear intention before starting a focus session?&lt;/li&gt;
&lt;li&gt;Can productivity tools feel useful without looking boring or intrusive?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That became the starting point for NEXI.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Focus Center: One place to start a session
&lt;/h2&gt;

&lt;p&gt;The Focus Center is the main dashboard. It brings the current focus session, timer, active foreground application, and daily activity summaries together.&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%2Fqah1da38c3pbw8tyq9fr.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%2Fqah1da38c3pbw8tyq9fr.PNG" alt=" " width="799" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dashboard includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Focus sessions with a circular countdown.&lt;/li&gt;
&lt;li&gt;Focus modes such as Deep Work and Custom.&lt;/li&gt;
&lt;li&gt;Intent Mode for setting a task and time budget.&lt;/li&gt;
&lt;li&gt;Screen time, productive time, distractions, and daily goal metrics.&lt;/li&gt;
&lt;li&gt;Most-used applications and tracked website summaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted the main screen to answer one question quickly: &lt;em&gt;What is happening on my computer right now?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Intent Mode: Work with a purpose
&lt;/h2&gt;

&lt;p&gt;One of NEXI's key ideas is &lt;strong&gt;Intent Mode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before starting a session, you can define a task, choose a time budget, and optionally specify a target platform.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Study compiler design for 45 minutes.&lt;/li&gt;
&lt;li&gt;Find a solution to an authentication bug.&lt;/li&gt;
&lt;li&gt;Watch a programming tutorial without losing track of time.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ddbxfvwpwtfwg1fhgvw.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%2F4ddbxfvwpwtfwg1fhgvw.PNG" alt=" " width="579" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The idea is simple: instead of opening an application without a plan, start with a specific reason for being there.&lt;/p&gt;

&lt;p&gt;Intent Mode is designed to support accountability through a defined objective and countdown. Its behavior depends on the features and integrations enabled in the current build.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Focus Radar: Turn activity into something understandable
&lt;/h2&gt;

&lt;p&gt;Raw activity logs aren't very helpful if you can't see the patterns in them.&lt;/p&gt;

&lt;p&gt;Focus Radar presents tracked activity through visual summaries, hourly bars, time-period filters, and application and website breakdowns.&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%2Fzt47f3rapdz0zqfrhwoa.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%2Fzt47f3rapdz0zqfrhwoa.PNG" alt=" " width="799" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dashboard is designed to help answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much active time did I record today?&lt;/li&gt;
&lt;li&gt;Which application did I use most?&lt;/li&gt;
&lt;li&gt;When was my activity highest?&lt;/li&gt;
&lt;li&gt;Which websites accounted for tracked distraction time?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The emphasis is on visual clarity. Bars and ranked lists make it easier to spot patterns than reading a long list of timestamps.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Understand which applications consume your time
&lt;/h2&gt;

&lt;p&gt;NEXI can track the foreground application and present application usage alongside website activity where supported.&lt;/p&gt;

&lt;p&gt;The purpose isn't to judge every application as good or bad. A browser can be essential for research, just as an editor can be essential for coding. Context matters. The useful part is being able to see where time accumulated and use that information to make better decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. A settings page that gives users control
&lt;/h2&gt;

&lt;p&gt;Productivity tools need to adapt to the person using them.&lt;/p&gt;

&lt;p&gt;NEXI's Settings page brings appearance preferences, attention controls, timers, website limits, and monitoring options into one place.&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%2F11rzpkhs0m993vs92ahi.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%2F11rzpkhs0m993vs92ahi.PNG" alt=" " width="799" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The appearance controls include a dark theme, OLED-style black, Midnight Orange, a light theme, and custom color values.&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%2F31vik75emzkte5qvppv3.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%2F31vik75emzkte5qvppv3.PNG" alt=" " width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app also has a break experience with a breathing prompt and controls to resume focus or extend the break. Other attention and website-control options depend on the current implementation and configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. A small companion, not another noisy notification
&lt;/h2&gt;

&lt;p&gt;I also wanted NEXI to have a recognizable personality.&lt;/p&gt;

&lt;p&gt;The floating companion is designed to sit alongside the desktop workflow rather than demand constant attention. It gives the app a visual identity beyond another timer and collection of charts. The design direction is deliberately focused: dark surfaces, orange highlights, clear typography, and compact cards.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Built with Python, PySide6, and AdaL
&lt;/h2&gt;

&lt;p&gt;NEXI is a Windows desktop application built with Python and PySide6 (Qt) using AdaL.&lt;/p&gt;

&lt;p&gt;The project brings together several pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PySide6:&lt;/strong&gt; desktop interface and interactive components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows APIs:&lt;/strong&gt; foreground application detection and idle-time awareness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite:&lt;/strong&gt; local activity and settings storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chromium browser integration:&lt;/strong&gt; optional support for more accurate website attribution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groq API:&lt;/strong&gt; optional AI habit insights, when configured.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used AdaL as a coding assistant throughout development. It helped me work through implementation tasks and iterate on the application, while the project itself remains a software system that needs practical verification and refinement.&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%2F9hw1vlw2d30r5ojmsz2s.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%2F9hw1vlw2d30r5ojmsz2s.PNG" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The architecture aims to keep everyday activity tracking local. Optional AI insights are a separate capability and should be enabled only when the user wants to use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Privacy and user control
&lt;/h2&gt;

&lt;p&gt;Activity tracking is personal, so privacy needs to be part of the design rather than an afterthought.&lt;/p&gt;

&lt;p&gt;NEXI is designed around local storage for activity records. Its optional browser integration communicates with a local service, and the optional AI coach is intended to use high-level summaries rather than raw browsing history.&lt;/p&gt;

&lt;p&gt;Users should still review the settings and privacy documentation for the exact behavior of the release they install, especially before enabling optional integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;There is always more to improve in a desktop productivity app. My next priorities are making the experience more polished, keeping the dashboard responsive, improving empty states and activity summaries, and ensuring that focus and attention controls behave consistently. I also want the project to be straightforward for other developers to explore, build, and contribute to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try NEXI
&lt;/h2&gt;

&lt;p&gt;NEXI is built for people who want a clearer picture of their computer habits and a more intentional way to approach focus sessions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ab2030909/NEXI-focus-companion" rel="noopener noreferrer"&gt;https://github.com/ab2030909/NEXI-focus-companion&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Releases:&lt;/strong&gt; &lt;a href="https://github.com/ab2030909/NEXI-focus-companion/releases/latest" rel="noopener noreferrer"&gt;https://github.com/ab2030909/NEXI-focus-companion/releases/latest&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're interested in desktop productivity tools, Python GUI applications, or building software with AI coding assistants, I'd love to hear your thoughts.&lt;/p&gt;

&lt;p&gt;What feature would make a focus companion genuinely useful in your daily workflow?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Python, PySide6, and AdaL.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>productivity</category>
      <category>github</category>
    </item>
    <item>
      <title>Building Transforma: A Cloudinary Image Transformation and Benchmarking Playground</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Wed, 14 Oct 2026 23:33:52 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/building-transforma-a-cloudinary-image-transformation-and-benchmarking-playground-16ch</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/building-transforma-a-cloudinary-image-transformation-and-benchmarking-playground-16ch</guid>
      <description>&lt;p&gt;Imagine you're building a web application that displays hundreds of images.&lt;/p&gt;

&lt;p&gt;Everything works perfectly on your development machine. But then you notice that some images are unnecessarily large, mobile users are downloading more data than they need, and you're not sure whether your image optimization settings are actually helping.&lt;/p&gt;

&lt;p&gt;You start changing image dimensions, experimenting with compression, and manually editing transformation URLs. One configuration produces a smaller file, another preserves better quality, and a third behaves differently when delivered through the CDN.&lt;/p&gt;

&lt;p&gt;Now you have another problem: &lt;strong&gt;How do you compare these configurations without turning image optimization into a repetitive manual process?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted to explore a better way to approach this problem.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;Transforma&lt;/strong&gt; , an interactive developer workbench for building, visualizing, comparing, and benchmarking Cloudinary image-transformation pipelines. The idea is simple: give developers a place to experiment with image transformations, inspect the results, measure what actually changes, and export the configurations they want to use in their applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transform. Optimize. Measure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3meq1rtdg9eitjgxzyi5.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%2F3meq1rtdg9eitjgxzyi5.PNG" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: Image optimization is more than compression
&lt;/h2&gt;

&lt;p&gt;When I started thinking about this project, I wanted to focus on a problem developers encounter in real applications.&lt;/p&gt;

&lt;p&gt;Consider a platform that displays workspace photographs, user profile pictures, product images, and community posts. Each image may be displayed in a different context. A small profile card doesn't need the same dimensions as a full-width desktop banner. A mobile layout may need a smaller image than a high-resolution display.&lt;/p&gt;

&lt;p&gt;Serving the original image everywhere can waste bandwidth. Manually generating multiple versions introduces additional work, and aggressive compression can reduce visual quality. I identified four practical challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Oversized images:&lt;/strong&gt; Delivering unnecessarily large images increases the amount of data transferred.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex transformations:&lt;/strong&gt; Developers need to manage resizing, cropping, formats, and quality settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality trade-offs:&lt;/strong&gt; Smaller files are useful, but not when the resulting image looks noticeably worse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited visibility:&lt;/strong&gt; Without actual measurements, it's difficult to compare different optimization strategies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted a tool that would make these trade-offs easier to explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Cloudinary?
&lt;/h2&gt;

&lt;p&gt;Instead of building my own image-processing infrastructure, I chose to build around Cloudinary's existing media capabilities.&lt;/p&gt;

&lt;p&gt;Cloudinary provides APIs for uploading and managing media, URL-based image transformations, and CDN delivery. It also supports automatic format and quality selection through transformation parameters such as &lt;code&gt;f_auto&lt;/code&gt; and &lt;code&gt;q_auto&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This meant I could focus on the developer experience rather than implementing a custom image-processing engine.&lt;/p&gt;

&lt;p&gt;The responsibilities became clearer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudinary handles image storage, supported transformations, and media delivery.&lt;/li&gt;
&lt;li&gt;Transforma provides the visual interface for configuring transformations.&lt;/li&gt;
&lt;li&gt;The browser displays the results and measures observable delivery characteristics.&lt;/li&gt;
&lt;li&gt;The application generates reusable URLs and code snippets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That separation became the foundation of the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Transforma
&lt;/h2&gt;

&lt;p&gt;Transforma is a developer-focused playground built with Next.js, TypeScript, Tailwind CSS, and the official Cloudinary Node.js SDK. It brings several related workflows into one workspace:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload an image.&lt;/li&gt;
&lt;li&gt;Configure transformation parameters.&lt;/li&gt;
&lt;li&gt;Compare the original and transformed versions.&lt;/li&gt;
&lt;li&gt;Inspect image dimensions, formats, and available file-size measurements.&lt;/li&gt;
&lt;li&gt;Benchmark delivery requests.&lt;/li&gt;
&lt;li&gt;Export the resulting transformation URL or code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rather than manually assembling every URL, developers can experiment through a visual interface and see how their choices affect the resulting image.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Building image transformation pipelines visually
&lt;/h2&gt;

&lt;p&gt;Cloudinary transformations are powerful, but manually constructing URLs can become tedious when experimenting with multiple combinations of parameters.&lt;/p&gt;

&lt;p&gt;Transforma provides controls for the most common image-transformation operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resizing images
&lt;/h3&gt;

&lt;p&gt;Developers can specify custom dimensions or choose preset widths such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;320px&lt;/li&gt;
&lt;li&gt;640px&lt;/li&gt;
&lt;li&gt;800px&lt;/li&gt;
&lt;li&gt;1200px&lt;/li&gt;
&lt;li&gt;1920px&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if an image is displayed in an 800-pixel-wide container, delivering a much larger image may be unnecessary for that particular use case.&lt;/p&gt;

&lt;p&gt;A transformation can limit the output width while preserving the image's proportions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing a cropping strategy
&lt;/h3&gt;

&lt;p&gt;Different layouts require different cropping behavior.&lt;/p&gt;

&lt;p&gt;Transforma supports these Cloudinary transformation modes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;c_fit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fit the image within the requested dimensions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;c_fill&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fill the target dimensions, cropping when necessary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;c_crop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extract a region from the source image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;c_scale&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scale the image to the requested dimensions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, a profile image may need a consistent square shape, while a workspace photograph may need to preserve more of the original scene.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimizing format and quality
&lt;/h3&gt;

&lt;p&gt;One of Cloudinary's useful features is automatic format and quality selection.&lt;/p&gt;

&lt;p&gt;A transformation such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f_auto,q_auto,w_800
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;requests automatic format and quality selection with a target width of 800 pixels.&lt;/p&gt;

&lt;p&gt;The delivered format and resulting file size depend on the source image, browser capabilities, and delivery configuration. Rather than assuming the transformation always produces a particular result, Transforma lets developers inspect the output.&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%2Fryhyk7lvmni64lu47bo0.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%2Fryhyk7lvmni64lu47bo0.PNG" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced options
&lt;/h3&gt;

&lt;p&gt;The playground also provides access to options such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dpr_auto&lt;/code&gt; for device-pixel-ratio-aware delivery.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;g_auto&lt;/code&gt; for automatic gravity and subject-aware cropping where supported.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fl_strip_profile&lt;/code&gt; for removing supported image profile metadata.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These options make the playground useful for exploring more than basic resizing and compression.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Comparing images instead of guessing
&lt;/h2&gt;

&lt;p&gt;Reducing an image's file size is only part of the problem. The image should still look good.&lt;/p&gt;

&lt;p&gt;For this reason, Transforma includes two visual comparison modes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before-and-after slider:&lt;/strong&gt; Move a divider across the preview to inspect the original and transformed versions in the same viewing area.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Side-by-side comparison:&lt;/strong&gt; Display both versions simultaneously to compare composition, sharpness, and visible compression artifacts.&lt;/p&gt;

&lt;p&gt;The workspace can also display relevant asset information, including dimensions, available file-size measurements, delivered format, and the active transformation settings.&lt;/p&gt;

&lt;p&gt;This makes it easier to understand what actually changed between configurations.&lt;/p&gt;

&lt;p&gt;The important idea is that developers should be able to inspect both the visual result and the technical properties of the image.&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%2Fx0ett70jz9ehyu6v6jrs.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%2Fx0ett70jz9ehyu6v6jrs.PNG" alt=" " width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Measuring actual image-delivery performance
&lt;/h2&gt;

&lt;p&gt;This is where Transforma goes beyond being a simple image editor.&lt;/p&gt;

&lt;p&gt;A smaller image doesn't automatically guarantee a faster request. Delivery performance also depends on network conditions, browser caching, connection reuse, and CDN behavior. I designed the benchmarking workflow to compare several configurations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The original image.&lt;/li&gt;
&lt;li&gt;An automatically optimized image.&lt;/li&gt;
&lt;li&gt;A resized image with automatic optimization.&lt;/li&gt;
&lt;li&gt;A higher-quality transformed variant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The browser makes real requests to Cloudinary's delivery endpoints and collects measurements that are available to JavaScript.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does the benchmark measure?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Downloaded bytes&lt;/td&gt;
&lt;td&gt;Shows the delivered payload size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image dimensions&lt;/td&gt;
&lt;td&gt;Helps verify the resulting image size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivered format&lt;/td&gt;
&lt;td&gt;Identifies the resulting encoding when detectable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request duration&lt;/td&gt;
&lt;td&gt;Measures client-observed request timing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Byte savings&lt;/td&gt;
&lt;td&gt;Quantifies the payload difference against the baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, the percentage reduction in file size can be calculated as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Savings (%) =
  ((Original Size - Transformed Size) / Original Size) × 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives developers a consistent way to compare the payload impact of different transformation settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the benchmarking workflow works
&lt;/h3&gt;

&lt;p&gt;The process follows a straightforward sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate the URLs for the selected transformation scenarios.&lt;/li&gt;
&lt;li&gt;Request the images from Cloudinary's CDN.&lt;/li&gt;
&lt;li&gt;Measure elapsed time using the browser's &lt;code&gt;performance.now()&lt;/code&gt; API.&lt;/li&gt;
&lt;li&gt;Read available response metadata or inspect downloaded Blob sizes.&lt;/li&gt;
&lt;li&gt;Inspect image dimensions and format where possible.&lt;/li&gt;
&lt;li&gt;Aggregate the results into a comparison report.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The intention is to use actual request results rather than predetermined performance numbers.&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%2Fie0p86ff3gktmhn1zdxo.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%2Fie0p86ff3gktmhn1zdxo.png" alt=" " width="800" height="714"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the limitations
&lt;/h3&gt;

&lt;p&gt;Browser-based measurements require some care.&lt;/p&gt;

&lt;p&gt;Cross-origin restrictions may prevent JavaScript from reading certain response headers. Cached responses may also behave differently from requests that transfer the image over the network.&lt;/p&gt;

&lt;p&gt;Adding a unique query parameter can help distinguish benchmark requests, but it does not guarantee a cold Cloudinary edge cache. Similarly, a browser-observed request duration is not the same as measuring the entire page's loading performance. For meaningful comparisons, test conditions should be documented and repeated measurements considered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal is not to promise a particular speed improvement. It is to help developers understand the trade-offs using observable evidence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepxl1nx39ye4px0rptp9.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%2Fepxl1nx39ye4px0rptp9.PNG" alt=" " width="787" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Securing direct image uploads
&lt;/h2&gt;

&lt;p&gt;Another important part of Transforma is the upload workflow.&lt;/p&gt;

&lt;p&gt;When users upload images, the application needs to authorize the upload without exposing sensitive Cloudinary credentials in the browser.&lt;/p&gt;

&lt;p&gt;I used a server-signed upload architecture built with Next.js Route Handlers and the official Cloudinary Node.js SDK.&lt;/p&gt;

&lt;p&gt;Here's how the flow works:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    autonumber
    actor User as Browser
    participant API as Next.js API
    participant SDK as Cloudinary SDK
    participant Cloud as Cloudinary Upload API

    User-&amp;gt;&amp;gt;API: Request upload authorization
    API-&amp;gt;&amp;gt;SDK: Sign permitted parameters
    Note over API,SDK: API secret stays server-side
    SDK--&amp;gt;&amp;gt;API: Return signature
    API--&amp;gt;&amp;gt;User: Signature and upload configuration
    User-&amp;gt;&amp;gt;Cloud: Upload image directly
    Cloud--&amp;gt;&amp;gt;User: Return asset metadata
    User-&amp;gt;&amp;gt;User: Update image preview&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The workflow has a few important steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The browser requests upload authorization from &lt;code&gt;POST /api/sign-upload&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The server generates a timestamp and signs the permitted upload parameters.&lt;/li&gt;
&lt;li&gt;The browser receives the signature and public upload configuration.&lt;/li&gt;
&lt;li&gt;The image is uploaded directly to Cloudinary.&lt;/li&gt;
&lt;li&gt;The application receives the asset metadata and updates the interface.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The signing logic follows this pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&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="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;api_sign_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transforma-pipeline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CLOUDINARY_API_SECRET&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API secret stays on the server. The browser receives the signature required for the upload, not the secret itself.&lt;/p&gt;

&lt;p&gt;The implementation also needs server-side validation of upload parameters and sensible restrictions on accepted file types and sizes. Client-side validation alone is not sufficient.&lt;/p&gt;

&lt;p&gt;Once an upload succeeds, the returned public ID and asset metadata can be used to generate transformation URLs and update the preview.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. How a transformation becomes a delivered image
&lt;/h2&gt;

&lt;p&gt;The transformation builder is the central part of Transforma.&lt;/p&gt;

&lt;p&gt;Rather than making the application process every image itself, it generates Cloudinary transformation URLs from the selected parameters.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    A[Transformation Controls] --&amp;gt; B[Parameter Compiler]
    B --&amp;gt; C[Cloudinary Transformation URL]
    C --&amp;gt; D[Cloudinary CDN]
    D --&amp;gt; E[Transformed Image]
    D --&amp;gt; F[Visual Comparison]
    D --&amp;gt; G[Code Export]

    A1[Resize and Crop] --&amp;gt; A
    A2[Format and Quality] --&amp;gt; A
    A3[Advanced Options] --&amp;gt; A&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The user changes a setting, such as the target width or output format. The application compiles those choices into a valid transformation URL. Cloudinary then delivers the requested transformed asset, which Transforma displays and makes available for comparison.&lt;/p&gt;

&lt;p&gt;This keeps the application relatively lightweight while allowing developers to explore Cloudinary's media-processing capabilities.&lt;/p&gt;

&lt;p&gt;It also makes transformation configurations easier to reproduce because the parameters are explicit in the generated URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Exporting reusable code
&lt;/h2&gt;

&lt;p&gt;A developer playground becomes much more useful when its output can be used in real applications.&lt;/p&gt;

&lt;p&gt;Transforma provides a code-export panel for copying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudinary delivery URLs.&lt;/li&gt;
&lt;li&gt;HTML image markup.&lt;/li&gt;
&lt;li&gt;Next.js image usage examples.&lt;/li&gt;
&lt;li&gt;JavaScript integration snippets.&lt;/li&gt;
&lt;li&gt;Cloudinary Node.js SDK examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For instance, a generated delivery URL can be used in ordinary HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_CLOUDINARY_TRANSFORMED_IMAGE_URL"&lt;/span&gt;
  &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Optimized image"&lt;/span&gt;
  &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transforma also supports saving named pipeline configurations in browser local storage. Developers can reload these recipes without requiring a separate database or account system.&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%2Fg53j7avl6kp1fu2shzhv.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%2Fg53j7avl6kp1fu2shzhv.PNG" alt=" " width="786" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The technology stack
&lt;/h2&gt;

&lt;p&gt;Transforma uses a lightweight architecture in which each component has a clear responsibility.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Next.js App Router&lt;/td&gt;
&lt;td&gt;Application interface and API routes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;Transformation settings and asset metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tailwind CSS&lt;/td&gt;
&lt;td&gt;Responsive interface styling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lucide React&lt;/td&gt;
&lt;td&gt;Interface icons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudinary Node.js SDK&lt;/td&gt;
&lt;td&gt;Upload signing and Cloudinary integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudinary Upload API&lt;/td&gt;
&lt;td&gt;Direct image uploads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudinary transformation URLs&lt;/td&gt;
&lt;td&gt;Resizing, cropping, and format and quality options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser Performance APIs&lt;/td&gt;
&lt;td&gt;Client-observed benchmark timing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser local storage&lt;/td&gt;
&lt;td&gt;Saved pipeline configurations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cloudinary provides the media infrastructure, while Transforma focuses on making that infrastructure easier to explore and use.&lt;/p&gt;

&lt;p&gt;This means there's no need to build a separate image-processing backend for transformations Cloudinary already supports.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What I learned
&lt;/h2&gt;

&lt;p&gt;Building Transforma helped me think about image optimization as a measurable engineering problem rather than just a collection of URL parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimization depends on context.&lt;/strong&gt; The right dimensions and quality settings depend on where an image is displayed and how much visual detail needs to be preserved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transformations should be reproducible.&lt;/strong&gt; Explicit parameters make it easier to reuse configurations and compare their results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance claims need evidence.&lt;/strong&gt; Payload size and request duration are different metrics. A smaller image can be beneficial without guaranteeing a faster request in every environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security belongs in the architecture.&lt;/strong&gt; Direct uploads can avoid proxying image contents through the application server, but authorization and server-side validation remain essential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer tools should produce reusable results.&lt;/strong&gt; A playground is more valuable when its output can be taken directly into another application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Transforma provides a foundation for experimenting with Cloudinary image-transformation pipelines. Future improvements could include richer responsive-image generation, repeatable benchmark reports, additional transformation presets, and more export options. The broader goal is to help developers understand what a transformation does, inspect its output, and make informed decisions about media delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Transforma
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub repository:&lt;/strong&gt; &lt;a href="https://github.com/ab2030909/Transforma" rel="noopener noreferrer"&gt;https://github.com/ab2030909/Transforma&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://transforma-zeta.vercel.app/" rel="noopener noreferrer"&gt;https://transforma-zeta.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transforma is an independent developer project built with Cloudinary. It is not an official Cloudinary product.&lt;/p&gt;

&lt;p&gt;I'd love to hear how other developers approach image transformation pipelines, responsive media delivery, and performance benchmarking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you balance image quality, payload size, and delivery performance in your applications?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>cloudinary</category>
      <category>productivity</category>
      <category>performance</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building DreamCanvas: An AI Agent That Imagines a New World Every Day | 10 Days of Building AI Agents on AWS | Day 10</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Tue, 01 Sep 2026 03:24:00 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/building-dreamcanvas-an-ai-agent-that-imagines-a-new-world-every-day-10-days-of-building-ai-4j26</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/building-dreamcanvas-an-ai-agent-that-imagines-a-new-world-every-day-10-days-of-building-ai-4j26</guid>
      <description>&lt;h1&gt;
  
  
  Building DreamCanvas: An AI Agent That Imagines a New World Every Day
&lt;/h1&gt;

&lt;h2&gt;
  
  
  10 Days of Building AI Agents on AWS | Day 10
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tag:&lt;/strong&gt; &lt;code&gt;#agents&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DreamCanvas is an always-on AI creative agent that imagines a new fictional world every day before you even open the app.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Vision: Creativity That Does Not Wait
&lt;/h2&gt;

&lt;p&gt;Most creative applications wait for a user to open them, enter a prompt, and request something new.&lt;/p&gt;

&lt;p&gt;I wanted to explore a different idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if a creative application could continue creating even when nobody was actively using it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That idea became &lt;strong&gt;DreamCanvas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DreamCanvas is an autonomous AI creative agent that generates a brand-new fictional world every day.&lt;/p&gt;

&lt;p&gt;Instead of opening an application and asking an AI to imagine something, the user can return later and discover that a completely new world has already been created.&lt;/p&gt;

&lt;p&gt;The experience is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You leave → DreamCanvas keeps working → You return → A new world is waiting&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The goal was to create an experience where inspiration is already waiting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does DreamCanvas Create?
&lt;/h2&gt;

&lt;p&gt;Each generated world has its own identity and creative details.&lt;/p&gt;

&lt;p&gt;A world can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unique world name&lt;/li&gt;
&lt;li&gt;Genre&lt;/li&gt;
&lt;li&gt;Atmosphere&lt;/li&gt;
&lt;li&gt;Tagline&lt;/li&gt;
&lt;li&gt;World overview&lt;/li&gt;
&lt;li&gt;Environment&lt;/li&gt;
&lt;li&gt;Inhabitants&lt;/li&gt;
&lt;li&gt;A special rule of the universe&lt;/li&gt;
&lt;li&gt;Main conflict&lt;/li&gt;
&lt;li&gt;A surprising discovery&lt;/li&gt;
&lt;li&gt;A story seed that could become the beginning of a larger story&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means DreamCanvas does not simply generate a short idea or random paragraph.&lt;/p&gt;

&lt;p&gt;It creates the foundation of an entirely new fictional universe.&lt;/p&gt;

&lt;p&gt;Every day, the agent has the opportunity to create something completely different.&lt;/p&gt;

&lt;p&gt;One day, it might imagine a civilization living beneath an endless ocean.&lt;/p&gt;

&lt;p&gt;The next day, it could create a city where memories are traded as currency.&lt;/p&gt;

&lt;p&gt;Another day, it might imagine a forgotten kingdom floating between planets.&lt;/p&gt;

&lt;p&gt;The user does not need to ask for these worlds.&lt;/p&gt;

&lt;p&gt;They are already waiting.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Always-On Agent Workflow
&lt;/h1&gt;

&lt;p&gt;DreamCanvas works differently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User leaves
        ↓
EventBridge wakes the agent automatically
        ↓
Agent checks recent worlds
        ↓
Agent remembers previous creative directions
        ↓
Agent chooses a different direction
        ↓
Groq generates a new fictional world
        ↓
Lambda validates the response
        ↓
World is stored in DynamoDB
        ↓
User returns later
        ↓
A new world is already waiting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application does useful creative work without waiting for a user to request it.&lt;/p&gt;

&lt;p&gt;That is the main idea I wanted to explore.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lightweight Agent Memory
&lt;/h1&gt;

&lt;p&gt;One of the important features of DreamCanvas is memory.&lt;/p&gt;

&lt;p&gt;Before generating a new world, the agent retrieves recent creations from &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The recent worlds provide context such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Previous world names&lt;/li&gt;
&lt;li&gt;Genres&lt;/li&gt;
&lt;li&gt;Atmospheres&lt;/li&gt;
&lt;li&gt;Settings&lt;/li&gt;
&lt;li&gt;Main concepts&lt;/li&gt;
&lt;li&gt;Inhabitants&lt;/li&gt;
&lt;li&gt;Conflicts&lt;/li&gt;
&lt;li&gt;Summaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This information is provided to the AI during the next generation.&lt;/p&gt;

&lt;p&gt;The agent is instructed to avoid repeating similar creative directions.&lt;/p&gt;

&lt;p&gt;For example, if recent worlds have focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Futuristic cities&lt;/li&gt;
&lt;li&gt;Fantasy kingdoms&lt;/li&gt;
&lt;li&gt;Dark mysterious worlds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next generation can be encouraged to explore something meaningfully different.&lt;/p&gt;

&lt;p&gt;Perhaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A peaceful alien ecosystem&lt;/li&gt;
&lt;li&gt;A world inside a living machine&lt;/li&gt;
&lt;li&gt;A civilization existing in people's dreams&lt;/li&gt;
&lt;li&gt;An ancient world where time moves differently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives DreamCanvas a lightweight form of memory.&lt;/p&gt;

&lt;p&gt;I deliberately did not use a vector database or a complicated AI framework.&lt;/p&gt;

&lt;p&gt;For this use case, recent DynamoDB records provide enough context to influence future generations while keeping the architecture simple.&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%2F5cuqyxvxtc169ti7lpol.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%2F5cuqyxvxtc169ti7lpol.PNG" alt=" " width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was an important design decision.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not every AI agent needs a complex memory system. Sometimes remembering the most recent actions is enough.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;I intentionally kept the project architecture simple and focused.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend
&lt;/h2&gt;

&lt;p&gt;The frontend uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;Vanilla JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did not use a large frontend framework because the main purpose of the project was to demonstrate the always-on AI agent architecture.&lt;/p&gt;

&lt;p&gt;The website allows users to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View today's generated world&lt;/li&gt;
&lt;li&gt;Explore complete world details&lt;/li&gt;
&lt;li&gt;Browse previously imagined worlds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the user opens the application, the frontend requests the latest generated world from the backend.&lt;/p&gt;

&lt;p&gt;Because the autonomous workflow has already run, the new world is ready to display.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Autonomous Backend
&lt;/h2&gt;

&lt;p&gt;The most important part of DreamCanvas runs on AWS.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;Amazon EventBridge schedule&lt;/strong&gt; automatically wakes the agent every day.&lt;/p&gt;

&lt;p&gt;The scheduled event invokes an &lt;strong&gt;AWS Lambda&lt;/strong&gt; function.&lt;/p&gt;

&lt;p&gt;The workflow begins with an important check.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Check for Today's World
&lt;/h3&gt;

&lt;p&gt;Lambda first checks whether a world has already been generated for the current day.&lt;/p&gt;

&lt;p&gt;This makes the workflow idempotent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Has today's world already been created?

YES → Stop

NO → Continue generation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents accidental duplicate generations and unnecessary AI API usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Retrieve Recent Memory
&lt;/h3&gt;

&lt;p&gt;If no world exists for the current day, Lambda retrieves several recent worlds from &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These records act as the agent's memory.&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%2Fft4d12twit1ucko1bb27.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%2Fft4d12twit1ucko1bb27.PNG" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Choose a New Creative Direction
&lt;/h3&gt;

&lt;p&gt;The recent worlds are used as context.&lt;/p&gt;

&lt;p&gt;The AI is instructed to create something meaningfully different from recent generations.&lt;/p&gt;

&lt;p&gt;The goal is not simply randomness.&lt;/p&gt;

&lt;p&gt;The goal is informed variety.&lt;/p&gt;

&lt;p&gt;The agent knows what it recently created and uses that information when creating something new.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Generate the World
&lt;/h3&gt;

&lt;p&gt;Lambda sends the creative context to the AI through the &lt;strong&gt;Groq API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Groq acts as the creative generation engine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Validate the AI Response
&lt;/h3&gt;

&lt;p&gt;The backend does not blindly store the AI response.&lt;/p&gt;

&lt;p&gt;The Lambda validates the generated data before saving it.&lt;/p&gt;

&lt;p&gt;This is important because the application expects structured information.&lt;/p&gt;

&lt;p&gt;The validation checks that the required data exists and that the response can be safely processed.&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%2Fr2dmc7a8c5jsepqmqj6y.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%2Fr2dmc7a8c5jsepqmqj6y.PNG" alt=" " width="799" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the AI response is malformed, the application handles the problem safely and can retry generation rather than storing invalid data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Save the New World
&lt;/h3&gt;

&lt;p&gt;Once validation succeeds, the new world is stored in &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The generated world then becomes available through the application's API.&lt;/p&gt;

&lt;p&gt;When the user returns later, the frontend can immediately display it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Separating AI Generation from Infrastructure
&lt;/h1&gt;

&lt;p&gt;One of the key architectural decisions was separating the AI generation service from the always-on application infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Groq&lt;/strong&gt; handles creative AI generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS&lt;/strong&gt; handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduling&lt;/li&gt;
&lt;li&gt;Serverless execution&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;API access&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The separation looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS EventBridge
        ↓
AWS Lambda
        ↓
DynamoDB Memory
        ↓
Groq API
        ↓
AWS Lambda Validation
        ↓
DynamoDB Storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows the application to combine an external AI model with AWS serverless infrastructure.&lt;/p&gt;

&lt;h1&gt;
  
  
  AWS Services Used
&lt;/h1&gt;

&lt;p&gt;DreamCanvas uses a lightweight serverless architecture built with the following AWS services.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Lambda
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt; runs the DreamCanvas agent and backend API logic.&lt;/p&gt;

&lt;p&gt;It handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily world generation&lt;/li&gt;
&lt;li&gt;Checking for duplicates&lt;/li&gt;
&lt;li&gt;Retrieving recent worlds&lt;/li&gt;
&lt;li&gt;Preparing AI prompts&lt;/li&gt;
&lt;li&gt;Calling the Groq API&lt;/li&gt;
&lt;li&gt;Validating responses&lt;/li&gt;
&lt;li&gt;Storing new worlds&lt;/li&gt;
&lt;li&gt;Serving API requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Amazon EventBridge
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amazon EventBridge&lt;/strong&gt; automatically triggers the DreamCanvas agent every day.&lt;/p&gt;

&lt;p&gt;This is what transforms the project from a normal AI application into an always-on system.&lt;/p&gt;

&lt;p&gt;The user does not need to press a button.&lt;/p&gt;

&lt;p&gt;The scheduled event wakes the agent automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon DynamoDB
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amazon DynamoDB&lt;/strong&gt; stores the generated fictional worlds.&lt;/p&gt;

&lt;p&gt;It also acts as lightweight agent memory.&lt;/p&gt;

&lt;p&gt;Before creating a new world, the agent retrieves recent records and uses them as context to avoid repetitive output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon API Gateway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amazon API Gateway&lt;/strong&gt; provides API endpoints for the frontend.&lt;/p&gt;

&lt;p&gt;The frontend can use these endpoints to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieve today's world&lt;/li&gt;
&lt;li&gt;Browse previous worlds&lt;/li&gt;
&lt;li&gt;View individual world details&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Amazon S3
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amazon S3&lt;/strong&gt; hosts the static frontend.&lt;/p&gt;

&lt;p&gt;The frontend consists of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AWS Secrets Manager
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS Secrets Manager&lt;/strong&gt; securely stores the Groq API key.&lt;/p&gt;

&lt;p&gt;The key is never exposed in browser code or committed to the repository.&lt;/p&gt;

&lt;p&gt;The Lambda backend retrieves the secret using AWS permissions.&lt;/p&gt;

&lt;p&gt;The security flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend
    ↓
API Gateway
    ↓
Lambda
    ↓
Secrets Manager
    ↓
Retrieve Groq API Key
    ↓
Groq API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Amazon CloudWatch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amazon CloudWatch&lt;/strong&gt; provides logs and monitoring.&lt;/p&gt;

&lt;p&gt;It helps monitor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduled generation events&lt;/li&gt;
&lt;li&gt;Lambda execution&lt;/li&gt;
&lt;li&gt;Validation failures&lt;/li&gt;
&lt;li&gt;API errors&lt;/li&gt;
&lt;li&gt;Application debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AWS SAM
&lt;/h2&gt;

&lt;p&gt;I used &lt;strong&gt;AWS SAM&lt;/strong&gt; to define and deploy the serverless infrastructure.&lt;/p&gt;

&lt;p&gt;SAM uses AWS CloudFormation underneath and makes it easier to define serverless resources as infrastructure as code.&lt;/p&gt;

&lt;p&gt;This means the AWS environment can be deployed consistently from the project instead of manually creating resources one by one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DreamCanvas is an always-on AI creative agent that remembers recently imagined worlds, automatically creates a new one every day using Groq, and uses AWS serverless services to make sure the next world is waiting before the user even opens the application.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  App and Source Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live App:&lt;/strong&gt;&lt;br&gt;
[&lt;a href="http://dreamcanvas-frontend-305218268847-us-east-1.s3-website-us-east-1.amazonaws.com/" rel="noopener noreferrer"&gt;http://dreamcanvas-frontend-305218268847-us-east-1.s3-website-us-east-1.amazonaws.com/&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building FridgeChef AI: Turning Available Ingredients into Recipes | 10 Days of Building AI Agents on AWS | Day 9</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Mon, 31 Aug 2026 02:28:00 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/building-fridgechef-ai-turning-available-ingredients-into-recipes-10-days-of-building-ai-agents-3p76</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/building-fridgechef-ai-turning-available-ingredients-into-recipes-10-days-of-building-ai-agents-3p76</guid>
      <description>&lt;h2&gt;
  
  
  10 Days of Building AI Agents on AWS | Day 8
&lt;/h2&gt;

&lt;p&gt;Opening the fridge and still not knowing what to cook is a frustrating daily problem.&lt;/p&gt;

&lt;p&gt;You may already have chicken, eggs, vegetables, rice, spices, and other ingredients at home, but still spend more time searching for recipes than actually preparing a meal.&lt;/p&gt;

&lt;p&gt;That was the problem behind &lt;strong&gt;FridgeChef AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;FridgeChef AI is an AI-powered recipe assistant that transforms the ingredients already available in your kitchen into personalized meal ideas using generative AI and AWS serverless technologies.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Available Ingredients → Preferences → AI → Personalized Recipe&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of searching through multiple recipe websites, users can enter what they already have and let AI suggest what they can cook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq6ft0nyz8mbg4eq4zdri.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq6ft0nyz8mbg4eq4zdri.webp" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vision and What FridgeChef AI Does
&lt;/h2&gt;

&lt;p&gt;One of the most common everyday frustrations is standing in front of the refrigerator wondering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What can I actually cook with this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even when we have several ingredients available, it can be difficult to combine them into a complete meal idea.&lt;/p&gt;

&lt;p&gt;This often leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wasted time searching for recipes&lt;/li&gt;
&lt;li&gt;Unnecessary grocery purchases&lt;/li&gt;
&lt;li&gt;Ingredients being forgotten&lt;/li&gt;
&lt;li&gt;Food eventually expiring unused&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted to build a focused application that solves this one problem.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;FridgeChef AI&lt;/strong&gt;, users simply enter the ingredients available in their kitchen and select optional preferences such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preferred cuisine&lt;/li&gt;
&lt;li&gt;Dietary restrictions&lt;/li&gt;
&lt;li&gt;Cooking time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI then generates personalized recipe suggestions in seconds.&lt;/p&gt;

&lt;p&gt;Each response can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recipe suggestions&lt;/li&gt;
&lt;li&gt;Required ingredients&lt;/li&gt;
&lt;li&gt;Cooking instructions&lt;/li&gt;
&lt;li&gt;Estimated cooking time&lt;/li&gt;
&lt;li&gt;Additional cooking tips&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was not to build a complete recipe platform with thousands of manually created recipes.&lt;/p&gt;

&lt;p&gt;Instead, the focus was on one useful experience:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tell FridgeChef what you have, and let AI help you decide what to cook.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By encouraging users to cook with ingredients they already have, the application can also help reduce unnecessary food waste.&lt;/p&gt;

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

&lt;p&gt;I wanted the project to use a modern serverless architecture while keeping the deployment process automated and reproducible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;The frontend was built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface uses a warm, kitchen-inspired design focused on making the experience simple and intuitive.&lt;/p&gt;

&lt;p&gt;Users can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add available ingredients&lt;/li&gt;
&lt;li&gt;Select cuisine preferences&lt;/li&gt;
&lt;li&gt;Choose dietary options&lt;/li&gt;
&lt;li&gt;Specify their preferred cooking time&lt;/li&gt;
&lt;li&gt;Generate personalized recipes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend communicates with the backend through an API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;The backend was developed using &lt;strong&gt;Node.js&lt;/strong&gt; and deployed as an &lt;strong&gt;AWS Lambda&lt;/strong&gt; function.&lt;/p&gt;

&lt;p&gt;Instead of maintaining a traditional server, the backend runs only when a request is received.&lt;/p&gt;

&lt;p&gt;The request flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User enters ingredients
        ↓
Frontend sends request
        ↓
Amazon API Gateway
        ↓
AWS Lambda
        ↓
Groq API
        ↓
Recipe generation
        ↓
Structured JSON response
        ↓
Frontend displays recipes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;p&gt;This architecture keeps the backend lightweight and serverless.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Recipe Generation
&lt;/h2&gt;

&lt;p&gt;For AI-powered recipe generation, I integrated the &lt;strong&gt;Groq API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The backend receives the user's ingredients and preferences and creates a structured prompt.&lt;/p&gt;

&lt;p&gt;For example, the input may contain:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
Ingredients:&lt;br&gt;
Chicken, rice, onions, tomatoes, garlic&lt;/p&gt;

&lt;p&gt;Cuisine:&lt;br&gt;
Pakistani&lt;/p&gt;

&lt;p&gt;Dietary Preference:&lt;br&gt;
None&lt;/p&gt;

&lt;p&gt;Cooking Time:&lt;br&gt;
30 minutes&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;plaintext&lt;/p&gt;

&lt;p&gt;The backend sends this information to the AI model and requests a structured recipe response.&lt;/p&gt;

&lt;p&gt;The AI can generate information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recipe name&lt;/li&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Ingredients&lt;/li&gt;
&lt;li&gt;Cooking instructions&lt;/li&gt;
&lt;li&gt;Estimated preparation time&lt;/li&gt;
&lt;li&gt;Cooking tips&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The response is then formatted into structured JSON before being returned to the frontend.&lt;/p&gt;

&lt;p&gt;Using structured responses makes it easier for the application to reliably display the generated recipes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Chose a Serverless Architecture
&lt;/h2&gt;

&lt;p&gt;This project did not need a traditional server running continuously.&lt;/p&gt;

&lt;p&gt;Recipe generation happens only when a user submits ingredients.&lt;/p&gt;

&lt;p&gt;That makes a serverless architecture a good fit.&lt;/p&gt;

&lt;p&gt;The backend can remain inactive until a request arrives:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;No request → No backend processing&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When a user generates a recipe:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Request arrives → Lambda runs → AI generates recipe → Response returns&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This allowed me to focus on the application rather than managing servers.&lt;/p&gt;

&lt;h1&gt;
  
  
  AWS Services and Architecture
&lt;/h1&gt;

&lt;p&gt;The application uses several AWS services.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Amplify Hosting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS Amplify&lt;/strong&gt; hosts the React frontend and makes the application publicly accessible.&lt;/p&gt;

&lt;p&gt;It provides the hosting layer for the user interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon API Gateway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amazon API Gateway&lt;/strong&gt; receives requests from the frontend and routes them to the serverless backend.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb7yhoinvvv2ukdbhffnk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb7yhoinvvv2ukdbhffnk.webp" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The frontend does not communicate directly with the AI provider.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
Frontend&lt;br&gt;
    ↓&lt;br&gt;
API Gateway&lt;br&gt;
    ↓&lt;br&gt;
AWS Lambda&lt;br&gt;
    ↓&lt;br&gt;
Groq API&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;plaintext&lt;/p&gt;

&lt;p&gt;This keeps the AI integration inside the backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Lambda
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt; runs the Node.js backend.&lt;/p&gt;

&lt;p&gt;It is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receiving recipe requests&lt;/li&gt;
&lt;li&gt;Processing ingredients and preferences&lt;/li&gt;
&lt;li&gt;Creating the AI prompt&lt;/li&gt;
&lt;li&gt;Calling the Groq API&lt;/li&gt;
&lt;li&gt;Processing the AI response&lt;/li&gt;
&lt;li&gt;Returning structured recipe data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lambda runs when the application receives a request, so there is no continuously running backend server.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS SAM
&lt;/h2&gt;

&lt;p&gt;I used &lt;strong&gt;AWS SAM (Serverless Application Model)&lt;/strong&gt; to simplify the development and deployment of the serverless backend.&lt;/p&gt;

&lt;p&gt;SAM makes it easier to define and deploy resources such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda functions&lt;/li&gt;
&lt;li&gt;API Gateway endpoints&lt;/li&gt;
&lt;li&gt;IAM permissions&lt;/li&gt;
&lt;li&gt;Environment configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AWS CloudFormation
&lt;/h2&gt;

&lt;p&gt;The infrastructure is provisioned using &lt;strong&gt;AWS CloudFormation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Rather than manually creating resources through the AWS Console, the infrastructure is defined as code.&lt;/p&gt;

&lt;p&gt;This means the deployment can be repeated consistently.&lt;/p&gt;

&lt;p&gt;The infrastructure definition includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Lambda configuration&lt;/li&gt;
&lt;li&gt;API Gateway configuration&lt;/li&gt;
&lt;li&gt;IAM roles and permissions&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Required service connections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The workflow becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure Code → AWS SAM → CloudFormation → AWS Resources&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Amazon CloudWatch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amazon CloudWatch&lt;/strong&gt; is used for monitoring and debugging.&lt;/p&gt;

&lt;p&gt;During development, CloudWatch logs helped identify deployment and runtime issues.&lt;/p&gt;

&lt;h1&gt;
  
  
  Architecture Overview
&lt;/h1&gt;

&lt;p&gt;The complete architecture looks like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
                         USER&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                    AWS Amplify&lt;br&gt;
                  React + Vite App&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                 Amazon API Gateway&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                      AWS Lambda&lt;br&gt;
                       Node.js&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                        Groq API&lt;br&gt;
                    AI Recipe Generation&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                      AWS Lambda&lt;br&gt;
                   Process AI Response&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                 Amazon API Gateway&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                    React Frontend&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                Personalized Recipes&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The application starts when a user submits a list of ingredients through the frontend.&lt;/p&gt;

&lt;p&gt;API Gateway receives the request and invokes the Lambda function.&lt;/p&gt;

&lt;p&gt;Lambda prepares the AI prompt and sends it to the Groq API.&lt;/p&gt;

&lt;p&gt;Once the AI generates recipe suggestions, the backend formats the result into structured JSON and returns it through API Gateway.&lt;/p&gt;

&lt;p&gt;The frontend then displays the recipes to the user.&lt;/p&gt;

&lt;h1&gt;
  
  
  Infrastructure as Code
&lt;/h1&gt;

&lt;p&gt;One of my main goals was to avoid manually configuring cloud resources.&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;AWS SAM and AWS CloudFormation&lt;/strong&gt; to automate the infrastructure deployment.&lt;/p&gt;

&lt;p&gt;Instead of creating resources one by one through the AWS Console, the backend infrastructure can be deployed using the AWS CLI.&lt;/p&gt;

&lt;p&gt;This approach makes deployments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeatable&lt;/li&gt;
&lt;li&gt;Easier to manage&lt;/li&gt;
&lt;li&gt;Easier to update&lt;/li&gt;
&lt;li&gt;Less dependent on manual configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During development, I encountered challenges related to CloudFormation parameter handling and environment variables.&lt;/p&gt;

&lt;p&gt;After debugging the deployment scripts and configuration, I was able to automate the deployment workflow and deploy the backend consistently.&lt;/p&gt;

&lt;p&gt;This was an important learning experience because it showed me that building an application is not only about writing the frontend and backend code.&lt;/p&gt;

&lt;p&gt;Deployment and infrastructure configuration are also important parts of the development process.&lt;/p&gt;

&lt;h1&gt;
  
  
  Challenges I Faced
&lt;/h1&gt;

&lt;p&gt;Like other serverless projects, the main challenges were related to deployment and configuration.&lt;/p&gt;

&lt;p&gt;Some of the issues involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CloudFormation parameters&lt;/li&gt;
&lt;li&gt;Environment variable configuration&lt;/li&gt;
&lt;li&gt;Deployment scripts&lt;/li&gt;
&lt;li&gt;AWS resource configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Debugging these issues helped me better understand how the different parts of a serverless application connect together.&lt;/p&gt;

&lt;p&gt;Using Infrastructure as Code also made it easier to identify configuration problems because the infrastructure was defined explicitly instead of being hidden inside manual AWS Console settings.&lt;/p&gt;

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

&lt;p&gt;Building FridgeChef AI gave me valuable hands-on experience with serverless application development on AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrastructure as Code
&lt;/h2&gt;

&lt;p&gt;I strengthened my understanding of Infrastructure as Code by deploying the backend through AWS SAM and CloudFormation.&lt;/p&gt;

&lt;p&gt;This helped me understand how cloud resources can be defined and managed as part of the application codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Gateway and Lambda
&lt;/h2&gt;

&lt;p&gt;I learned more about integrating Amazon API Gateway with AWS Lambda.&lt;/p&gt;

&lt;p&gt;The project required designing the flow between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The React frontend&lt;/li&gt;
&lt;li&gt;API Gateway&lt;/li&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;The external AI provider&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gave me more experience with serverless APIs and event-driven backend architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Integration
&lt;/h2&gt;

&lt;p&gt;Another important learning was integrating an external AI provider into an AWS application.&lt;/p&gt;

&lt;p&gt;Groq handles the AI inference, while AWS provides the infrastructure required to deliver the application.&lt;/p&gt;

&lt;p&gt;The combination looks like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AWS manages the application infrastructure → Groq provides AI generation&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This separation allows the application to use managed cloud services while integrating specialized AI capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging Deployments
&lt;/h2&gt;

&lt;p&gt;Working through CloudFormation and deployment issues also improved my troubleshooting skills.&lt;/p&gt;

&lt;p&gt;I learned more about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managing deployment parameters&lt;/li&gt;
&lt;li&gt;Working with environment variables&lt;/li&gt;
&lt;li&gt;Reading deployment errors&lt;/li&gt;
&lt;li&gt;Debugging CloudFormation configuration&lt;/li&gt;
&lt;li&gt;Structuring applications for repeatable deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FridgeChef AI is an experiment in combining generative AI with AWS serverless technologies to solve a simple everyday problem.&lt;/p&gt;

&lt;p&gt;The application takes ingredients that users already have and transforms them into personalized meal ideas.&lt;/p&gt;

&lt;p&gt;The complete workflow is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Open the App → Enter Ingredients → Choose Preferences → Generate Recipes&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Building the project gave me more experience with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React and Vite&lt;/li&gt;
&lt;li&gt;AWS Amplify&lt;/li&gt;
&lt;li&gt;Amazon API Gateway&lt;/li&gt;
&lt;li&gt;AWS Lambda&lt;/li&gt;
&lt;li&gt;AWS SAM&lt;/li&gt;
&lt;li&gt;AWS CloudFormation&lt;/li&gt;
&lt;li&gt;Amazon CloudWatch&lt;/li&gt;
&lt;li&gt;Serverless architecture&lt;/li&gt;
&lt;li&gt;Infrastructure as Code&lt;/li&gt;
&lt;li&gt;Groq AI integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More importantly, it demonstrated how quickly a useful AI-powered application can be built by combining managed AWS services with a focused product idea.&lt;/p&gt;

&lt;p&gt;Sometimes the best project is not the one with the most features.&lt;/p&gt;

&lt;p&gt;It is the one that solves a small, annoying problem well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try FridgeChef AI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Application:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://staging.d2rlx4nfgtm79o.amplifyapp.com/" rel="noopener noreferrer"&gt;https://staging.d2rlx4nfgtm79o.amplifyapp.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building VibePlaylist AI: Turning Everyday Moods into AI-Curated Playlists | 10 Days of Building AI Agents on AWS | Day 8</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Sat, 29 Aug 2026 02:18:00 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/building-vibeplaylist-ai-turning-everyday-moods-into-ai-curated-playlists-10-days-of-building-ai-42h</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/building-vibeplaylist-ai-turning-everyday-moods-into-ai-curated-playlists-10-days-of-building-ai-42h</guid>
      <description>&lt;h2&gt;
  
  
  10 Days of Building AI Agents on AWS | Day 8
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tag:&lt;/strong&gt; &lt;code&gt;#agents&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Have you ever had a very specific mood but could not find the right music for it?&lt;/p&gt;

&lt;p&gt;Maybe it is a late-night drive after a long day, a quiet evening when you are feeling nostalgic, a study session that needs focus, or simply a moment that feels difficult to describe with a normal playlist.&lt;/p&gt;

&lt;p&gt;That is the idea behind &lt;strong&gt;VibePlaylist AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;VibePlaylist AI is a generative AI application that turns a user's situation, feeling, memory, place, or activity into a personalized themed playlist.&lt;/p&gt;

&lt;p&gt;Instead of manually searching through hundreds of songs, users can describe what they are experiencing, choose a vibe, and let AI curate a musical concept around that idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea Behind VibePlaylist AI
&lt;/h2&gt;

&lt;p&gt;A user can enter something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Late-night drive through Islamabad after a long and exhausting day.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They can then select a vibe such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chill&lt;/li&gt;
&lt;li&gt;Romantic&lt;/li&gt;
&lt;li&gt;Sad&lt;/li&gt;
&lt;li&gt;Energetic&lt;/li&gt;
&lt;li&gt;Dreamy&lt;/li&gt;
&lt;li&gt;Nostalgic&lt;/li&gt;
&lt;li&gt;Focus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After clicking &lt;strong&gt;Create Playlist&lt;/strong&gt;, VibePlaylist AI generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A playlist name&lt;/li&gt;
&lt;li&gt;A short description&lt;/li&gt;
&lt;li&gt;The selected vibe&lt;/li&gt;
&lt;li&gt;Eight song recommendations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, the result could become &lt;strong&gt;Midnight Miles&lt;/strong&gt;, with a description inspired by quiet roads, city lights, and reflective thoughts, followed by eight songs that fit the atmosphere.&lt;/p&gt;

&lt;p&gt;The core experience is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Your Moment → Choose a Vibe → AI Curates → Discover Your Playlist&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The application is not intended to replace music streaming platforms. There is no music playback or Spotify integration.&lt;/p&gt;

&lt;p&gt;The creative part is the curation itself.&lt;/p&gt;

&lt;p&gt;A simple sentence from the user becomes a complete musical concept that they can explore on their preferred streaming platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqgvjsttrrvxa4w5k4uif.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqgvjsttrrvxa4w5k4uif.webp" alt=" " width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Experience
&lt;/h2&gt;

&lt;p&gt;For this project, I deliberately kept the scope focused.&lt;/p&gt;

&lt;p&gt;The application has one primary purpose: turn a feeling or situation into a themed playlist.&lt;/p&gt;

&lt;p&gt;Almost every part of the interface supports that single interaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;The frontend was built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML5&lt;/li&gt;
&lt;li&gt;CSS3&lt;/li&gt;
&lt;li&gt;Vanilla JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I chose a lightweight frontend because the application did not require complex state management or a large component system.&lt;/p&gt;

&lt;p&gt;The visual design uses a cinematic black-and-gold theme with clean typography and simple interactive elements.&lt;/p&gt;

&lt;p&gt;The main interface contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A text input for describing the moment&lt;/li&gt;
&lt;li&gt;Vibe selection buttons&lt;/li&gt;
&lt;li&gt;A single Create Playlist action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the AI response arrives, the playlist is displayed in a dedicated result section containing the playlist name, description, vibe, and track list.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Behind the Playlist
&lt;/h2&gt;

&lt;p&gt;The AI layer is powered by the &lt;strong&gt;Groq API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The backend sends two important pieces of information to the model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What the user is experiencing&lt;/li&gt;
&lt;li&gt;The vibe they selected&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I designed the prompt so the model behaves more like a music curator rather than simply returning random song names.&lt;/p&gt;

&lt;p&gt;The AI is instructed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a suitable playlist title&lt;/li&gt;
&lt;li&gt;Match the requested mood&lt;/li&gt;
&lt;li&gt;Generate exactly eight tracks&lt;/li&gt;
&lt;li&gt;Avoid duplicate songs&lt;/li&gt;
&lt;li&gt;Create a relevant playlist description&lt;/li&gt;
&lt;li&gt;Return a predictable JSON response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The request flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User describes a moment
          ↓
User selects a vibe
          ↓
Frontend sends request
          ↓
AWS Lambda processes it
          ↓
Groq analyzes the mood
          ↓
AI creates playlist JSON
          ↓
Frontend displays the playlist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;h2&gt;
  
  
  Why Structured AI Output Matters
&lt;/h2&gt;

&lt;p&gt;One of the practical challenges was making sure the AI response could be reliably consumed by the frontend.&lt;/p&gt;

&lt;p&gt;AI-generated text can be unpredictable.&lt;/p&gt;

&lt;p&gt;Rather than asking the browser to interpret a large block of generated text, the backend requests structured JSON containing information such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
json&lt;br&gt;
{&lt;br&gt;
  "playlistName": "Midnight Miles",&lt;br&gt;
  "description": "A soundtrack for quiet roads and reflective thoughts.",&lt;br&gt;
  "vibe": "Nostalgic",&lt;br&gt;
  "tracks": [&lt;br&gt;
    {&lt;br&gt;
      "title": "Song Name",&lt;br&gt;
      "artist": "Artist Name"&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;json&lt;/p&gt;

&lt;p&gt;This makes the response much easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate&lt;/li&gt;
&lt;li&gt;Process&lt;/li&gt;
&lt;li&gt;Display&lt;/li&gt;
&lt;li&gt;Handle when errors occur&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also keeps the frontend logic simple.&lt;/p&gt;

&lt;p&gt;This project reinforced an important lesson for me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A good AI application is not only about the prompt. The format and reliability of the response matter just as much.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Keeping the API Key Secure
&lt;/h2&gt;

&lt;p&gt;Another important consideration was API security.&lt;/p&gt;

&lt;p&gt;The Groq API key is never placed inside the frontend code.&lt;/p&gt;

&lt;p&gt;The browser does not communicate directly with Groq.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
Browser&lt;br&gt;
   ↓&lt;br&gt;
AWS API Gateway&lt;br&gt;
   ↓&lt;br&gt;
AWS Lambda&lt;br&gt;
   ↓&lt;br&gt;
Groq API&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;plaintext&lt;/p&gt;

&lt;p&gt;This keeps the AI API key away from client-side JavaScript.&lt;/p&gt;

&lt;p&gt;The serverless backend handles communication with the external AI service.&lt;/p&gt;

&lt;h1&gt;
  
  
  AWS Architecture
&lt;/h1&gt;

&lt;p&gt;VibePlaylist AI uses a serverless AWS architecture.&lt;/p&gt;

&lt;p&gt;There is no traditional server that needs to remain running continuously.&lt;/p&gt;

&lt;p&gt;The main AWS services used are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon S3&lt;/strong&gt; for storing the static frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon CloudFront&lt;/strong&gt; for global delivery and HTTPS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon API Gateway&lt;/strong&gt; for exposing the &lt;code&gt;POST /generate&lt;/code&gt; endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Lambda&lt;/strong&gt; for running the Node.js backend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS IAM&lt;/strong&gt; for permissions and access control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS CloudFormation&lt;/strong&gt; for defining and provisioning infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complete architecture looks like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
                         USER&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                     CloudFront&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                      Amazon S3&lt;br&gt;
                  HTML / CSS / JavaScript&lt;br&gt;
                           │&lt;br&gt;
                           │&lt;br&gt;
                 Create Playlist Request&lt;br&gt;
                           ▼&lt;br&gt;
                    Amazon API Gateway&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                      AWS Lambda&lt;br&gt;
                       Node.js&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                        Groq API&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                      Playlist JSON&lt;br&gt;
                           │&lt;br&gt;
                           ▼&lt;br&gt;
                     User Interface&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrastructure as Code
&lt;/h2&gt;

&lt;p&gt;One of my goals was to avoid manually building the AWS environment through the console.&lt;/p&gt;

&lt;p&gt;The infrastructure is described in an &lt;strong&gt;AWS CloudFormation YAML template&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS resources&lt;/li&gt;
&lt;li&gt;Permissions&lt;/li&gt;
&lt;li&gt;Service connections&lt;/li&gt;
&lt;li&gt;API configuration&lt;/li&gt;
&lt;li&gt;Stack outputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the infrastructure part of the project itself.&lt;/p&gt;

&lt;p&gt;Instead of manually recreating the environment, it can be provisioned from the template.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing Multiple AWS Accounts
&lt;/h2&gt;

&lt;p&gt;For deployment, I used a dedicated AWS CLI profile named &lt;code&gt;account2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Because multiple AWS accounts were configured on my development machine, I added identity verification to the deployment process.&lt;/p&gt;

&lt;p&gt;Before creating or updating resources, the workflow checks the AWS identity being used.&lt;/p&gt;

&lt;p&gt;This helped prevent deploying infrastructure to the wrong AWS account.&lt;/p&gt;

&lt;p&gt;The deployment process follows this idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verify Account → Deploy Infrastructure → Confirm Outputs&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is a small safeguard, but useful when working across multiple AWS accounts.&lt;/p&gt;

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

&lt;p&gt;Building VibePlaylist AI gave me practical experience with the complete lifecycle of a small AI application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing Frontend and Backend APIs
&lt;/h2&gt;

&lt;p&gt;I learned more about designing communication between a frontend and a serverless backend, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending JSON requests&lt;/li&gt;
&lt;li&gt;Handling asynchronous responses&lt;/li&gt;
&lt;li&gt;Validating generated data&lt;/li&gt;
&lt;li&gt;Managing API errors&lt;/li&gt;
&lt;li&gt;Displaying results cleanly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Working with API Gateway and Lambda
&lt;/h2&gt;

&lt;p&gt;The project helped me better understand the serverless model.&lt;/p&gt;

&lt;p&gt;Instead of running a Node.js server continuously, the Lambda function is invoked when the application receives a request.&lt;/p&gt;

&lt;p&gt;The flow is event-driven:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Request arrives → Lambda runs → AI is called → Response is returned&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Infrastructure as Code with CloudFormation
&lt;/h2&gt;

&lt;p&gt;CloudFormation was another important learning experience.&lt;/p&gt;

&lt;p&gt;Defining the AWS environment as YAML changed how I think about deployment.&lt;/p&gt;

&lt;p&gt;Instead of treating the AWS Console as the place where the application is built, the infrastructure becomes part of the project.&lt;/p&gt;

&lt;p&gt;That means it can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Versioned&lt;/li&gt;
&lt;li&gt;Reproduced&lt;/li&gt;
&lt;li&gt;Updated&lt;/li&gt;
&lt;li&gt;Deployed consistently&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Responses Need More Than a Good Prompt
&lt;/h2&gt;

&lt;p&gt;One of the biggest lessons from this project was that the prompt is only one part of an AI application.&lt;/p&gt;

&lt;p&gt;A complete application also needs to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Response structure&lt;/li&gt;
&lt;li&gt;Data validation&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;API security&lt;/li&gt;
&lt;li&gt;Frontend integration&lt;/li&gt;
&lt;li&gt;User experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generating good output is important.&lt;/p&gt;

&lt;p&gt;Making that output reliable and useful inside a real application is equally important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the Product Focused
&lt;/h2&gt;

&lt;p&gt;Most importantly, VibePlaylist AI reinforced the idea that a creative AI application does not need dozens of features.&lt;/p&gt;

&lt;p&gt;A simple idea, a focused interface, and one useful AI interaction can create an enjoyable experience.&lt;/p&gt;

&lt;p&gt;The entire application revolves around one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What does this moment sound like?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The user provides the moment.&lt;/p&gt;

&lt;p&gt;AI creates the musical direction.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;VibePlaylist AI is a small experiment in turning everyday moments into musical ideas using generative AI.&lt;/p&gt;

&lt;p&gt;A late-night drive, a difficult day, a nostalgic memory, a study session, or any other feeling can become the starting point for a curated playlist.&lt;/p&gt;

&lt;p&gt;By combining Groq with AWS serverless services, I built a simple workflow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Describe Your Moment → Select a Vibe → Generate a Playlist&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This project demonstrates how AI can take a simple piece of human input and transform it into a creative experience.&lt;/p&gt;

&lt;p&gt;It also gave me more hands-on experience with serverless architecture, API design, structured AI responses, CloudFormation, and secure backend integration.&lt;/p&gt;

&lt;p&gt;Sometimes, a creative AI application does not need to do everything.&lt;/p&gt;

&lt;p&gt;It only needs to do one thing well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try VibePlaylist AI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live App:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://d1u2qhbqs932dd.cloudfront.net/" rel="noopener noreferrer"&gt;https://d1u2qhbqs932dd.cloudfront.net/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>ReplyPilot AI: Generating Email Replies with AI | 10 Days of Building AI Agents on AWS | Day 7</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Fri, 28 Aug 2026 02:08:00 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/replypilot-ai-generating-email-replies-with-ai-10-days-of-building-ai-agents-on-aws-day-7-2080</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/replypilot-ai-generating-email-replies-with-ai-10-days-of-building-ai-agents-on-aws-day-7-2080</guid>
      <description>&lt;h3&gt;
  
  
  10 Days of Building AI Agents on AWS | Day 7
&lt;/h3&gt;

&lt;p&gt;One of the most repetitive tasks in my daily workflow is replying to emails.&lt;/p&gt;

&lt;p&gt;Whether it is acknowledging a meeting request, responding to a client, replying to a colleague, or sending a professional follow-up, I often spend more time thinking about how to phrase the message than actually writing it.&lt;/p&gt;

&lt;p&gt;To solve this problem, I built &lt;strong&gt;ReplyPilot AI&lt;/strong&gt;, an AI-powered email reply assistant that generates professional email responses within seconds.&lt;/p&gt;

&lt;p&gt;Instead of manually drafting every response, users simply:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste the email they received&lt;/li&gt;
&lt;li&gt;Choose the desired tone&lt;/li&gt;
&lt;li&gt;Generate a polished AI reply&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The application also keeps a history of generated replies, allowing users to revisit previous responses without generating the same reply again.&lt;/p&gt;

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

&lt;p&gt;Writing an email is usually not technically difficult.&lt;/p&gt;

&lt;p&gt;The difficult part is deciding how to write it.&lt;/p&gt;

&lt;p&gt;Questions such as these can slow down even a simple reply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How formal should I be?&lt;/li&gt;
&lt;li&gt;Should I sound friendly or strictly professional?&lt;/li&gt;
&lt;li&gt;How do I politely decline?&lt;/li&gt;
&lt;li&gt;How should I follow up?&lt;/li&gt;
&lt;li&gt;How can I acknowledge a request professionally?&lt;/li&gt;
&lt;li&gt;What is the best way to phrase my response?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These small decisions happen repeatedly throughout the day.&lt;/p&gt;

&lt;p&gt;ReplyPilot AI was built to reduce that friction.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Received Email → Select Tone → AI Generates Reply&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of starting from a blank page, the user receives a polished draft within seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ReplyPilot AI Does
&lt;/h2&gt;

&lt;p&gt;ReplyPilot AI is a web application that uses generative AI to create professional email replies.&lt;/p&gt;

&lt;p&gt;Users provide the received email and select a desired writing style or tone.&lt;/p&gt;

&lt;p&gt;The AI analyzes the content and generates an appropriate response.&lt;/p&gt;

&lt;p&gt;The application allows users to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paste a received email&lt;/li&gt;
&lt;li&gt;Choose a writing tone&lt;/li&gt;
&lt;li&gt;Generate a professional reply&lt;/li&gt;
&lt;li&gt;Copy the generated response&lt;/li&gt;
&lt;li&gt;Browse previously generated replies&lt;/li&gt;
&lt;li&gt;Revisit reply history&lt;/li&gt;
&lt;li&gt;View simple usage statistics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every generated reply is stored in &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This provides a searchable history and prevents users from losing previous AI-generated drafts.&lt;/p&gt;

&lt;p&gt;The application also tracks statistics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total replies generated&lt;/li&gt;
&lt;li&gt;Processed emails&lt;/li&gt;
&lt;li&gt;Application usage&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I wanted the application to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lightweight&lt;/li&gt;
&lt;li&gt;Serverless&lt;/li&gt;
&lt;li&gt;Responsive&lt;/li&gt;
&lt;li&gt;Scalable&lt;/li&gt;
&lt;li&gt;Inexpensive to operate&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;The frontend was developed using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface allows users to generate replies, browse previous replies, and view application statistics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;The backend is built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;serverless-http&lt;/li&gt;
&lt;li&gt;AWS Lambda&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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fww2no1193p6feo6jrp0h.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fww2no1193p6feo6jrp0h.webp" alt=" " width="800" height="707"&gt;&lt;/a&gt;&lt;br&gt;
Express runs inside AWS Lambda using &lt;code&gt;serverless-http&lt;/code&gt;, allowing the API to operate in a serverless environment.&lt;/p&gt;

&lt;p&gt;The frontend communicates with the backend through &lt;strong&gt;Amazon API Gateway&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  AI Generation
&lt;/h3&gt;

&lt;p&gt;For AI inference, I integrated the &lt;strong&gt;Groq API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Lambda backend sends the received email and selected tone to the AI.&lt;/p&gt;

&lt;p&gt;Groq generates a professional response based on that context.&lt;/p&gt;

&lt;p&gt;The workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Received Email
       ↓
Choose Tone
       ↓
React Frontend
       ↓
Amazon API Gateway
       ↓
AWS Lambda
Express.js Backend
       ↓
Groq API
       ↓
Generated Reply
       ↓
Amazon DynamoDB
       ↓
Reply History
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  AWS Architecture
&lt;/h2&gt;

&lt;p&gt;ReplyPilot AI uses a fully serverless AWS architecture.&lt;/p&gt;

&lt;p&gt;The main AWS services used are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS Amplify&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon API Gateway&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS CloudFormation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS SAM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon CloudWatch&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The overall architecture is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
        │
        ▼
AWS Amplify
React Frontend
        │
        ▼
Amazon API Gateway
        │
        ▼
AWS Lambda
Express API
        │
   ┌────┴────┐
   ▼         ▼
Groq API   Amazon DynamoDB
   │         │
   └────┬────┘
        ▼
Generated Reply and History
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How the Workflow Works
&lt;/h2&gt;

&lt;p&gt;The complete workflow follows these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user opens ReplyPilot AI on AWS Amplify.&lt;/li&gt;
&lt;li&gt;The user pastes the email they received.&lt;/li&gt;
&lt;li&gt;The user selects the desired tone.&lt;/li&gt;
&lt;li&gt;The React frontend sends the request to Amazon API Gateway.&lt;/li&gt;
&lt;li&gt;API Gateway invokes AWS Lambda.&lt;/li&gt;
&lt;li&gt;Lambda processes the request through the Express backend.&lt;/li&gt;
&lt;li&gt;Lambda sends the prompt to the Groq API.&lt;/li&gt;
&lt;li&gt;Groq generates a professional email reply.&lt;/li&gt;
&lt;li&gt;The generated reply is returned to the frontend.&lt;/li&gt;
&lt;li&gt;The reply is also stored in Amazon DynamoDB.&lt;/li&gt;
&lt;li&gt;The user can later access the reply from the history section.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq235iivikv35ecyv2n8u.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq235iivikv35ecyv2n8u.webp" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This creates a simple but useful workflow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Email → AI → Professional Reply → Stored History&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Infrastructure as Code
&lt;/h2&gt;

&lt;p&gt;The backend infrastructure is managed using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS SAM&lt;/li&gt;
&lt;li&gt;AWS CloudFormation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of manually creating resources through the AWS Console, the infrastructure is defined as code.&lt;/p&gt;

&lt;p&gt;This makes the deployment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeatable&lt;/li&gt;
&lt;li&gt;Easier to reproduce&lt;/li&gt;
&lt;li&gt;Easier to update&lt;/li&gt;
&lt;li&gt;More consistent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complete serverless backend can be recreated through the deployment workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges I Faced
&lt;/h2&gt;

&lt;p&gt;Building ReplyPilot AI involved several deployment and infrastructure challenges.&lt;/p&gt;

&lt;h3&gt;
  
  
  CloudFormation Parameter Validation
&lt;/h3&gt;

&lt;p&gt;One of the early issues involved CloudFormation parameter validation.&lt;/p&gt;

&lt;p&gt;Infrastructure templates must match expected configurations precisely, and incorrect parameter definitions can prevent deployments before the application even starts.&lt;/p&gt;

&lt;p&gt;This helped me better understand the importance of validating infrastructure configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lambda Configuration Problems
&lt;/h3&gt;

&lt;p&gt;I also encountered Lambda configuration issues during deployment.&lt;/p&gt;

&lt;p&gt;These required reviewing the function settings and ensuring the deployed environment matched what the application expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Gateway Routing Issues
&lt;/h3&gt;

&lt;p&gt;Another challenge involved API Gateway routing.&lt;/p&gt;

&lt;p&gt;The frontend and backend both worked individually, but requests needed to be correctly routed from API Gateway to the Express application running inside Lambda.&lt;/p&gt;

&lt;p&gt;Debugging this helped me understand how API Gateway and Lambda integrate in a serverless API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Out of Memory Error
&lt;/h3&gt;

&lt;p&gt;After deployment, I encountered an out-of-memory error.&lt;/p&gt;

&lt;p&gt;The application required adjustments to its Lambda memory configuration during testing.&lt;/p&gt;

&lt;p&gt;Using logs and deployment tools, I identified the issue, updated the configuration, and redeployed successfully.&lt;/p&gt;

&lt;p&gt;This was an important reminder that serverless applications still require resource planning.&lt;/p&gt;

&lt;p&gt;Even though there are no servers to manage, memory and runtime configuration still directly affect application performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging with CloudWatch
&lt;/h2&gt;

&lt;p&gt;One of the most valuable tools during development was &lt;strong&gt;Amazon CloudWatch&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;CloudWatch logs helped me diagnose Lambda runtime issues and understand what was happening after deployment.&lt;/p&gt;

&lt;p&gt;When something worked locally but failed in the cloud, logs provided the information needed to investigate the actual serverless execution environment.&lt;/p&gt;

&lt;p&gt;The development workflow involved:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Deploy → Test → Check CloudWatch Logs → Identify Issue → Update Configuration → Redeploy&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This gave me practical experience debugging production-style serverless applications.&lt;/p&gt;

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

&lt;p&gt;Building ReplyPilot AI gave me hands-on experience with several AWS services and modern application development concepts.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Serverless Development
&lt;/h3&gt;

&lt;p&gt;I gained practical experience using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Lambda&lt;/li&gt;
&lt;li&gt;Amazon API Gateway&lt;/li&gt;
&lt;li&gt;Amazon DynamoDB&lt;/li&gt;
&lt;li&gt;AWS Amplify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These services work together to create a complete application without managing traditional servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure as Code
&lt;/h3&gt;

&lt;p&gt;Using AWS SAM and CloudFormation helped me understand the value of defining infrastructure as code.&lt;/p&gt;

&lt;p&gt;Resources can be deployed consistently instead of manually recreating them through the AWS Console.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting Frontend and Serverless Backend
&lt;/h3&gt;

&lt;p&gt;I learned more about connecting a modern React application with a serverless backend.&lt;/p&gt;

&lt;p&gt;The flow between Amplify, API Gateway, Lambda, and DynamoDB became a complete end-to-end application architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging Serverless Applications
&lt;/h3&gt;

&lt;p&gt;CloudWatch logs, AWS SAM, and repeated testing helped me understand how to troubleshoot problems in deployed serverless environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building Around Everyday Problems
&lt;/h3&gt;

&lt;p&gt;Most importantly, this project reinforced a simple lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A small everyday annoyance can become a genuinely useful application.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Writing professional email replies is something many people do every day.&lt;/p&gt;

&lt;p&gt;Reducing the time spent drafting them can make a small but meaningful difference.&lt;/p&gt;

&lt;p&gt;The application demonstrates how:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI can automate repetitive communication tasks&lt;/li&gt;
&lt;li&gt;Serverless architecture can keep infrastructure simple&lt;/li&gt;
&lt;li&gt;DynamoDB can provide persistent reply history&lt;/li&gt;
&lt;li&gt;AWS SAM and CloudFormation can make deployments repeatable&lt;/li&gt;
&lt;li&gt;CloudWatch can help debug real deployment issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core workflow remains simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Received Email → Choose Tone → AI Generates Reply → Save to History&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the most useful AI applications are not the most complicated ones.&lt;/p&gt;

&lt;p&gt;They simply remove friction from tasks we already do every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try ReplyPilot AI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://staging.d50wiy1iuq3mr.amplifyapp.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Open ReplyPilot AI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building DevDigest AI: An Always-On Agent That Prepares Your Daily Developer Briefing | Day 6</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Wed, 26 Aug 2026 01:57:00 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/building-devdigest-ai-an-always-on-agent-that-prepares-your-daily-developer-briefing-day-6-2hn7</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/building-devdigest-ai-an-always-on-agent-that-prepares-your-daily-developer-briefing-day-6-2hn7</guid>
      <description>&lt;h3&gt;
  
  
  10 Days of Building AI Agents on AWS | Day 6
&lt;/h3&gt;

&lt;p&gt;Developers live in a world of constant information.&lt;/p&gt;

&lt;p&gt;Every day brings new AI models, AWS announcements, cloud updates, open-source releases, developer tools, frameworks, GitHub projects, and learning opportunities.&lt;/p&gt;

&lt;p&gt;Access to information has never been easier.&lt;/p&gt;

&lt;p&gt;Keeping up with everything, however, has become increasingly difficult.&lt;/p&gt;

&lt;p&gt;That is the problem I wanted to solve with &lt;strong&gt;DevDigest AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DevDigest AI is an &lt;strong&gt;always-on AI agent that prepares a daily developer briefing before you even open the app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of manually visiting multiple websites, checking feeds, and deciding which updates actually matter, the agent works in the background and prepares a concise digest automatically.&lt;/p&gt;

&lt;p&gt;The vision behind the project is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The best tool is one that does useful work before you ask it to.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Vision: Your Developer World, Summarized Every Day
&lt;/h2&gt;

&lt;p&gt;DevDigest AI collects fresh information from reliable developer-focused sources and transforms it into a short, readable daily briefing.&lt;/p&gt;

&lt;p&gt;The digest can include important updates from areas such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI&lt;/li&gt;
&lt;li&gt;AWS and cloud computing&lt;/li&gt;
&lt;li&gt;Open source&lt;/li&gt;
&lt;li&gt;Developer tools&lt;/li&gt;
&lt;li&gt;Frameworks and technologies&lt;/li&gt;
&lt;li&gt;Relevant opportunities&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbk4c94gtx97tzc8up0fk.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%2Fbk4c94gtx97tzc8up0fk.PNG" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It also includes a &lt;strong&gt;Learn Today&lt;/strong&gt; section that highlights one useful technical concept or topic.&lt;/p&gt;

&lt;p&gt;The goal is not to collect as much information as possible.&lt;/p&gt;

&lt;p&gt;The goal is to identify &lt;strong&gt;what matters&lt;/strong&gt; and make it easier for developers to stay informed without manually searching through dozens of sources.&lt;/p&gt;

&lt;p&gt;Most importantly, the user does not need to press a button to start the process.&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%2Fu6s0b7bjbe360vnyif93.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%2Fu6s0b7bjbe360vnyif93.PNG" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every day, the autonomous workflow runs in the background:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EventBridge wakes the agent
        ↓
The agent collects fresh information
        ↓
Duplicate and low-value items are filtered
        ↓
Recent digests are checked
        ↓
Groq analyzes and summarizes the information
        ↓
The AI response is validated
        ↓
The completed digest is stored
        ↓
The user returns later
        ↓
Today's briefing is already waiting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what makes DevDigest AI an &lt;strong&gt;always-on AI agent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It independently gathers information, remembers what it has previously reported, creates a new briefing, and prepares the result before the user returns.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built DevDigest AI
&lt;/h2&gt;

&lt;p&gt;I intentionally kept the architecture simple and serverless.&lt;/p&gt;

&lt;p&gt;For the frontend, I chose &lt;strong&gt;plain HTML, CSS, and JavaScript&lt;/strong&gt; instead of introducing a large frontend framework.&lt;/p&gt;

&lt;p&gt;The goal was to focus on the autonomous agent rather than add unnecessary complexity.&lt;/p&gt;

&lt;p&gt;The frontend retrieves the latest digest from an API and presents it in a clean, developer-focused interface.&lt;/p&gt;

&lt;p&gt;For the backend, I used &lt;strong&gt;Node.js and AWS Lambda&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The core daily agent is triggered automatically on a schedule.&lt;/p&gt;

&lt;p&gt;It performs several tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collects information from reliable sources&lt;/li&gt;
&lt;li&gt;Removes duplicate items&lt;/li&gt;
&lt;li&gt;Filters low-value information&lt;/li&gt;
&lt;li&gt;Checks previous digests&lt;/li&gt;
&lt;li&gt;Selects relevant fresh updates&lt;/li&gt;
&lt;li&gt;Sends the selected information to Groq&lt;/li&gt;
&lt;li&gt;Validates the AI-generated response&lt;/li&gt;
&lt;li&gt;Stores the completed digest&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Keeping the AI Grounded in Real Sources
&lt;/h2&gt;

&lt;p&gt;One of my key decisions was to avoid giving the AI unrestricted freedom to invent information.&lt;/p&gt;

&lt;p&gt;DevDigest AI provides Groq with collected source material and instructs it to summarize only that information.&lt;/p&gt;

&lt;p&gt;The generated response is then validated before it is stored.&lt;/p&gt;

&lt;p&gt;This includes checking that generated source URLs correspond to actual collected sources.&lt;/p&gt;

&lt;p&gt;The goal is to reduce the risk of the AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inventing news&lt;/li&gt;
&lt;li&gt;Creating fake announcements&lt;/li&gt;
&lt;li&gt;Adding events that did not happen&lt;/li&gt;
&lt;li&gt;Generating incorrect source links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI acts as an analysis and summarization layer rather than an unrestricted source of information.&lt;/p&gt;

&lt;p&gt;The workflow looks like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Collected Sources → Filtered Information → AI Analysis → Validation → Daily Digest&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Lightweight Agent Memory with DynamoDB
&lt;/h2&gt;

&lt;p&gt;DevDigest AI also has a lightweight form of memory.&lt;/p&gt;

&lt;p&gt;Before generating a new briefing, the system checks recent digests stored in &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This gives the agent context about what it has already reported.&lt;/p&gt;

&lt;p&gt;For example, if an important AI announcement was already included in yesterday's digest, the agent can avoid repeatedly presenting the same update unless there is meaningful new information.&lt;/p&gt;

&lt;p&gt;This helps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce repetition&lt;/li&gt;
&lt;li&gt;Provide more variety&lt;/li&gt;
&lt;li&gt;Prioritize genuinely new information&lt;/li&gt;
&lt;li&gt;Give the agent context about previous outputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I deliberately did not use a vector database or a complex agent framework.&lt;/p&gt;

&lt;p&gt;For this project's requirements, recent digest history in DynamoDB provides a simpler and more appropriate memory mechanism.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not every AI agent needs complex memory. Sometimes recent structured history is enough.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  AWS Services and Architecture
&lt;/h1&gt;

&lt;p&gt;I used &lt;strong&gt;AWS SAM (Serverless Application Model)&lt;/strong&gt; to define and deploy the infrastructure as code.&lt;/p&gt;

&lt;p&gt;The main services used are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS SAM&lt;/strong&gt; for serverless infrastructure and deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon EventBridge&lt;/strong&gt; to automatically wake the agent every day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Lambda&lt;/strong&gt; to run the daily agent and backend API logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon DynamoDB&lt;/strong&gt; to store daily digests and provide lightweight memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Secrets Manager&lt;/strong&gt; to securely store the Groq API key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon API Gateway&lt;/strong&gt; to expose backend endpoints to the frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon S3&lt;/strong&gt; to host the static HTML, CSS, and JavaScript frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon CloudWatch&lt;/strong&gt; for logs and monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture follows this flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EventBridge Schedule
        ↓
DevDigest Daily Agent
AWS Lambda
        ↓
Reliable RSS Feeds and APIs
        ↓
Filter and Deduplicate Information
        ↓
Check Recent Digests
Amazon DynamoDB
        ↓
Retrieve Groq API Key
AWS Secrets Manager
        ↓
Groq AI Analysis and Summarization
        ↓
Validate AI Output
        ↓
Store Daily Digest
Amazon DynamoDB
        ↓
API Gateway + Lambda
        ↓
HTML, CSS and JavaScript Frontend
Amazon S3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Infrastructure as Code with AWS SAM
&lt;/h2&gt;

&lt;p&gt;I used AWS SAM because I wanted the infrastructure to be reproducible.&lt;/p&gt;

&lt;p&gt;Instead of manually creating resources through the AWS Console, the infrastructure is defined and deployed as code.&lt;/p&gt;

&lt;p&gt;The project includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless infrastructure definitions&lt;/li&gt;
&lt;li&gt;Automated deployment scripts&lt;/li&gt;
&lt;li&gt;Resource configuration&lt;/li&gt;
&lt;li&gt;IAM permissions&lt;/li&gt;
&lt;li&gt;API configuration&lt;/li&gt;
&lt;li&gt;Account verification before deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The deployment workflow verifies the currently authenticated AWS account before making infrastructure changes.&lt;/p&gt;

&lt;p&gt;This helps ensure that the project is deployed only to the intended AWS account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Key Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Automation vs Information Quality
&lt;/h3&gt;

&lt;p&gt;One of the biggest challenges was balancing automation with information quality.&lt;/p&gt;

&lt;p&gt;An autonomous agent should not simply collect everything it finds.&lt;/p&gt;

&lt;p&gt;That would recreate the same information overload the project is designed to solve.&lt;/p&gt;

&lt;p&gt;To address this, the workflow focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collecting a limited number of reliable items&lt;/li&gt;
&lt;li&gt;Removing duplicates&lt;/li&gt;
&lt;li&gt;Preferring newer information&lt;/li&gt;
&lt;li&gt;Filtering low-value items&lt;/li&gt;
&lt;li&gt;Using recent digests as memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not more information.&lt;/p&gt;

&lt;p&gt;The goal is better information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preventing AI Hallucinations
&lt;/h3&gt;

&lt;p&gt;Another important challenge was preventing the AI from inventing information.&lt;/p&gt;

&lt;p&gt;The agent must not create fake news, events, announcements, or source links.&lt;/p&gt;

&lt;p&gt;For this reason:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Information is collected first.&lt;/li&gt;
&lt;li&gt;The AI receives the collected source material.&lt;/li&gt;
&lt;li&gt;The AI is instructed to summarize only that material.&lt;/li&gt;
&lt;li&gt;The generated response is validated.&lt;/li&gt;
&lt;li&gt;Source URLs are checked against the collected source data.&lt;/li&gt;
&lt;li&gt;Only validated output is stored.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This makes the system more reliable than simply asking an AI model to tell the user what happened today.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keeping the Architecture Affordable
&lt;/h3&gt;

&lt;p&gt;I also wanted to keep the architecture simple and affordable.&lt;/p&gt;

&lt;p&gt;Serverless services allow the application to run without maintaining an always-running server.&lt;/p&gt;

&lt;p&gt;The daily workload is event-driven.&lt;/p&gt;

&lt;p&gt;The infrastructure performs work when the agent is scheduled to run rather than continuously consuming resources.&lt;/p&gt;

&lt;p&gt;This makes serverless architecture a good fit for an autonomous agent that performs a scheduled daily task.&lt;/p&gt;

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

&lt;p&gt;Building DevDigest AI taught me several important lessons about AWS and autonomous systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Event-Driven Serverless Architecture
&lt;/h2&gt;

&lt;p&gt;I gained hands-on experience with an architecture where &lt;strong&gt;Amazon EventBridge&lt;/strong&gt; triggers work automatically without user interaction.&lt;/p&gt;

&lt;p&gt;A scheduled event can completely change how an AI application works.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;User opens app → User asks → AI responds&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The workflow becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Schedule → Agent wakes up → Information is collected → AI analyzes → Result is stored → User discovers it later&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Infrastructure as Code
&lt;/h2&gt;

&lt;p&gt;I learned more about using AWS SAM and infrastructure as code to define and deploy cloud resources consistently.&lt;/p&gt;

&lt;p&gt;Instead of treating infrastructure as a collection of manually created services, I could define the system as code and reproduce the deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Simple Agent Memory
&lt;/h2&gt;

&lt;p&gt;Another important lesson was that an agent does not always need a complicated framework or vector database.&lt;/p&gt;

&lt;p&gt;For DevDigest AI, DynamoDB provides memory by allowing the system to review recent outputs before creating something new.&lt;/p&gt;

&lt;p&gt;The memory is simple, but it directly supports the agent's purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validating AI Output
&lt;/h2&gt;

&lt;p&gt;AI is powerful for summarization and analysis, but external information should be handled carefully.&lt;/p&gt;

&lt;p&gt;Restricting the AI to collected source material and validating its final response makes the system more reliable.&lt;/p&gt;

&lt;p&gt;This was one of the most important design decisions in the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thinking Beyond Reactive AI
&lt;/h2&gt;

&lt;p&gt;Finally, this project helped me think differently about AI applications.&lt;/p&gt;

&lt;p&gt;Many AI applications are reactive.&lt;/p&gt;

&lt;p&gt;The user opens an app and asks the AI to do something.&lt;/p&gt;

&lt;p&gt;But an always-on agent can work proactively.&lt;/p&gt;

&lt;p&gt;It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wake up automatically&lt;/li&gt;
&lt;li&gt;Collect information&lt;/li&gt;
&lt;li&gt;Review its previous outputs&lt;/li&gt;
&lt;li&gt;Analyze new data&lt;/li&gt;
&lt;li&gt;Create something useful&lt;/li&gt;
&lt;li&gt;Prepare the result before the user asks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That changes the relationship between the user and the application.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;DevDigest AI is my experiment in building an autonomous developer intelligence agent.&lt;/p&gt;

&lt;p&gt;Every day, it wakes up automatically, remembers what it has already reported, collects fresh information, filters duplicates, analyzes relevant updates, validates its output, and prepares a new briefing.&lt;/p&gt;

&lt;p&gt;The user simply returns to the application.&lt;/p&gt;

&lt;p&gt;Today's digest is already waiting.&lt;/p&gt;

&lt;p&gt;The core idea behind the project is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI applications do not always need to wait for the user to start the conversation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes, the most useful agent is one that does the work while you are away.&lt;/p&gt;

&lt;h2&gt;
  
  
  DevDigest AI in One Sentence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevDigest AI is an always-on AI agent that wakes up every day, remembers recent developer updates, collects and analyzes fresh information, and prepares a new developer briefing before you even open the application.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try DevDigest AI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live App:&lt;/strong&gt;&lt;br&gt;
&lt;a href="http://devdigest-ai-frontendbucket-algc5lxb9l2x.s3-website-us-east-1.amazonaws.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Open DevDigest AI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building Meeting2Tasks: Turning Meeting Conversations into Actionable Tasks with AI and AWS | 10 Days of Building AI Agents on AWS | Day 5</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Mon, 24 Aug 2026 01:40:00 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/building-meeting2tasks-turning-meeting-conversations-into-actionable-tasks-with-ai-and-aws-10-2m08</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/building-meeting2tasks-turning-meeting-conversations-into-actionable-tasks-with-ai-and-aws-10-2m08</guid>
      <description>&lt;h3&gt;
  
  
  10 Days of Building AI Agents on AWS | Day 5
&lt;/h3&gt;

&lt;p&gt;Meetings are essential for collaboration, but they often create another problem: someone has to spend time reviewing notes, writing summaries, extracting action items, and documenting key decisions.&lt;/p&gt;

&lt;p&gt;Whether it is a team stand-up, client discussion, or project planning session, this repetitive work can sometimes take almost as long as the meeting itself.&lt;/p&gt;

&lt;p&gt;To solve this problem, I built &lt;strong&gt;Meeting2Tasks&lt;/strong&gt;, an AI-powered web application that automatically transforms meeting transcripts into structured summaries, actionable tasks, key decisions, risks, and unanswered questions.&lt;/p&gt;

&lt;p&gt;Instead of manually organizing notes after every meeting, users simply paste their meeting transcript, and the application does the rest in seconds.&lt;/p&gt;

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

&lt;p&gt;One of the most repetitive tasks in project management is documenting meetings.&lt;/p&gt;

&lt;p&gt;After almost every meeting, someone needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read through lengthy meeting notes or transcripts&lt;/li&gt;
&lt;li&gt;Summarize the discussion&lt;/li&gt;
&lt;li&gt;Identify action items&lt;/li&gt;
&lt;li&gt;Record important decisions&lt;/li&gt;
&lt;li&gt;Highlight project risks&lt;/li&gt;
&lt;li&gt;Capture unanswered questions&lt;/li&gt;
&lt;li&gt;Save everything so it can be reviewed later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This process is repetitive, time-consuming, and can result in inconsistent documentation.&lt;/p&gt;

&lt;p&gt;I wanted to build a tool that could eliminate much of this manual work while producing structured and consistent results.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Meeting2Tasks Does
&lt;/h2&gt;

&lt;p&gt;Meeting2Tasks is a web application designed to automate meeting documentation.&lt;/p&gt;

&lt;p&gt;Users simply:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste a meeting transcript&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Analyze&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Let AI process the conversation&lt;/li&gt;
&lt;li&gt;Receive structured insights&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fygpz3d5s7g3hlcfra4nb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fygpz3d5s7g3hlcfra4nb.webp" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A concise meeting summary&lt;/li&gt;
&lt;li&gt;Actionable tasks&lt;/li&gt;
&lt;li&gt;Important decisions&lt;/li&gt;
&lt;li&gt;Identified risks&lt;/li&gt;
&lt;li&gt;Open questions&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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzrr42d4etdvvfefh7k5i.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzrr42d4etdvvfefh7k5i.webp" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;br&gt;
Once the analysis is complete, the application stores the meeting and its generated insights in &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Users can revisit previous meetings whenever needed, while the dashboard provides statistics and access to meeting history.&lt;/p&gt;

&lt;p&gt;The result is a faster and more organized workflow for teams that regularly conduct meetings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdjwzsj0llf7efzwgxtrm.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdjwzsj0llf7efzwgxtrm.webp" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The workflow is straightforward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Meeting Transcript → AI Analysis → Structured Insights → Stored Meeting History&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When a user submits a transcript, the application sends it through the backend for AI analysis.&lt;/p&gt;

&lt;p&gt;The Groq API processes the meeting content and returns structured results.&lt;/p&gt;

&lt;p&gt;These results are then stored in DynamoDB for future access.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User submits transcript
        │
        ▼
React + Vite Frontend
        │
        ▼
Amazon API Gateway
        │
        ▼
AWS Lambda
        │
   ┌────┴─────┐
   ▼          ▼
Groq API   DynamoDB
   │          │
   └────┬─────┘
        ▼
Structured Meeting Insights
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qh6xv0kxviw14kdwvfq.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qh6xv0kxviw14kdwvfq.webp" alt=" " width="718" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The application consists of a React frontend and a serverless backend running on AWS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;The frontend was developed using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This provides a fast and responsive interface for submitting transcripts, viewing results, and accessing previous meetings.&lt;/p&gt;

&lt;p&gt;The frontend communicates with a REST API exposed through Amazon API Gateway.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;The backend uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Express.js&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;AWS Lambda&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Express.js application runs inside AWS Lambda, allowing the backend to scale automatically without managing traditional servers.&lt;/p&gt;

&lt;p&gt;When a user submits a transcript, the backend processes the request and sends the transcript to the Groq API.&lt;/p&gt;

&lt;p&gt;The AI then generates structured insights including summaries, tasks, decisions, risks, and open questions.&lt;/p&gt;

&lt;p&gt;The processed results are stored in Amazon DynamoDB.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;p&gt;The frontend is deployed using &lt;strong&gt;AWS Amplify&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The backend infrastructure is built and deployed using &lt;strong&gt;AWS SAM&lt;/strong&gt;, which helps define and manage the serverless application.&lt;/p&gt;

&lt;p&gt;Using this architecture allowed me to focus more on building the application instead of managing servers and infrastructure manually.&lt;/p&gt;

&lt;h1&gt;
  
  
  AWS Services Used
&lt;/h1&gt;

&lt;h2&gt;
  
  
  AWS Amplify
&lt;/h2&gt;

&lt;p&gt;Used to host and deploy the React frontend.&lt;/p&gt;

&lt;p&gt;This makes the application publicly accessible and simplifies frontend deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon API Gateway
&lt;/h2&gt;

&lt;p&gt;Provides REST API endpoints connecting the frontend with the backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Lambda
&lt;/h2&gt;

&lt;p&gt;Runs the Express.js backend in a serverless environment.&lt;/p&gt;

&lt;p&gt;The backend executes when requests arrive without requiring an always-running server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon DynamoDB
&lt;/h2&gt;

&lt;p&gt;Stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Meeting records&lt;/li&gt;
&lt;li&gt;AI-generated summaries&lt;/li&gt;
&lt;li&gt;Action items&lt;/li&gt;
&lt;li&gt;Decisions&lt;/li&gt;
&lt;li&gt;Risks&lt;/li&gt;
&lt;li&gt;Open questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows users to revisit and manage previous meeting results.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS SAM
&lt;/h2&gt;

&lt;p&gt;AWS Serverless Application Model was used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define the backend infrastructure&lt;/li&gt;
&lt;li&gt;Build the serverless application&lt;/li&gt;
&lt;li&gt;Test deployments&lt;/li&gt;
&lt;li&gt;Deploy Lambda and API resources&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Groq API
&lt;/h2&gt;

&lt;p&gt;Groq handles the AI analysis.&lt;/p&gt;

&lt;p&gt;It transforms raw meeting transcripts into structured and actionable insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The complete architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         User
                           │
                           ▼
                 React + Vite Frontend
                           │
                           ▼
                     AWS Amplify
                           │
                           ▼
                  Amazon API Gateway
                           │
                           ▼
               AWS Lambda (Express.js)
                           │
                 ┌─────────┴─────────┐
                 ▼                   ▼
              Groq API         Amazon DynamoDB
                 │                   │
                 └─────────┬─────────┘
                           ▼
            AI Analysis and Stored Meetings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow starts whenever a user submits a meeting transcript through the web application.&lt;/p&gt;

&lt;p&gt;The backend handles the AI request, processes the response, stores the relevant data, and returns structured results to the user.&lt;/p&gt;

&lt;h1&gt;
  
  
  Challenges I Faced
&lt;/h1&gt;

&lt;p&gt;Like most real-world projects, building Meeting2Tasks involved several technical challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running Express.js with AWS Lambda
&lt;/h2&gt;

&lt;p&gt;One of the biggest challenges was integrating an Express.js application with AWS Lambda while ensuring API Gateway correctly routed requests.&lt;/p&gt;

&lt;p&gt;This required understanding how a traditional web framework could work inside a serverless execution environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  DynamoDB Reserved Attribute Names
&lt;/h2&gt;

&lt;p&gt;I also encountered issues with DynamoDB because some attribute names conflicted with reserved words.&lt;/p&gt;

&lt;p&gt;This required modifying database queries and expressions to avoid those conflicts.&lt;/p&gt;

&lt;p&gt;It was a useful reminder that database design and query syntax need careful attention, even in serverless applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment to the Wrong AWS SAM Stack
&lt;/h2&gt;

&lt;p&gt;Another significant challenge involved deployment.&lt;/p&gt;

&lt;p&gt;During debugging, I discovered that updates were being deployed to the wrong AWS SAM stack.&lt;/p&gt;

&lt;p&gt;This caused new API routes not to appear in production, even though everything worked correctly locally.&lt;/p&gt;

&lt;p&gt;After identifying the stack configuration issue and deploying to the correct stack, all endpoints functioned as expected.&lt;/p&gt;

&lt;p&gt;This experience helped me better understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless deployments&lt;/li&gt;
&lt;li&gt;Stack configuration&lt;/li&gt;
&lt;li&gt;Production debugging&lt;/li&gt;
&lt;li&gt;The difference between local and deployed environments&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Building Meeting2Tasks gave me valuable hands-on experience with modern serverless application development.&lt;/p&gt;

&lt;p&gt;Some of the key things I learned include:&lt;/p&gt;

&lt;h3&gt;
  
  
  Building Serverless APIs
&lt;/h3&gt;

&lt;p&gt;How to build REST APIs using AWS Lambda and API Gateway without managing traditional servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS SAM Deployments
&lt;/h3&gt;

&lt;p&gt;How AWS SAM can simplify building, testing, and deploying serverless applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hosting React Applications
&lt;/h3&gt;

&lt;p&gt;How AWS Amplify can be used to deploy and host a modern React frontend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Serverless Architecture Design
&lt;/h3&gt;

&lt;p&gt;How services such as API Gateway, Lambda, and DynamoDB can work together as a complete backend architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrating External AI
&lt;/h3&gt;

&lt;p&gt;How to connect an external AI service such as Groq with an AWS-based application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging Deployments
&lt;/h3&gt;

&lt;p&gt;How configuration mistakes, stack selection, and deployment environments can cause production issues even when an application works locally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persistent Data with DynamoDB
&lt;/h3&gt;

&lt;p&gt;How DynamoDB can store application data and make AI-generated results available for future use.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why This Matters
&lt;/h1&gt;

&lt;p&gt;The main idea behind Meeting2Tasks is simple.&lt;/p&gt;

&lt;p&gt;Teams should spend more time making decisions and completing important work, not repeatedly documenting conversations.&lt;/p&gt;

&lt;p&gt;AI can help automate the repetitive part.&lt;/p&gt;

&lt;p&gt;Instead of manually reviewing a long transcript, users can receive structured information within seconds.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Transcript → Summary → Tasks → Decisions → Risks → Questions&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This does not replace the meeting itself. It reduces the administrative work that follows it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Meeting2Tasks started with one simple problem: manually documenting meetings is repetitive and time-consuming.&lt;/p&gt;

&lt;p&gt;By combining AI with serverless AWS technologies, I built an application that transforms lengthy meeting transcripts into structured, actionable insights within seconds.&lt;/p&gt;

&lt;p&gt;The project demonstrates how AI can help eliminate repetitive work while allowing teams to focus more on making decisions instead of documenting them.&lt;/p&gt;

&lt;p&gt;It also showed me how services such as AWS Lambda, API Gateway, DynamoDB, Amplify, and SAM can work together with an external AI provider to build a scalable application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source Code and Live Application
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/ABDULLAH408/Meeting2Tasks?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Meeting2Tasks on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Application:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://main.djzodsq2i1utx.amplifyapp.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Open Meeting2Tasks&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building VerseCraft AI: Turning Ideas and Emotions Into Original Poems | 10 Days of Building AI Agents on AWS | Day 4</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Fri, 21 Aug 2026 19:00:00 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/building-versecraft-ai-turning-ideas-and-emotions-into-original-poems-10-days-of-building-ai-4ban</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/building-versecraft-ai-turning-ideas-and-emotions-into-original-poems-10-days-of-building-ai-4ban</guid>
      <description>&lt;h1&gt;
  
  
  Building VerseCraft AI: Turning Ideas and Emotions Into Original Poems
&lt;/h1&gt;

&lt;h3&gt;
  
  
  10 Days of Building AI Agents on AWS | Day 4
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tag:&lt;/strong&gt; &lt;code&gt;#creative-expression&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;VerseCraft AI transforms simple ideas, emotions, memories, and thoughts into original poems using generative AI.&lt;/p&gt;

&lt;p&gt;The project combines Groq with a serverless AWS architecture to explore how a focused creative experience can bring together AI, web development, and cloud services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vision and What the App Does
&lt;/h2&gt;

&lt;p&gt;What if you could turn a simple thought, feeling, memory, or idea into a poem in seconds?&lt;/p&gt;

&lt;p&gt;That was the idea behind &lt;strong&gt;VerseCraft AI&lt;/strong&gt;, a simple AI-powered creative writing application.&lt;/p&gt;

&lt;p&gt;Instead of asking users to write a complete poem themselves, VerseCraft lets them provide a simple idea and choose a mood. The application then transforms that input into an original poem.&lt;/p&gt;

&lt;p&gt;For example, a user can enter:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A lonely person watching the rain from a rooftop at midnight."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They can then select a mood such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emotional&lt;/li&gt;
&lt;li&gt;Romantic&lt;/li&gt;
&lt;li&gt;Sad&lt;/li&gt;
&lt;li&gt;Inspirational&lt;/li&gt;
&lt;li&gt;Dark&lt;/li&gt;
&lt;li&gt;Peaceful&lt;/li&gt;
&lt;li&gt;Funny&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After clicking &lt;strong&gt;Generate Poem&lt;/strong&gt;, VerseCraft creates a title and an original poem inspired by the user's idea and selected mood.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0xpcw6z7jlv09rzo9q1t.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0xpcw6z7jlv09rzo9q1t.webp" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal was not to build a complicated AI platform.&lt;/p&gt;

&lt;p&gt;I wanted to create one focused creative experience that is simple to understand, enjoyable to use, and produces something people can share.&lt;/p&gt;

&lt;p&gt;The generated poem is displayed in a clean, artistic interface with options to copy the poem and generate another one.&lt;/p&gt;

&lt;p&gt;The application is designed to make creative writing feel accessible, even when someone does not know where to start.&lt;/p&gt;

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

&lt;p&gt;I decided early that I wanted to keep the application focused and avoid unnecessary complexity.&lt;/p&gt;

&lt;p&gt;There are no:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User accounts&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Payment systems&lt;/li&gt;
&lt;li&gt;Complicated dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire application revolves around one simple interaction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Idea → Mood → AI → Poem&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The frontend was built using &lt;strong&gt;HTML, CSS, and JavaScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I wanted the interface to feel more like a small digital writing studio than a traditional AI dashboard, so I focused on a minimal design with a black, white, and yellow or gold visual theme.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Generation with Groq
&lt;/h2&gt;

&lt;p&gt;For AI generation, I used the &lt;strong&gt;Groq API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The backend receives the user's idea and selected mood and sends them to the AI with a carefully designed prompt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F97o6nivltj008f4j6h2r.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F97o6nivltj008f4j6h2r.webp" alt=" " width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The prompt instructs the model to generate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A suitable title&lt;/li&gt;
&lt;li&gt;An original poem&lt;/li&gt;
&lt;li&gt;A structured response that the frontend can display cleanly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The generation flow is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;User Idea → Selected Mood → Backend → Groq AI → Generated Poem&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One important decision was to keep the Groq API key completely away from the frontend.&lt;/p&gt;

&lt;p&gt;The browser communicates with the backend API instead of communicating directly with Groq.&lt;/p&gt;

&lt;p&gt;This prevents the API key from being exposed in client-side JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serverless Backend
&lt;/h2&gt;

&lt;p&gt;The backend uses &lt;strong&gt;Node.js running on AWS Lambda&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When a user requests a poem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user enters an idea and selects a mood.&lt;/li&gt;
&lt;li&gt;The frontend sends the request to API Gateway.&lt;/li&gt;
&lt;li&gt;API Gateway invokes AWS Lambda.&lt;/li&gt;
&lt;li&gt;Lambda processes the input.&lt;/li&gt;
&lt;li&gt;Lambda securely calls the Groq API.&lt;/li&gt;
&lt;li&gt;Groq generates the poem.&lt;/li&gt;
&lt;li&gt;Lambda returns the structured result.&lt;/li&gt;
&lt;li&gt;The frontend displays the poem.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  │
  ▼
Frontend
  │
  ▼
API Gateway
  │
  ▼
AWS Lambda
  │
  ▼
Groq API
  │
  ▼
Poem JSON
  │
  ▼
Frontend displays poem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  AWS Services Used and Architecture
&lt;/h2&gt;

&lt;p&gt;VerseCraft AI uses several AWS services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon S3&lt;/strong&gt; for storing and hosting the static frontend files, including HTML, CSS, and JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon CloudFront&lt;/strong&gt; for delivering the frontend globally through a CDN and providing HTTPS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon API Gateway&lt;/strong&gt; for providing the public API endpoint used by the frontend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Lambda&lt;/strong&gt; for running the serverless Node.js backend that communicates with Groq.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS IAM&lt;/strong&gt; for providing permissions and execution roles required by AWS services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS CloudFormation&lt;/strong&gt; for defining and provisioning infrastructure using YAML.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The overall architecture is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         USER
                           │
                           ▼
                    ┌──────────────┐
                    │  CloudFront  │
                    │ HTTPS / CDN  │
                    └──────┬───────┘
                           │
                           ▼
                    ┌──────────────┐
                    │      S3      │
                    │ HTML/CSS/JS  │
                    └──────────────┘

       User clicks "Generate Poem"
                           │
                           ▼
                    ┌──────────────┐
                    │ API Gateway  │
                    │POST /generate│
                    └──────┬───────┘
                           │
                           ▼
                    ┌──────────────┐
                    │    Lambda    │
                    │   Node.js    │
                    └──────┬───────┘
                           │
                           ▼
                    ┌──────────────┐
                    │   Groq API   │
                    │ Generative AI│
                    └──────┬───────┘
                           │
                           ▼
                       POEM JSON
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CloudFormation ties the AWS infrastructure together and makes deployment reproducible.&lt;/p&gt;

&lt;p&gt;Instead of manually creating every AWS resource, the infrastructure can be provisioned from a YAML template.&lt;/p&gt;

&lt;p&gt;This serverless architecture also means there is no always-running application server to maintain.&lt;/p&gt;

&lt;p&gt;The backend runs when requests arrive, making the architecture a good fit for a focused creative application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Kept It Simple
&lt;/h2&gt;

&lt;p&gt;A key decision behind VerseCraft AI was to focus on one experience and do it well.&lt;/p&gt;

&lt;p&gt;It would have been easy to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User profiles&lt;/li&gt;
&lt;li&gt;Saved poem collections&lt;/li&gt;
&lt;li&gt;Social features&lt;/li&gt;
&lt;li&gt;Multiple dashboards&lt;/li&gt;
&lt;li&gt;Complex AI settings&lt;/li&gt;
&lt;li&gt;Payment systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But none of those were necessary for the core idea.&lt;/p&gt;

&lt;p&gt;The most important workflow is simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A person has an idea. AI helps turn that idea into something creative.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Keeping the application focused allowed me to concentrate on the experience and the underlying serverless architecture.&lt;/p&gt;

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

&lt;p&gt;Building VerseCraft AI gave me the opportunity to combine several areas I had been learning separately into one complete application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting AI to a Frontend
&lt;/h3&gt;

&lt;p&gt;It is easy to call an AI API from a simple script.&lt;/p&gt;

&lt;p&gt;Building the complete flow is different.&lt;/p&gt;

&lt;p&gt;I had to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browser requests&lt;/li&gt;
&lt;li&gt;API design&lt;/li&gt;
&lt;li&gt;Request formats&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Structured AI responses&lt;/li&gt;
&lt;li&gt;Backend security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complete flow became:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Browser → API Gateway → Lambda → Groq → Lambda → Browser&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Serverless Backend Development
&lt;/h3&gt;

&lt;p&gt;I learned more about how &lt;strong&gt;AWS Lambda and API Gateway&lt;/strong&gt; can create a backend without maintaining a traditional server.&lt;/p&gt;

&lt;p&gt;The application only runs backend code when a request arrives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure as Code
&lt;/h3&gt;

&lt;p&gt;Using CloudFormation made me think about AWS infrastructure as a complete system rather than a collection of resources manually created through the AWS Console.&lt;/p&gt;

&lt;p&gt;Defining resources, permissions, dependencies, and outputs in YAML makes deployments easier to reproduce.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simple AI Experiences Can Still Be Useful
&lt;/h3&gt;

&lt;p&gt;One of my biggest takeaways was that a creative AI application does not need to be complicated to be useful.&lt;/p&gt;

&lt;p&gt;The most important part of VerseCraft AI is the experience:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give someone a blank box, let them express an idea, and turn that idea into something creative.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;VerseCraft AI is a small experiment in combining creative expression, generative AI, and serverless AWS infrastructure.&lt;/p&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Idea → Mood → AI → Poem&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes, a focused application can create a better experience than a feature-heavy platform.&lt;/p&gt;

&lt;p&gt;VerseCraft AI gives users a simple starting point. They bring an idea, feeling, memory, or even just one sentence, and the AI helps transform it into something creative.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try VerseCraft AI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live App:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://d3ahx0v89bhhzc.cloudfront.net/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Open VerseCraft AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have an idea, a feeling, a memory, or simply a sentence in your head, give it to VerseCraft AI and see where it takes you.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building StoryForge: An Always-On AI Agent That Creates a New Story | 10 Days of Building AI Agents on AWS | Day 3</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Fri, 21 Aug 2026 01:26:05 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/weekend-creative-agent-challenge-storyforge-3pcd</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/weekend-creative-agent-challenge-storyforge-3pcd</guid>
      <description>&lt;h1&gt;
  
  
  Building StoryForge: An Always-On AI Agent That Creates a New Story Every Day
&lt;/h1&gt;

&lt;h3&gt;
  
  
  10 Days of Building AI Agents on AWS | Day 3
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tag:&lt;/strong&gt; &lt;code&gt;#agents&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What if your creative app didn't wait for you to open it?&lt;/p&gt;

&lt;p&gt;That was the idea behind &lt;strong&gt;StoryForge&lt;/strong&gt;, an always-on AI storytelling agent that creates a brand-new story every day before you even visit the application.&lt;/p&gt;

&lt;p&gt;Traditional AI writing tools are reactive. You open a website, enter a prompt, choose some options, and ask the AI to generate something.&lt;/p&gt;

&lt;p&gt;StoryForge takes a different approach.&lt;/p&gt;

&lt;p&gt;It works in the background as an autonomous creative agent.&lt;/p&gt;

&lt;p&gt;Every day, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wakes up automatically&lt;/li&gt;
&lt;li&gt;Remembers what it has created recently&lt;/li&gt;
&lt;li&gt;Chooses a new creative direction&lt;/li&gt;
&lt;li&gt;Generates a fresh story&lt;/li&gt;
&lt;li&gt;Validates the result&lt;/li&gt;
&lt;li&gt;Saves it for the user&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So when the user comes back, a brand-new story is already waiting.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The user leaves → the agent wakes up automatically → it remembers recent stories → it creates something new → the user returns to discover it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Vision
&lt;/h2&gt;

&lt;p&gt;I wanted to build something simple while demonstrating an important idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The best creative tool does not always need to wait for instructions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;StoryForge is built around the concept of passive creativity.&lt;/p&gt;

&lt;p&gt;Instead of opening an application and asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should I write today?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The user can simply return and discover what the AI agent has already created.&lt;/p&gt;

&lt;p&gt;The goal wasn't to build a complicated multi-agent system or a massive AI platform.&lt;/p&gt;

&lt;p&gt;I wanted to demonstrate one clear always-on agent workflow.&lt;/p&gt;

&lt;p&gt;The agent should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Act without waiting for the user&lt;/li&gt;
&lt;li&gt;Run automatically&lt;/li&gt;
&lt;li&gt;Remember recent context&lt;/li&gt;
&lt;li&gt;Use that context to influence its next action&lt;/li&gt;
&lt;li&gt;Create something new&lt;/li&gt;
&lt;li&gt;Have its work ready before the user returns&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwbuq6qpcyg89rq81qvkf.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%2Fwbuq6qpcyg89rq81qvkf.PNG" alt=" " width="800" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lightweight Agent Memory
&lt;/h2&gt;

&lt;p&gt;One challenge with generating stories automatically is repetition.&lt;/p&gt;

&lt;p&gt;If the AI receives the same instructions every day, it may repeatedly generate similar genres, themes, settings, or story structures.&lt;/p&gt;

&lt;p&gt;To reduce this, StoryForge has a lightweight form of memory.&lt;/p&gt;

&lt;p&gt;Before generating a new story, the agent retrieves recent stories from its database, including information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Title&lt;/li&gt;
&lt;li&gt;Genre&lt;/li&gt;
&lt;li&gt;Theme&lt;/li&gt;
&lt;li&gt;Setting&lt;/li&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This recent creative history is provided to the AI as context.&lt;/p&gt;

&lt;p&gt;The generation instructions tell the agent to avoid repeating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Similar premises&lt;/li&gt;
&lt;li&gt;Recent genres&lt;/li&gt;
&lt;li&gt;Themes&lt;/li&gt;
&lt;li&gt;Settings&lt;/li&gt;
&lt;li&gt;Story structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means StoryForge isn't simply running the exact same prompt every day.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It uses its recent creative history to influence what it creates next.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  How StoryForge Works
&lt;/h1&gt;

&lt;p&gt;The entire workflow begins automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: EventBridge Scheduler wakes up the agent
&lt;/h2&gt;

&lt;p&gt;Every day, &lt;strong&gt;Amazon EventBridge Scheduler&lt;/strong&gt; triggers the story-generation workflow.&lt;/p&gt;

&lt;p&gt;The user doesn't need to click a button.&lt;/p&gt;

&lt;p&gt;The agent wakes up automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EventBridge Scheduler
        ↓
AWS Lambda
        ↓
Check today's story
        ↓
Retrieve recent memory
        ↓
Generate a new story with Groq
        ↓
Validate response
        ↓
Save to DynamoDB
        ↓
Story is ready for the user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Check for duplicate generations
&lt;/h2&gt;

&lt;p&gt;The Lambda function first checks whether a story has already been generated for the current day.&lt;/p&gt;

&lt;p&gt;This makes the workflow &lt;strong&gt;idempotent&lt;/strong&gt; and prevents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duplicate stories&lt;/li&gt;
&lt;li&gt;Unnecessary AI API calls&lt;/li&gt;
&lt;li&gt;Extra costs&lt;/li&gt;
&lt;li&gt;Multiple executions creating conflicting data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Retrieve recent stories from DynamoDB
&lt;/h2&gt;

&lt;p&gt;The agent retrieves recently generated stories from &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These stories act as the agent's lightweight memory.&lt;/p&gt;

&lt;p&gt;For StoryForge, I didn't need a vector database or complex memory architecture.&lt;/p&gt;

&lt;p&gt;The last few stories provide enough information for the AI to understand what it has recently created and move in a different creative direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Generate a fresh story with Groq
&lt;/h2&gt;

&lt;p&gt;The Lambda function sends the generation request to the &lt;strong&gt;Groq API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Groq acts as the creative AI engine, while AWS handles the infrastructure, automation, storage, and security surrounding the agent.&lt;/p&gt;

&lt;p&gt;The AI returns a structured story containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Title&lt;/li&gt;
&lt;li&gt;Genre&lt;/li&gt;
&lt;li&gt;Theme&lt;/li&gt;
&lt;li&gt;Setting&lt;/li&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;li&gt;Full story&lt;/li&gt;
&lt;li&gt;Moral&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Lambda validates the response before saving it.&lt;/p&gt;

&lt;p&gt;If the AI returns malformed or incomplete data, the system handles the failure safely instead of storing corrupted information.&lt;/p&gt;

&lt;h1&gt;
  
  
  AWS Architecture
&lt;/h1&gt;

&lt;p&gt;The architecture is intentionally simple and serverless:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EventBridge Scheduler
        ↓
AWS Lambda
        ↓
Amazon DynamoDB
        ↓
Groq API
        ↓
Amazon DynamoDB
        ↓
API Gateway
        ↓
Static HTML, CSS and JavaScript
        ↓
Amazon S3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3y4kz2p0m10g94yg05u9.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%2F3y4kz2p0m10g94yg05u9.PNG" alt=" " width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Services Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Lambda&lt;/strong&gt;: Autonomous story-generation agent and backend API logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;: Story storage and lightweight memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon EventBridge Scheduler&lt;/strong&gt;: Automatically wakes the agent every day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon API Gateway HTTP API&lt;/strong&gt;: Connects the frontend with the backend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Secrets Manager&lt;/strong&gt;: Securely stores the Groq API key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon S3&lt;/strong&gt;: Hosts the static frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon CloudFormation&lt;/strong&gt;: Infrastructure as Code and automated deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon CloudWatch Logs&lt;/strong&gt;: Monitoring and debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Security
&lt;/h1&gt;

&lt;p&gt;The Groq API key is never exposed in the frontend or committed to source code.&lt;/p&gt;

&lt;p&gt;It is securely stored in &lt;strong&gt;AWS Secrets Manager&lt;/strong&gt;, and Lambda retrieves it using IAM permissions following the principle of least privilege.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend
    No API Key
        ↓
API Gateway
        ↓
Lambda
        ↓
AWS Secrets Manager
        ↓
Groq API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Why HTML, CSS, and Vanilla JavaScript?
&lt;/h1&gt;

&lt;p&gt;I deliberately kept the frontend simple.&lt;/p&gt;

&lt;p&gt;The goal wasn't to demonstrate a complex frontend framework. The focus was on the autonomous AI agent architecture.&lt;/p&gt;

&lt;p&gt;The frontend only needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Display today's story&lt;/li&gt;
&lt;li&gt;Browse previous stories&lt;/li&gt;
&lt;li&gt;View individual stories&lt;/li&gt;
&lt;li&gt;Communicate with the backend API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML, CSS, and vanilla JavaScript were enough.&lt;/p&gt;

&lt;p&gt;This allowed me to focus on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Automation, Memory, AI, and Serverless Architecture&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Challenges and Key Decisions
&lt;/h1&gt;

&lt;p&gt;The biggest challenge was balancing the idea of an &lt;strong&gt;AI agent&lt;/strong&gt; with the need to keep the project simple.&lt;/p&gt;

&lt;p&gt;It would have been easy to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vector databases&lt;/li&gt;
&lt;li&gt;Complex agent frameworks&lt;/li&gt;
&lt;li&gt;Multiple AI models&lt;/li&gt;
&lt;li&gt;Several interacting agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But those additions weren't necessary for this use case.&lt;/p&gt;

&lt;p&gt;Instead, I focused on the essential characteristics of an always-on agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It acts without waiting for the user.&lt;/li&gt;
&lt;li&gt;It runs on a schedule.&lt;/li&gt;
&lt;li&gt;It remembers recent context.&lt;/li&gt;
&lt;li&gt;It uses that context to influence its next action.&lt;/li&gt;
&lt;li&gt;It creates something new.&lt;/li&gt;
&lt;li&gt;Its output is ready when the user returns.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Why DynamoDB Was Enough for Memory
&lt;/h1&gt;

&lt;p&gt;A major lesson from this project was that &lt;strong&gt;not every AI agent needs a complex memory system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For StoryForge, the agent only needs to know what it created recently.&lt;/p&gt;

&lt;p&gt;Retrieving recent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Titles&lt;/li&gt;
&lt;li&gt;Genres&lt;/li&gt;
&lt;li&gt;Themes&lt;/li&gt;
&lt;li&gt;Settings&lt;/li&gt;
&lt;li&gt;Summaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;provides enough context to encourage creative variety.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sometimes the simplest memory architecture is the one that best fits the problem.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Building StoryForge helped me better understand:&lt;/p&gt;

&lt;h2&gt;
  
  
  Serverless Architecture
&lt;/h2&gt;

&lt;p&gt;How Lambda, API Gateway, DynamoDB, and S3 can work together to create a complete application without managing servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Event-Driven Automation
&lt;/h2&gt;

&lt;p&gt;How EventBridge Scheduler can transform a traditional reactive AI application into an always-on system.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;User → Request → AI → Result&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The workflow becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Schedule → Agent → Memory → AI → Storage → User discovers the result&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The user is no longer responsible for initiating every action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lightweight Agent Memory
&lt;/h2&gt;

&lt;p&gt;Not every agent needs a vector database or complicated retrieval system.&lt;/p&gt;

&lt;p&gt;For StoryForge, DynamoDB provides enough recent context to influence future generations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrastructure as Code
&lt;/h2&gt;

&lt;p&gt;CloudFormation makes infrastructure deployment more repeatable and consistent while reducing manual configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Secure AI Integration
&lt;/h2&gt;

&lt;p&gt;AWS Secrets Manager keeps the Groq API key away from the frontend and source code, while IAM controls access.&lt;/p&gt;

&lt;h1&gt;
  
  
  What's Next?
&lt;/h1&gt;

&lt;p&gt;StoryForge currently focuses on one simple promise:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A new story every day.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the future, I would like to explore allowing the agent to develop a stronger creative identity over time.&lt;/p&gt;

&lt;p&gt;It could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyze patterns in previous stories&lt;/li&gt;
&lt;li&gt;Experiment with different narrative styles&lt;/li&gt;
&lt;li&gt;Track genres it has used most&lt;/li&gt;
&lt;li&gt;Explore underused creative directions&lt;/li&gt;
&lt;li&gt;Adapt to genres users enjoy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But for now, I intentionally kept the project focused.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;StoryForge proves that an always-on AI agent doesn't need to be complicated.&lt;/p&gt;

&lt;p&gt;Sometimes, all it takes is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A scheduled event, a little memory, an AI model, storage, and the ability to act while the user is away.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That combination can transform a traditional reactive AI application into something proactive.&lt;/p&gt;

&lt;p&gt;The key idea behind StoryForge is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The user doesn't have to ask for creativity every day. The system can create while they're away.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  StoryForge in One Sentence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;StoryForge is an always-on AI storytelling agent that automatically remembers its recent stories, creates a new one every day using Groq, and saves it with AWS before the user even opens the app.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try StoryForge
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live App:&lt;/strong&gt;&lt;br&gt;
&lt;a href="http://storyforge-websitebucket-laklmio97kkg.s3-website-us-east-1.amazonaws.com" rel="noopener noreferrer"&gt;Open StoryForge&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>agentaichallenge</category>
    </item>
    <item>
      <title>Building ByteMentor AI: An Always-On Learning Agent with AWS Serverless | 10 Days of Building AI Agents on AWS | Day 2</title>
      <dc:creator>abdullah haroon</dc:creator>
      <pubDate>Fri, 24 Jul 2026 05:00:00 +0000</pubDate>
      <link>https://dev.to/abdullah_haroon_092cf10d3/building-bytementor-ai-an-always-on-learning-agent-with-aws-serverless-46d</link>
      <guid>https://dev.to/abdullah_haroon_092cf10d3/building-bytementor-ai-an-always-on-learning-agent-with-aws-serverless-46d</guid>
      <description>&lt;p&gt;Self-learning has never been easier, yet staying consistent remains one of the biggest challenges. We have access to countless tutorials, courses, documentation, and videos, but deciding what to learn next often becomes a task of its own. Even after choosing a topic, preparing study material, finding practice exercises, and creating revision questions can consume valuable time before any actual learning begins.&lt;/p&gt;

&lt;p&gt;I wanted to solve this problem by building &lt;strong&gt;ByteMentor AI&lt;/strong&gt;, an autonomous learning companion that prepares personalized daily learning content before the learner even opens the application.&lt;/p&gt;

&lt;p&gt;Instead of functioning as another AI chatbot that waits for user input, ByteMentor proactively generates structured learning sessions on a schedule. Every day, it analyzes the learner's roadmap, determines the next topic, generates a complete lesson with practical examples, coding exercises, quizzes, and revision material, then stores everything so it is immediately available when the learner returns.&lt;/p&gt;

&lt;p&gt;The objective was straightforward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Allow learners to focus on learning instead of planning what to learn.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&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%2F943iu35xu1yk6iqe6od9.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%2F943iu35xu1yk6iqe6od9.PNG" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  The Idea
&lt;/h1&gt;

&lt;p&gt;Learning roadmaps have become increasingly popular, but they usually stop after listing topics in order. The learner is still responsible for researching each concept, finding quality resources, and deciding what to study every day.&lt;/p&gt;

&lt;p&gt;I wanted to extend the roadmap into something more intelligent.&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%2F87emjx6pg7p0tdkujkre.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%2F87emjx6pg7p0tdkujkre.PNG" alt=" " width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of simply displaying a list of topics, ByteMentor continuously transforms that roadmap into daily learning sessions. Once a roadmap has been created, the application knows exactly what should come next and prepares everything automatically.&lt;/p&gt;

&lt;p&gt;Each generated lesson includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detailed explanation of the topic&lt;/li&gt;
&lt;li&gt;Practical coding examples&lt;/li&gt;
&lt;li&gt;Hands-on programming exercises&lt;/li&gt;
&lt;li&gt;Multiple-choice quiz questions&lt;/li&gt;
&lt;li&gt;Learning summary&lt;/li&gt;
&lt;li&gt;Productivity tips&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the learner opens the application, today's lesson is already waiting.&lt;/p&gt;




&lt;h1&gt;
  
  
  System Architecture
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                GitHub
                   │
                   ▼
             AWS Amplify
                   │
                   ▼
          React + TypeScript
                   │
                   ▼
            Amazon API Gateway
                   │
                   ▼
              AWS Lambda
        (ByteMentor AI Agent)
           │             │
           ▼             ▼
        Groq API     DynamoDB
           ▲             │
           └──────┬──────┘
                  ▲
                  │
      Amazon EventBridge Scheduler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each AWS service is responsible for a single part of the workflow, resulting in a scalable and event-driven architecture.&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%2Fhwf5e7zyf5e0a1rnxukz.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%2Fhwf5e7zyf5e0a1rnxukz.PNG" alt=" " width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Frontend
&lt;/h1&gt;

&lt;p&gt;The frontend is built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface allows learners to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate personalized learning roadmaps&lt;/li&gt;
&lt;li&gt;View today's lesson&lt;/li&gt;
&lt;li&gt;Browse previous lessons&lt;/li&gt;
&lt;li&gt;Track learning history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application is deployed using &lt;strong&gt;AWS Amplify&lt;/strong&gt;, which automatically builds and deploys the frontend directly from GitHub.&lt;/p&gt;

&lt;h2&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%2Fln06lpcj4cgd4m7oam4b.PNG" alt=" " width="800" height="368"&gt;
&lt;/h2&gt;

&lt;h1&gt;
  
  
  Backend
&lt;/h1&gt;

&lt;p&gt;The backend is built using &lt;strong&gt;Node.js&lt;/strong&gt; and &lt;strong&gt;AWS Lambda&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Amazon API Gateway exposes REST endpoints that communicate with Lambda functions responsible for handling business logic.&lt;/p&gt;

&lt;p&gt;The backend is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading learning roadmaps&lt;/li&gt;
&lt;li&gt;Determining the next lesson&lt;/li&gt;
&lt;li&gt;Generating AI content&lt;/li&gt;
&lt;li&gt;Saving generated lessons&lt;/li&gt;
&lt;li&gt;Retrieving previous learning sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because everything runs inside Lambda, there are no servers to manage, making the application lightweight and cost-effective.&lt;/p&gt;




&lt;h1&gt;
  
  
  AI Content Generation
&lt;/h1&gt;

&lt;p&gt;ByteMentor integrates with a large language model to generate structured educational content.&lt;/p&gt;

&lt;p&gt;Rather than requesting plain text responses, the application prompts the model to return structured JSON, making it easy to render lessons consistently across the interface.&lt;/p&gt;

&lt;p&gt;Each lesson contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Topic overview&lt;/li&gt;
&lt;li&gt;Step-by-step explanation&lt;/li&gt;
&lt;li&gt;Code snippets&lt;/li&gt;
&lt;li&gt;Practical exercise&lt;/li&gt;
&lt;li&gt;Quiz questions&lt;/li&gt;
&lt;li&gt;Key takeaways&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach creates a much richer learning experience than simply displaying AI-generated paragraphs.&lt;/p&gt;

&lt;h2&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%2Fq145fvboaethgo85uua3.PNG" alt=" " width="800" height="721"&gt;
&lt;/h2&gt;

&lt;h1&gt;
  
  
  Persistent Storage
&lt;/h1&gt;

&lt;p&gt;Amazon DynamoDB stores all generated learning content.&lt;/p&gt;

&lt;p&gt;This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning roadmaps&lt;/li&gt;
&lt;li&gt;Daily lessons&lt;/li&gt;
&lt;li&gt;Learning history&lt;/li&gt;
&lt;li&gt;Generated quizzes&lt;/li&gt;
&lt;li&gt;Coding exercises&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since lessons are stored after generation, learners can revisit previous sessions without requiring the AI model to generate them again.&lt;/p&gt;




&lt;h1&gt;
  
  
  Making the Agent Autonomous
&lt;/h1&gt;

&lt;p&gt;The defining feature of ByteMentor is that it operates proactively rather than reactively.&lt;/p&gt;

&lt;p&gt;Instead of waiting for a user to request a lesson, &lt;strong&gt;Amazon EventBridge Scheduler&lt;/strong&gt; automatically invokes the Lambda function every morning.&lt;/p&gt;

&lt;p&gt;The scheduled workflow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EventBridge Scheduler
        │
        ▼
AWS Lambda
        │
        ▼
Read learning roadmap
        │
        ▼
Determine today's topic
        │
        ▼
Generate lesson
        │
        ▼
Create coding challenge
        │
        ▼
Generate quiz
        │
        ▼
Store in DynamoDB
        │
        ▼
Lesson ready before user logs in
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means the learner is welcomed with fresh learning content every day without initiating any manual action.&lt;/p&gt;

&lt;h2&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%2Fvf8yzb02bbe9rjty9dh7.PNG" alt=" " width="800" height="397"&gt;
&lt;/h2&gt;

&lt;h1&gt;
  
  
  AWS Services Used
&lt;/h1&gt;

&lt;p&gt;The project combines several AWS services into a single serverless workflow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Amplify&lt;/li&gt;
&lt;li&gt;Amazon API Gateway&lt;/li&gt;
&lt;li&gt;AWS Lambda&lt;/li&gt;
&lt;li&gt;Amazon EventBridge Scheduler&lt;/li&gt;
&lt;li&gt;Amazon DynamoDB&lt;/li&gt;
&lt;li&gt;Amazon CloudWatch&lt;/li&gt;
&lt;li&gt;AWS IAM&lt;/li&gt;
&lt;li&gt;AWS SAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each service contributes a focused responsibility, making the system easy to maintain and extend.&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%2Foqebwbg2pofjfys74n9o.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%2Foqebwbg2pofjfys74n9o.PNG" alt=" " width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Development Process
&lt;/h1&gt;

&lt;p&gt;The project began with designing a clean learning workflow rather than focusing solely on AI generation.&lt;/p&gt;

&lt;p&gt;The roadmap became the central source of truth for determining future lessons. Once that workflow was established, the backend was designed around AWS Lambda functions capable of generating and storing lessons independently.&lt;/p&gt;

&lt;p&gt;The frontend was then built to consume those generated lessons, allowing users to view content without worrying about how or when it was created.&lt;/p&gt;

&lt;p&gt;Finally, EventBridge Scheduler transformed the application from an on-demand AI tool into an autonomous learning agent by moving lesson generation to a scheduled background process.&lt;/p&gt;




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

&lt;p&gt;Building ByteMentor provided valuable experience across several AWS services and architectural patterns.&lt;/p&gt;

&lt;p&gt;Some of the key takeaways include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing event-driven serverless applications&lt;/li&gt;
&lt;li&gt;Building production deployments using AWS SAM&lt;/li&gt;
&lt;li&gt;Using Amazon EventBridge Scheduler for background automation&lt;/li&gt;
&lt;li&gt;Connecting API Gateway with AWS Lambda&lt;/li&gt;
&lt;li&gt;Designing DynamoDB data models&lt;/li&gt;
&lt;li&gt;Building structured AI prompts that consistently return machine-readable responses&lt;/li&gt;
&lt;li&gt;Separating frontend and backend responsibilities for easier maintenance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More importantly, the project reinforced the idea that AI becomes significantly more useful when it performs work proactively instead of waiting for user requests.&lt;/p&gt;




&lt;h1&gt;
  
  
  Future Improvements
&lt;/h1&gt;

&lt;p&gt;There are several features I plan to add in future iterations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon Cognito authentication&lt;/li&gt;
&lt;li&gt;Progress tracking and learning analytics&lt;/li&gt;
&lt;li&gt;Achievement badges and learning streaks&lt;/li&gt;
&lt;li&gt;PDF lesson exports&lt;/li&gt;
&lt;li&gt;Voice narration&lt;/li&gt;
&lt;li&gt;AI-generated diagrams&lt;/li&gt;
&lt;li&gt;Spaced repetition for long-term retention&lt;/li&gt;
&lt;li&gt;Multi-user support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These additions will further enhance the personalized learning experience while maintaining the autonomous nature of the platform.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;ByteMentor AI demonstrates how serverless AWS services can be combined to create an autonomous learning system that works continuously in the background.&lt;/p&gt;

&lt;p&gt;By leveraging AWS Lambda, EventBridge Scheduler, DynamoDB, API Gateway, and Amplify, the application generates personalized learning sessions without requiring user intervention. Instead of deciding what to study every day, learners can simply open the application and begin learning immediately.&lt;/p&gt;

&lt;p&gt;Building this project was an excellent opportunity to explore event-driven architectures, serverless development, and AI-powered automation while creating a practical solution to a real productivity problem.&lt;/p&gt;




&lt;h1&gt;
  
  
  Live Demo
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://main.d2qeklo0lut2is.amplifyapp.com/" rel="noopener noreferrer"&gt;https://main.d2qeklo0lut2is.amplifyapp.com/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  GitHub Repository
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/ABDULLAH408/ByteMentor_AI" rel="noopener noreferrer"&gt;https://github.com/ABDULLAH408/ByteMentor_AI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
