<?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: Elvin Ali</title>
    <description>The latest articles on DEV Community by Elvin Ali (@lvnhmd).</description>
    <link>https://dev.to/lvnhmd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3639694%2F64b09a73-7cee-4c4a-924b-e1b3e5a33a8c.png</url>
      <title>DEV Community: Elvin Ali</title>
      <link>https://dev.to/lvnhmd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lvnhmd"/>
    <language>en</language>
    <item>
      <title>I Tried Kiro for a Hackathon - Here’s What Happened</title>
      <dc:creator>Elvin Ali</dc:creator>
      <pubDate>Mon, 01 Dec 2025 18:40:20 +0000</pubDate>
      <link>https://dev.to/lvnhmd/i-tried-kiro-for-a-hackathon-heres-what-happened-3hgk</link>
      <guid>https://dev.to/lvnhmd/i-tried-kiro-for-a-hackathon-heres-what-happened-3hgk</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I built &lt;a href="https://www.hauntedreader.com" rel="noopener noreferrer"&gt;The Haunted Reader&lt;/a&gt; - an AI-powered multi-perspective text analysis tool - in 45 hours using Kiro. The combination of spec-driven development and vibe coding helped me achieve 100% task completion with zero critical bugs. Here's how.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;p&gt;For the Kiroween Hackathon, I wanted to build something ambitious: a web app that uses AI to analyze text from multiple literary perspectives. Think "What would Edgar Allan Poe say about your writing?" or "How would a 5-year-old interpret this story?"&lt;/p&gt;

&lt;p&gt;The technical requirements were daunting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React frontend with complex state management&lt;/li&gt;
&lt;li&gt;Amazon Bedrock integration for AI text generation&lt;/li&gt;
&lt;li&gt;File parsing (PDF, EPUB, TXT)&lt;/li&gt;
&lt;li&gt;Emotional flow visualization&lt;/li&gt;
&lt;li&gt;AWS deployment with custom domain&lt;/li&gt;
&lt;li&gt;WCAG 2.1 AA accessibility compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a traditional workflow, this would take weeks. I had 2 days.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter Kiro: A Different Approach
&lt;/h2&gt;

&lt;p&gt;I'd heard about Kiro's spec-driven development, but I was skeptical. "Write specs first? That sounds slow." I was wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Specs as Architecture (2 hours)
&lt;/h3&gt;

&lt;p&gt;Instead of jumping into code, I spent 2 hours writing three spec files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;requirements.md&lt;/strong&gt; - 7 acceptance criteria&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;AC-1: Users can upload TXT, PDF, or EPUB files up to 10MB
AC-2: Users can select up to 5 literary spirits simultaneously
AC-3: AI generates interpretations in &amp;lt; 30 seconds for 5000 words
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;design.md&lt;/strong&gt; - 9 modules with correctness properties&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;CP-4.1: T_interpretation &amp;lt; 30s for |W| ≤ 5000
CP-8.2: Σ(emotions) = 1.0 per section
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;tasks.md&lt;/strong&gt; - 21 implementation tasks&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Task 1: Set up React + Vite project
Task 2: Implement file parser service
Task 3: Create spirit definitions...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The payoff:&lt;/strong&gt; Kiro now understood my entire project. Every subsequent conversation had context.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 2: Vibe Coding with Context (20 hours)
&lt;/h2&gt;

&lt;p&gt;Here's where Kiro shined. Instead of writing boilerplate, I had natural conversations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; "Create the Spectral Timeline component with emotion analysis"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiro:&lt;/strong&gt; Generated a complete component with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emotion scoring algorithm (6 emotions, scores sum to 1.0)&lt;/li&gt;
&lt;li&gt;Interactive visualization with DaisyUI&lt;/li&gt;
&lt;li&gt;Accessibility features (ARIA labels, keyboard nav)&lt;/li&gt;
&lt;li&gt;Mathematical correctness validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The code it generated:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateEmotionScores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lowerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&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;counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;fear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;joy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;sadness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;mystery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;neutral&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// Keyword matching for each emotion&lt;/span&gt;
  &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;EMOTION_KEYWORDS&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emotion&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;EMOTION_KEYWORDS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keyword&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;lowerText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;totalCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Normalize to sum to 1.0&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;totalCount&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;joy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
             &lt;span class="na"&gt;sadness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;mystery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;neutral&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emotion&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;totalCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What impressed me:&lt;/strong&gt; Kiro didn't just generate code - it understood the mathematical constraint from my spec (emotions must sum to 1.0) and implemented it correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Most Impressive Generation
&lt;/h2&gt;

&lt;p&gt;The AWS deployment configuration was the moment I became a believer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; "Help me deploy to AWS with S3, CloudFront, and Cognito"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiro generated:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Complete deployment script with error handling&lt;/li&gt;
&lt;li&gt;CloudFront distribution config&lt;/li&gt;
&lt;li&gt;Cognito Identity Pool setup&lt;/li&gt;
&lt;li&gt;IAM roles with proper permissions&lt;/li&gt;
&lt;li&gt;CORS configuration&lt;/li&gt;
&lt;li&gt;SPA routing fixes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; A production-ready deployment script that worked on the first try.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Generated by Kiro with proper error handling,&lt;/span&gt;
&lt;span class="c"&gt;# CloudFront invalidation, and security best practices&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Steering Documents: The Secret Weapon
&lt;/h2&gt;

&lt;p&gt;I created &lt;code&gt;project-context.md&lt;/code&gt; in &lt;code&gt;.kiro/steering/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Code Style&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Keep components under 200 lines
&lt;span class="p"&gt;-&lt;/span&gt; Use DaisyUI for UI components
&lt;span class="p"&gt;-&lt;/span&gt; Follow AWS SDK best practices

&lt;span class="gu"&gt;## Spirit Personalities&lt;/span&gt;
Each spirit must have:
&lt;span class="p"&gt;-&lt;/span&gt; Distinct voice and vocabulary
&lt;span class="p"&gt;-&lt;/span&gt; Consistent tone across operations
&lt;span class="p"&gt;-&lt;/span&gt; Accurate style mimicry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The impact:&lt;/strong&gt; Every time Kiro generated code, it followed these rules automatically. No more "please use DaisyUI" in every prompt.&lt;/p&gt;




&lt;h2&gt;
  
  
  Agent Hooks: Automation That Actually Helps
&lt;/h2&gt;

&lt;p&gt;I set up two hooks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. On File Save:&lt;/strong&gt; Auto-validate syntax&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;file_save&lt;/span&gt;
&lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;run_diagnostics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Spirit Consistency Check:&lt;/strong&gt; Verify voice consistency&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;manual&lt;/span&gt;
&lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check_spirit_prompts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Caught 12+ bugs before they reached production. The consistency check ensured all 10 literary spirits maintained their unique voices.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Problem Solving
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bug: Receipts Classified as "Joyful"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; "I uploaded a receipt and the timeline shows all joy. That's wrong."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiro:&lt;/strong&gt; Analyzed the emotion algorithm, identified the issue (tie-breaking logic preferred "joy"), and suggested adding a "neutral" emotion category.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix applied in 5 minutes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added neutral emotion with keywords (total, amount, price, receipt...)&lt;/li&gt;
&lt;li&gt;Updated tie-breaker to prefer neutral&lt;/li&gt;
&lt;li&gt;Regenerated timeline component&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Before Kiro:&lt;/strong&gt; Would have taken 30+ minutes to debug and fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;After 45 hours:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ 21/21 tasks completed (100%)&lt;/li&gt;
&lt;li&gt;✅ 69 unit tests passing&lt;/li&gt;
&lt;li&gt;✅ Zero critical bugs at deployment&lt;/li&gt;
&lt;li&gt;✅ WCAG 2.1 AA compliant&lt;/li&gt;
&lt;li&gt;✅ Custom domain with SSL&lt;/li&gt;
&lt;li&gt;✅ 9,200 lines of code&lt;/li&gt;
&lt;li&gt;✅ Production-ready on AWS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First Contentful Paint: &amp;lt; 1.5s&lt;/li&gt;
&lt;li&gt;Time to Interactive: &amp;lt; 3s&lt;/li&gt;
&lt;li&gt;Bundle size: 413 KB (gzipped)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Spec-Driven vs. Vibe Coding: Why Both?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Spec-driven development&lt;/strong&gt; gave me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear architecture and task breakdown&lt;/li&gt;
&lt;li&gt;Mathematical correctness properties&lt;/li&gt;
&lt;li&gt;Progress tracking and validation&lt;/li&gt;
&lt;li&gt;Context for every AI conversation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vibe coding&lt;/strong&gt; gave me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rapid iteration on UX polish&lt;/li&gt;
&lt;li&gt;Quick bug fixes with natural language&lt;/li&gt;
&lt;li&gt;Exploratory development for new features&lt;/li&gt;
&lt;li&gt;Flow state without context switching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The combination was powerful:&lt;/strong&gt; Structure for the foundation, flexibility for refinement.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  1. Specs Aren't Slow - They're Accelerators
&lt;/h3&gt;

&lt;p&gt;Writing specs felt like overhead at first. But having Kiro understand my entire project from day one saved hours of explaining context in every conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI Understands Constraints
&lt;/h3&gt;

&lt;p&gt;When I specified "emotion scores must sum to 1.0," Kiro didn't just acknowledge it - it implemented validation, error handling, and edge cases automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Steering Documents Scale
&lt;/h3&gt;

&lt;p&gt;Instead of repeating "use DaisyUI" in 50 prompts, I wrote it once in a steering doc. Kiro applied it everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Context Is Everything
&lt;/h3&gt;

&lt;p&gt;The difference between "create a timeline component" and having Kiro know my entire spec, tech stack, and design patterns? Night and day.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Unexpected Benefits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Accessibility by Default
&lt;/h3&gt;

&lt;p&gt;Because I specified WCAG 2.1 AA compliance in my requirements, Kiro added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ARIA labels to every interactive element&lt;/li&gt;
&lt;li&gt;Keyboard navigation with skip links&lt;/li&gt;
&lt;li&gt;Screen reader announcements&lt;/li&gt;
&lt;li&gt;Color contrast validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I didn't have to ask for these in every component.&lt;/strong&gt; They were part of the spec.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation That Writes Itself
&lt;/h3&gt;

&lt;p&gt;Kiro generated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comprehensive README&lt;/li&gt;
&lt;li&gt;API documentation&lt;/li&gt;
&lt;li&gt;Deployment guides&lt;/li&gt;
&lt;li&gt;Troubleshooting docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All consistent with my project's voice and structure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code Examples: Before and After
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before Kiro (Traditional Approach)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Me: Manually writing boilerplate&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;spirits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSpirits&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 50 more lines of state management...&lt;/span&gt;
&lt;span class="c1"&gt;// 100 lines of API calls...&lt;/span&gt;
&lt;span class="c1"&gt;// 200 lines of error handling...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With Kiro (Spec-Driven)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; "Implement the spirit selection with multi-select up to 5 spirits"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiro:&lt;/strong&gt; Generated complete component with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State management&lt;/li&gt;
&lt;li&gt;Validation (max 5 selections)&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Accessibility&lt;/li&gt;
&lt;li&gt;Loading states&lt;/li&gt;
&lt;li&gt;DaisyUI styling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; 2 hours → 5 minutes&lt;/p&gt;




&lt;h2&gt;
  
  
  The Deployment Story
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge: AWS Configuration Hell
&lt;/h3&gt;

&lt;p&gt;Anyone who's deployed to AWS knows the pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S3 bucket policies&lt;/li&gt;
&lt;li&gt;CloudFront distributions&lt;/li&gt;
&lt;li&gt;CORS configuration&lt;/li&gt;
&lt;li&gt;SSL certificates&lt;/li&gt;
&lt;li&gt;SPA routing&lt;/li&gt;
&lt;li&gt;Cache invalidation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution: One Conversation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; "Help me deploy to AWS with custom domain"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiro:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generated deployment script&lt;/li&gt;
&lt;li&gt;Configured S3 + CloudFront&lt;/li&gt;
&lt;li&gt;Set up Cognito for Bedrock access&lt;/li&gt;
&lt;li&gt;Added SSL certificate instructions&lt;/li&gt;
&lt;li&gt;Fixed SPA routing issues&lt;/li&gt;
&lt;li&gt;Created invalidation script&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Deployed on first try. No Stack Overflow. No trial and error.&lt;/p&gt;




&lt;h2&gt;
  
  
  Iterative Improvements
&lt;/h2&gt;

&lt;p&gt;Even after "completion," Kiro helped with polish:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 2 improvements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added home button for reset functionality&lt;/li&gt;
&lt;li&gt;Fixed responsive layout on mobile&lt;/li&gt;
&lt;li&gt;Added file info display (name + size)&lt;/li&gt;
&lt;li&gt;Created professional About page&lt;/li&gt;
&lt;li&gt;Generated favicon and thumbnail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Each improvement:&lt;/strong&gt; 5-10 minutes instead of 30-60 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The MCP Advantage
&lt;/h2&gt;

&lt;p&gt;I used the DaisyUI MCP server to search component docs without leaving Kiro:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; "How do I use DaisyUI's modal component?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiro:&lt;/strong&gt; Searched DaisyUI docs, showed examples, and generated the code with proper theming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Zero context switching. No browser tabs. No copy-paste from docs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons for Your Next Project
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Start with Specs
&lt;/h3&gt;

&lt;p&gt;Even if you're not using Kiro, writing specs first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clarifies your thinking&lt;/li&gt;
&lt;li&gt;Prevents scope creep&lt;/li&gt;
&lt;li&gt;Creates a roadmap&lt;/li&gt;
&lt;li&gt;Enables better AI assistance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Use Steering Documents
&lt;/h3&gt;

&lt;p&gt;Create project-wide rules once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code style preferences&lt;/li&gt;
&lt;li&gt;Architecture patterns&lt;/li&gt;
&lt;li&gt;Naming conventions&lt;/li&gt;
&lt;li&gt;Tech stack choices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Embrace Vibe Coding
&lt;/h3&gt;

&lt;p&gt;After specs are done, use natural language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Add a loading spinner"&lt;/li&gt;
&lt;li&gt;"Fix the mobile layout"&lt;/li&gt;
&lt;li&gt;"Make this more accessible"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Let AI Handle Boilerplate
&lt;/h3&gt;

&lt;p&gt;Don't write:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State management boilerplate&lt;/li&gt;
&lt;li&gt;API error handling&lt;/li&gt;
&lt;li&gt;Form validation&lt;/li&gt;
&lt;li&gt;Accessibility attributes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let AI generate it from your specs.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Traditional approach:&lt;/strong&gt; 80+ hours, multiple bugs, incomplete features&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With Kiro:&lt;/strong&gt; 45 hours, 100% completion, zero critical bugs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference?&lt;/strong&gt; Kiro understood my entire project from specs, maintained context across conversations, and generated code that followed my patterns automatically.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;The Haunted Reader:&lt;/strong&gt; &lt;a href="https://www.hauntedreader.com" rel="noopener noreferrer"&gt;https://www.hauntedreader.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/lvnhmd/haunted-reader" rel="noopener noreferrer"&gt;https://github.com/lvnhmd/haunted-reader&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React + Vite&lt;/li&gt;
&lt;li&gt;Tailwind CSS + DaisyUI&lt;/li&gt;
&lt;li&gt;Amazon Bedrock (Claude 3)&lt;/li&gt;
&lt;li&gt;AWS (S3, CloudFront, Cognito)&lt;/li&gt;
&lt;li&gt;Built entirely with Kiro&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Kiro didn't just help me code faster - it changed how I approach development. The combination of spec-driven structure and vibe coding flexibility created a workflow I didn't know was possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before Kiro:&lt;/strong&gt; "I need to build X, Y, and Z. Better start coding."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After Kiro:&lt;/strong&gt; "Let me spec this out, then have a conversation about implementation."&lt;/p&gt;

&lt;p&gt;The second approach is faster, cleaner, and more maintainable.&lt;/p&gt;

&lt;p&gt;If you're building anything complex, try the spec-driven approach. Write your requirements, design, and tasks first. Then let Kiro help you build it.&lt;/p&gt;

&lt;p&gt;You might be surprised how much faster you move when AI understands your entire project, not just the current prompt.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 A Note About This Article
&lt;/h2&gt;

&lt;p&gt;Fun fact: This entire blog post was written by Kiro! I gave it the context about my project and asked it to write an engaging article about the development experience. The irony isn't lost on me - I'm using AI to write about using AI to build an AI-powered app. &lt;/p&gt;

&lt;p&gt;It's a perfect example of what I've been talking about: give Kiro the right context (my project specs, code, and experiences), and it generates exactly what you need. Even this meta-commentary was Kiro's idea! 😄&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Built with 💜 for Kiroween 2025&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have questions about The Haunted Reader or using Kiro for your projects? Drop a comment below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kiro</category>
      <category>ai</category>
      <category>webdev</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
