<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Exyness</title>
    <description>The latest articles on Forem by Exyness (@exyness).</description>
    <link>https://forem.com/exyness</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%2F3644152%2Fa494aaa3-d549-46f8-882e-6fe917a9d152.png</url>
      <title>Forem: Exyness</title>
      <link>https://forem.com/exyness</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/exyness"/>
    <language>en</language>
    <item>
      <title>Building Integral: Full-Stack Productivity Suite with RAG &amp; AI Assistant</title>
      <dc:creator>Exyness</dc:creator>
      <pubDate>Thu, 04 Dec 2025 18:31:37 +0000</pubDate>
      <link>https://forem.com/exyness/building-integral-a-full-stack-productivity-suite-with-ai-assisted-development-1een</link>
      <guid>https://forem.com/exyness/building-integral-a-full-stack-productivity-suite-with-ai-assisted-development-1een</guid>
      <description>&lt;h2&gt;
  
  
  Building Integral: How I Shipped a Full-Stack Productivity Suite in Weeks with AI-Assisted Development
&lt;/h2&gt;

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

&lt;p&gt;I just shipped Integral - a complete productivity platform with task management, budgeting, journaling, time tracking, and an AI assistant. The twist? I built it using Kiro, an AI-powered IDE that fundamentally changed how I approach development.&lt;/p&gt;

&lt;p&gt;This isn't a "look what AI can do" post. It's an honest breakdown of what worked, what didn't, and the specific techniques that made the difference.&lt;/p&gt;

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

&lt;p&gt;Integral is an all-in-one productivity suite with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tasks&lt;/strong&gt; with Kanban boards, calendar views, and "zombie task resurrection"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notes&lt;/strong&gt; with a Lexical rich text editor and folder organisation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget&lt;/strong&gt; with multi-currency tracking and analytics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Journal&lt;/strong&gt; with mood tracking and daily reflections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pomodoro&lt;/strong&gt; timer with session history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Tracking&lt;/strong&gt; with activity logging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accounts&lt;/strong&gt; for secure credential storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Chat Assistant&lt;/strong&gt; with 12 command shortcuts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus a Halloween theme mode because why not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ldixypbqhj6ajsy97rv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ldixypbqhj6ajsy97rv.png" alt="Halloween themed Tasks" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Numbers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;~70%&lt;/strong&gt; of initial code generated by Kiro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~20%&lt;/strong&gt; custom logic I wrote&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~10%&lt;/strong&gt; iterative refinement together&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14 comprehensive specs&lt;/strong&gt; with 200+ implementation tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3,774 modules&lt;/strong&gt; transformed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total bundle:&lt;/strong&gt; 2.2MB raw / 635KB gzipped (main bundle)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Largest chunks:&lt;/strong&gt; Finances (321KB), Landing (150KB), React vendor (167KB)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;Frontend: React 19.2 + TypeScript 5.9, Vite 7.2, Tailwind CSS 4.1, Framer Motion 12.23, TanStack Query v5 + React Context, Lexical 0.38&lt;/p&gt;

&lt;p&gt;Backend: Supabase (PostgreSQL), Supabase Auth with RLS, Supabase Subscriptions&lt;/p&gt;

&lt;p&gt;Quality: Biome 2.3.5 (replaces ESLint + Prettier), Zod 4 + React Hook Form 7.66&lt;/p&gt;

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

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

&lt;p&gt;Here's what changed everything. Instead of repeating myself in every conversation, I created three "steering docs" that Kiro always reads:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;.kiro/steering/structure.md&lt;/code&gt;&lt;/strong&gt; - The game changer:&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;## State Management&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; TanStack Query for server state (queries, mutations, caching)
&lt;span class="p"&gt;-&lt;/span&gt; React Context for global UI state (theme, auth, currency, network)
&lt;span class="p"&gt;-&lt;/span&gt; Local state with &lt;span class="sb"&gt;`useState`&lt;/span&gt; for component-specific state
&lt;span class="p"&gt;-&lt;/span&gt; Query keys follow pattern: &lt;span class="sb"&gt;`[entity, userId]`&lt;/span&gt; (e.g., &lt;span class="sb"&gt;`["tasks", user?.id]`&lt;/span&gt;)

&lt;span class="gu"&gt;## Styling&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Tailwind CSS utility classes
&lt;span class="p"&gt;-&lt;/span&gt; Glass morphism design system via &lt;span class="sb"&gt;`GlassCard`&lt;/span&gt; component
&lt;span class="p"&gt;-&lt;/span&gt; Dark/light theme support via &lt;span class="sb"&gt;`ThemeContext`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Halloween mode with teal accent color (#60c9b6)
&lt;span class="p"&gt;-&lt;/span&gt; Responsive design with mobile-first approach

&lt;span class="gu"&gt;## Halloween Theme&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Check &lt;span class="sb"&gt;`isHalloweenMode`&lt;/span&gt; from &lt;span class="sb"&gt;`useTheme()`&lt;/span&gt; hook
&lt;span class="p"&gt;-&lt;/span&gt; Apply teal color (#60c9b6) for accents
&lt;span class="p"&gt;-&lt;/span&gt; Use Creepster font for titles
&lt;span class="p"&gt;-&lt;/span&gt; Add drop shadow glows for spooky effects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this worked:&lt;/strong&gt; Every new component Kiro generated automatically followed these patterns. No more "remember to use TanStack Query" or "don't forget the Halloween theme." It just knew.&lt;/p&gt;

&lt;p&gt;The Halloween theme support was particularly impressive - Kiro consistently added theme-aware styling to every component because the steering doc made it standard practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show Me The Code: GlassCard Component
&lt;/h2&gt;

&lt;p&gt;Here's the &lt;code&gt;GlassCard&lt;/code&gt; component that powers the entire UI. Kiro generated the initial version, I refined the variants:&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;GlassCardProps&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HTMLAttributes&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLDivElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;secondary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tertiary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;GlassCard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;GlassCardProps&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;hover&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isHalloweenMode&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTheme&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;darkVariants&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-[rgba(25,25,30,0.85)] backdrop-blur-[20px] border-[rgba(255,255,255,0.15)]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-[rgba(35,35,40,0.75)] backdrop-blur-lg border-[rgba(255,255,255,0.12)]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;tertiary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-[rgba(45,45,50,0.65)] backdrop-blur-md border-[rgba(255,255,255,0.1)]&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;halloweenClasses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;isHalloweenMode&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;border-[rgba(96,201,182,0.2)] shadow-[0_0_20px_rgba(96,201,182,0.15)]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`rounded-lg border transition-all &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;darkVariants&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;halloweenClasses&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="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This component is used &lt;strong&gt;everywhere&lt;/strong&gt; - every card, modal, and panel. Consistent glass morphism across 8 major features with zero duplication.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The AI Chat Widget: 63 Tasks, 17 Phases
&lt;/h2&gt;

&lt;p&gt;The most complex feature was the AI chat assistant. Here's where spec-driven development saved me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; Build a conversational AI that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parse 12 different command types&lt;/li&gt;
&lt;li&gt;Handle multi-step flows (e.g., collecting password without sending it to AI)&lt;/li&gt;
&lt;li&gt;Coordinate with other widgets (timer repositions when chat opens)&lt;/li&gt;
&lt;li&gt;Support natural language AND command shortcuts&lt;/li&gt;
&lt;li&gt;Work across all themes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; A comprehensive spec with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;requirements.md&lt;/code&gt;: 18 user stories with acceptance criteria&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;design.md&lt;/code&gt;: Architecture diagrams, data models, correctness properties&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks.md&lt;/code&gt;: 63 implementation tasks across 17 phases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sample from the spec:&lt;/strong&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;### Phase 6: Pending Action System for Multi-Step Flows&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; [x] 15. Create PendingAction interface and state
&lt;span class="p"&gt;-&lt;/span&gt; [x] 16. Implement context-specific prompts
&lt;span class="p"&gt;-&lt;/span&gt; [x] 17. Implement field collection flow
&lt;span class="p"&gt;  -&lt;/span&gt; Check if user response fills missing field
&lt;span class="p"&gt;  -&lt;/span&gt; Update pendingAction.params with user input
&lt;span class="p"&gt;  -&lt;/span&gt; Remove filled field from missingFields array
&lt;span class="p"&gt;  -&lt;/span&gt; Prompt for next missing field if any remain
&lt;span class="p"&gt;  -&lt;/span&gt; Execute action when all fields collected
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without this structure, I would've lost track of requirements. The spec kept both me and Kiro aligned.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The AI Assistant Hook: Type-Safe Intent Detection
&lt;/h2&gt;

&lt;p&gt;Here's how the AI chat actually works under the hood:&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AIIntent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create_task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create_note&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create_journal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create_transaction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create_budget&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create_goal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transfer_funds&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create_account&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;general_chat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AIResponse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AIIntent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;confirmationMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useAIAssistant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;processQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AIResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Analyze this user query and extract intent and parameters:
    "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"

    Available intents: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;AIIntent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
    Return JSON with: { intent, params, confirmationMessage }`&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&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;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&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="nx"&gt;processQuery&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 Kiro did well:&lt;/strong&gt; Generated the type definitions and basic structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I had to fix:&lt;/strong&gt; The prompt engineering. Initial version was too generic and misclassified intents. I added specific examples and constraints to improve accuracy.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  What Didn't Work: The Honest Truth
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Agent Hooks Became Less Useful Over Time
&lt;/h3&gt;

&lt;p&gt;I configured 8 automated hooks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lint-fix-on-save&lt;/code&gt; ✅ (consistently useful)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-size-check&lt;/code&gt; ✅ (helpful for monitoring)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;accessibility-review&lt;/code&gt; ⚠️ (too generic)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;component-test-reminder&lt;/code&gt; ❌ (annoying)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;halloween-testing-checklist&lt;/code&gt; ❌ (too specific)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; As the codebase grew, I needed context-aware assistance, not automated reminders. Direct conversations with Kiro were more valuable than hooks firing on every save.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Kiro Struggled with Complex State Logic
&lt;/h3&gt;

&lt;p&gt;The fund transfer feature required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Normalized account name matching&lt;/li&gt;
&lt;li&gt;Balance validation&lt;/li&gt;
&lt;li&gt;Atomic updates to two accounts&lt;/li&gt;
&lt;li&gt;Transaction record creation&lt;/li&gt;
&lt;li&gt;Query cache invalidation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kiro generated a working first pass, but I had to refactor the error handling and add proper rollback logic. AI is great at structure, less great at edge cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Initial Specs Were Too Detailed
&lt;/h3&gt;

&lt;p&gt;My first spec had 200+ acceptance criteria. It was overwhelming. I learned to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with high-level requirements&lt;/li&gt;
&lt;li&gt;Add details as I implement&lt;/li&gt;
&lt;li&gt;Use "correctness properties" instead of exhaustive test cases&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  Spec-Driven vs Vibe Coding: When to Use Each
&lt;/h2&gt;

&lt;p&gt;I used two approaches throughout the project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spec-Driven Development&lt;/strong&gt; (for complex features):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication system&lt;/li&gt;
&lt;li&gt;AI chat widget (63 tasks)&lt;/li&gt;
&lt;li&gt;Budget tracking with multi-currency&lt;/li&gt;
&lt;li&gt;Rich text editor integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vibe Coding&lt;/strong&gt; (for everything else):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI polish and animations&lt;/li&gt;
&lt;li&gt;Bug fixes&lt;/li&gt;
&lt;li&gt;Styling tweaks&lt;/li&gt;
&lt;li&gt;Refactoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Rule:&lt;/strong&gt; If a feature has more than 3 components or requires coordination between systems, write a spec. Otherwise, just talk to Kiro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bundle Optimization:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manual chunk splitting (react-vendor, router-vendor, ui-vendor, supabase-vendor)&lt;/li&gt;
&lt;li&gt;Lazy loading for all routes (Tasks, Notes, Budget, etc. load on demand)&lt;/li&gt;
&lt;li&gt;Virtualized lists for large datasets (react-virtuoso) &amp;amp; Tanstack Virtual&lt;/li&gt;
&lt;li&gt;Optimistic updates for instant UI feedback&lt;/li&gt;
&lt;li&gt;Code splitting reduced initial load to ~635KB gzipped&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  Unique Features Worth Stealing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Zombie Task Resurrection
&lt;/h3&gt;

&lt;p&gt;Tasks overdue by 7+ days become "zombie tasks." Click the resurrection button to break them into smaller subtasks:&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;zombieTasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;daysOverdue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;differenceInDays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;due_date&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;daysOverdue&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Context-Aware AI Placeholders
&lt;/h3&gt;

&lt;p&gt;The AI chat input changes based on your current page:&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;getPlaceholder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&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;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/tasks&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@task Add project deadline...&lt;/span&gt;&lt;span class="dl"&gt;"&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;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/notes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@note Save this idea...&lt;/span&gt;&lt;span class="dl"&gt;"&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;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/budget&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@transaction Spent $50 on...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Type @ for commands or ask anything...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Multi-Currency Budget Tracking
&lt;/h3&gt;

&lt;p&gt;Supports multiple currencies with real-time conversion:&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Transaction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// USD, EUR, GBP, etc.&lt;/span&gt;
  &lt;span class="nl"&gt;converted_amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Always in user's base currency&lt;/span&gt;
  &lt;span class="nl"&gt;exchange_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Development Timeline
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;October 30 - December 3, 2024&lt;/strong&gt; (~5 weeks)&lt;/p&gt;

&lt;p&gt;Built for the Kiro hackathon, here's how it went down:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1 (Oct 30 - Nov 5):&lt;/strong&gt; Project setup, authentication, and Tasks page (spec-driven)&lt;br&gt;
&lt;strong&gt;Week 2 (Nov 6-12):&lt;/strong&gt; Notes with Lexical editor + Budget tracking (spec-driven)&lt;br&gt;
&lt;strong&gt;Week 3 (Nov 13-19):&lt;/strong&gt; Journal, Pomodoro, Time Tracking (mix of spec + vibe)&lt;br&gt;
&lt;strong&gt;Week 4 (Nov 20-26):&lt;/strong&gt; AI Chat Widget with 12 commands (spec-driven, 63 tasks)&lt;br&gt;
&lt;strong&gt;Week 5 (Nov 27 - Dec 3):&lt;/strong&gt; Dashboard, Halloween theme, polish, and deployment&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Steering docs are 10x multipliers.&lt;/strong&gt; Write them once, benefit forever.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Specs prevent scope creep.&lt;/strong&gt; Complex features need structure. The AI chat widget would've been impossible without 63 documented tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI struggles with edge cases.&lt;/strong&gt; Great at structure, needs human oversight for error handling and validation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context is everything.&lt;/strong&gt; Using &lt;code&gt;@&lt;/code&gt; mentions to reference existing files maintained consistency across 14 specs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Iterate on what works.&lt;/strong&gt; Hooks were useful early on but became less relevant. Adapt your workflow as the project evolves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Show, don't tell.&lt;/strong&gt; Code snippets &amp;gt; process descriptions. Developers want to copy-paste patterns.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://integral-beta.scntix.com/" rel="noopener noreferrer"&gt;Integral Beta&lt;/a&gt; &lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/exyness/integral" rel="noopener noreferrer"&gt;Repository Link&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Demo Account:&lt;/strong&gt; &lt;code&gt;demo@integral.com&lt;/code&gt; / &lt;code&gt;integral&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;I'm working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile apps (React Native with shared business logic)&lt;/li&gt;
&lt;li&gt;Offline-first sync with conflict resolution&lt;/li&gt;
&lt;li&gt;Team collaboration features&lt;/li&gt;
&lt;li&gt;AI-powered insights and recommendations&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Kiro generated ~70% of the code.&lt;/strong&gt; But the real value wasn't code generation - it was maintaining consistency across 14 specs, 8 features, and 3 themes without me having to repeat myself.&lt;/p&gt;

&lt;p&gt;The future of development isn't human vs AI. It's human + AI, each doing what they do best:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; Structure, patterns, boilerplate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human:&lt;/strong&gt; Edge cases, UX decisions, architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building something complex, try this workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write steering docs for your patterns&lt;/li&gt;
&lt;li&gt;Use specs for multi-component features&lt;/li&gt;
&lt;li&gt;Vibe code for everything else&lt;/li&gt;
&lt;li&gt;Iterate based on what works&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The results might surprise you.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Built with:&lt;/strong&gt; React 19, TypeScript, Supabase, Kiro, and way too much coffee ☕&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions?&lt;/strong&gt; Drop them in the comments. I'll share more code snippets and specific techniques.&lt;/p&gt;

</description>
      <category>kiro</category>
      <category>typescript</category>
      <category>ai</category>
      <category>react</category>
    </item>
  </channel>
</rss>
