<?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: Michael Cuypers</title>
    <description>The latest articles on DEV Community by Michael Cuypers (@michael_cuypers_b278ea39b).</description>
    <link>https://dev.to/michael_cuypers_b278ea39b</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%2F3613713%2Fcd1f0f36-5504-4341-8c4e-9b6b92317994.png</url>
      <title>DEV Community: Michael Cuypers</title>
      <link>https://dev.to/michael_cuypers_b278ea39b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/michael_cuypers_b278ea39b"/>
    <language>en</language>
    <item>
      <title>Building Cursed Code Reviewer (with Kiro)</title>
      <dc:creator>Michael Cuypers</dc:creator>
      <pubDate>Sun, 16 Nov 2025 18:29:16 +0000</pubDate>
      <link>https://dev.to/michael_cuypers_b278ea39b/building-cursed-code-reviewer-with-kiro-fh6</link>
      <guid>https://dev.to/michael_cuypers_b278ea39b/building-cursed-code-reviewer-with-kiro-fh6</guid>
      <description>&lt;p&gt;Ever get that feeling when you submit a pull request at 3 AM and your senior dev's review comes back... a little too harsh? Well, I decided to lean into that nightmare and build something gloriously cursed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if your code reviewer was literally haunted?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meet Cursed Code Reviewer — an AI-powered code review system that analyzes your code with the personality of a demonic senior developer who's been cursing bad code for centuries. Think GitHub's code review meets The Exorcist, with a splash of AWS serverless 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.amazonaws.com%2Fuploads%2Farticles%2F73ldxo0zrn2zs1f71xim.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%2F73ldxo0zrn2zs1f71xim.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Haunting Begins 🎃
&lt;/h2&gt;

&lt;p&gt;The concept was simple but deliciously dark: build a full-stack application that scans your code for issues and delivers feedback in the voice of a cursed, Halloween-themed senior developer. But here's where it gets interesting — I didn't just want to build it. I wanted to build it &lt;em&gt;fast&lt;/em&gt;, with precision, and using AI to help me architect the entire thing.&lt;/p&gt;

&lt;p&gt;That's where &lt;strong&gt;Kiro&lt;/strong&gt; came in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Arsenal: Specs, Steering, Hooks, and MCP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Specs: The Blueprint from the Crypt
&lt;/h3&gt;

&lt;p&gt;Instead of explaining my vision over and over, I created three spec documents in &lt;code&gt;.kiro/specs/cursed-code-reviewer/&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;requirements.md&lt;/strong&gt; — Seven detailed user stories with 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;&lt;span class="gu"&gt;### Requirement 2&lt;/span&gt;
&lt;span class="gs"&gt;**User Story:**&lt;/span&gt; As a developer, I want to receive code feedback in a
demonic, Halloween-themed voice, so that code review is entertaining
and memorable

&lt;span class="gu"&gt;#### Acceptance Criteria&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; THE Cursed Code Reviewer SHALL deliver all feedback using dark
   humor and Halloween-themed language
&lt;span class="p"&gt;2.&lt;/span&gt; WHEN describing code issues, THE Cursed Code Reviewer SHALL use
   demonic senior developer persona with phrases referencing curses,
   spirits, and haunted themes
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;design.md&lt;/strong&gt; — Complete architecture with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mermaid diagrams showing data flow&lt;/li&gt;
&lt;li&gt;TypeScript interfaces for every component&lt;/li&gt;
&lt;li&gt;DynamoDB schema with GSIs&lt;/li&gt;
&lt;li&gt;Error handling strategies&lt;/li&gt;
&lt;li&gt;Halloween theme design system (color palette: &lt;code&gt;--cursed-black&lt;/code&gt;, &lt;code&gt;--phantom-purple&lt;/code&gt;, &lt;code&gt;--blood-red&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;tasks.md&lt;/strong&gt; — A 322-line implementation plan with 14 major tasks, each broken into subtasks with requirement traceability:&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="p"&gt;-&lt;/span&gt; [x] 5. Build DemonicOracle Lambda with Bedrock integration
&lt;span class="p"&gt;-&lt;/span&gt; [x] 5.1 Implement Bedrock client and prompt engineering
&lt;span class="p"&gt;  -&lt;/span&gt; Set up AWS Bedrock SDK client
&lt;span class="p"&gt;  -&lt;/span&gt; Create prompt templates for demonic feedback generation
&lt;span class="p"&gt;  -&lt;/span&gt; Implement personality selection based on severity
&lt;span class="p"&gt;  -&lt;/span&gt; Requirements: 2.1, 2.2, 2.3, 2.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I asked Kiro to build a feature, it referenced these specs automatically. No context lost. No repeated explanations. Just pure, spec-driven development.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Steering: Teaching AI to Think Like You
&lt;/h3&gt;

&lt;p&gt;Steering documents are where the magic happens. These live in &lt;code&gt;.kiro/steering/&lt;/code&gt; and fundamentally shape &lt;em&gt;how&lt;/em&gt; the AI thinks about your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;product.md&lt;/strong&gt; — Defined the product vision:&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;## Core Features&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Code Scanning**&lt;/span&gt;: Analyzes code for security, performance, and quality
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**AI Feedback**&lt;/span&gt;: Generates demonic-themed code review comments using
  AWS Bedrock (Claude)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Auto-Fix**&lt;/span&gt;: Generates patches to fix identified issues

&lt;span class="gu"&gt;## Key Terminology&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**SoulPool**&lt;/span&gt;: Cognito user pool (authentication)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**TombstoneDB**&lt;/span&gt;: DynamoDB table (data storage)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**SpectralAnalyzer**&lt;/span&gt;: Code scanning Lambda
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**DemonicOracle**&lt;/span&gt;: AI feedback Lambda using Bedrock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;tech.md&lt;/strong&gt; — Locked in the tech stack and patterns:&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;## Architecture&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Frontend**&lt;/span&gt;: React 18 + TypeScript + Vite + TailwindCSS
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Backend**&lt;/span&gt;: AWS Lambda + TypeScript (Node.js 20)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**AI**&lt;/span&gt;: AWS Bedrock (Claude 3 Sonnet)

&lt;span class="gu"&gt;## TypeScript Configuration&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Backend: ES2022, CommonJS (for Lambda)
&lt;span class="p"&gt;-&lt;/span&gt; Path alias: &lt;span class="sb"&gt;`@/*`&lt;/span&gt; maps to &lt;span class="sb"&gt;`./src/*`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;structure.md&lt;/strong&gt; — Enforced code organization rules:&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;### Naming Conventions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Components: PascalCase (e.g., &lt;span class="sb"&gt;`SoulVault.tsx`&lt;/span&gt;)
&lt;span class="p"&gt;-&lt;/span&gt; Lambda handlers: camelCase with &lt;span class="sb"&gt;`Handler`&lt;/span&gt; suffix
&lt;span class="p"&gt;-&lt;/span&gt; AWS Resources: Use demonic/spooky names consistently
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These steering docs meant that every time Kiro generated code, it &lt;em&gt;automatically&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Used the haunted naming conventions (&lt;code&gt;TombstoneDB&lt;/code&gt;, &lt;code&gt;SpectralAnalyzer&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Structured Lambda functions correctly for deployment&lt;/li&gt;
&lt;li&gt;Applied TypeScript path aliases consistently&lt;/li&gt;
&lt;li&gt;Followed the monorepo workspace pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Hooks: Automation from Beyond
&lt;/h3&gt;

&lt;p&gt;Hooks are event-driven automations. I created &lt;code&gt;.kiro/hooks/source-to-docs-sync.kiro.hook&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fileEdited"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"patterns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"**/*.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"**/*.tsx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"**/package.json"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"then"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"askAgent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Source code files have been modified. Please review
    the changes and update the relevant documentation files to
    reflect these changes..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does&lt;/strong&gt;: Every time I edited a TypeScript file, Kiro automatically checked if documentation needed updates and fixed it. My README, AUTHENTICATION.md, and DEPLOYMENT.md stayed in perfect sync with the codebase—no manual work.&lt;/p&gt;

&lt;p&gt;That 2 AM bug fix that changed the authentication flow? Documentation updated automatically. Lambda signature change? API docs refreshed. It's like having a technical writer haunting your repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. MCP
&lt;/h3&gt;

&lt;p&gt;Model Context Protocol (MCP) is Anthropic's standard for giving AI models access to external tools and data. For this project, I used the &lt;strong&gt;AWS Knowledge MCP server&lt;/strong&gt; from AWS Labs. a game-changer when building serverless applications.&lt;/p&gt;

&lt;p&gt;Here's what it gave me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-time AWS Documentation Access:&lt;/strong&gt;&lt;br&gt;
Instead of tab-switching between my editor and AWS docs or the AI giving me outdated AWS implementation code, the AI could query:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latest Bedrock API documentation&lt;/li&gt;
&lt;li&gt;DynamoDB best practices and patterns&lt;/li&gt;
&lt;li&gt;Lambda runtime specifications for Node.js 20&lt;/li&gt;
&lt;li&gt;CloudFormation resource availability by region&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;Here's what we built:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│  Crypt Dashboard (React + TailwindCSS + TypeScript)        │
│  - SpectralScanner: Submit code/PRs for review             │
│  - CursedFeedback: Display demonic code review comments    │
│  - PatchGraveyard: View and apply AI-generated fixes       │
│  - SoulVault: Halloween-themed auth UI                     │
└────────────────┬────────────────────────────────────────────┘
                 │
                 │ REST API (JWT Auth)
                 ▼
┌─────────────────────────────────────────────────────────────┐
│  NightmareGateway (API Gateway) + AWS Cognito SoulPool     │
└────────────────┬────────────────────────────────────────────┘
                 │
                 │ Lambda Invocations
                 ▼
┌─────────────────────────────────────────────────────────────┐
│  AWS Lambda Functions (Node.js 20 + TypeScript)            │
│  ┌──────────────────────────────────────────────────────┐  │
│  │ SpectralAnalyzer: Scans code, detects language,     │  │
│  │   fetches PRs from GitHub, stores in S3             │  │
│  ├──────────────────────────────────────────────────────┤  │
│  │ DemonicOracle: Calls AWS Bedrock (Claude) to        │  │
│  │   generate cursed feedback and code explanations    │  │
│  ├──────────────────────────────────────────────────────┤  │
│  │ HauntedPatchForge: Generates and validates code     │  │
│  │   fixes using AI, stores patches in DynamoDB        │  │
│  ├──────────────────────────────────────────────────────┤  │
│  │ CryptKeeper: Handles user context and preferences   │  │
│  └──────────────────────────────────────────────────────┘  │
└────────────────┬───────────────┬────────────────────────────┘
                 │               │
                 │               └──────┐
                 ▼                      ▼
┌─────────────────────────┐  ┌──────────────────────────────┐
│  TombstoneDB (DynamoDB) │  │  AWS Bedrock (Claude Sonnet) │
│  - User preferences     │  │  - Demonic feedback gen      │
│  - Scan history         │  │  - Code fix suggestions      │
│  - Cursed issues        │  │  - Personality variations    │
│  - Haunted patches      │  │                              │
└─────────────────────────┘  └──────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Results: Demonic Feedback in Production
&lt;/h2&gt;

&lt;p&gt;The final product delivers exactly what I envisioned:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code submission:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: *uploads messy JavaScript*

SpectralAnalyzer: "Spectral scan complete.
Curse level: CRITICAL. 13 issues detected."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AI-generated feedback:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DemonicOracle: "Your variables are named like a drunk warlock
cast a confusion spell! 'x', 'tmp', 'foo'?! The spirits of
clean code are weeping in their graves.

Technical issue: Non-descriptive variable names reduce code
maintainability. Consider: userAccount, temporaryBuffer,
configurationHandler."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Takeaways: What I Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Specs Are Your Source of Truth
&lt;/h3&gt;

&lt;p&gt;Writing detailed requirements, design docs, and task breakdowns upfront felt like extra work. But it paid off &lt;strong&gt;exponentially&lt;/strong&gt; when working with AI. Instead of re-explaining context in every conversation, the AI just... &lt;em&gt;knew&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Steering Documents Shape AI Behavior
&lt;/h3&gt;

&lt;p&gt;These aren't just docs—they're instructions for how the AI should think about your project. Product vision, tech patterns, code organization—steering docs turn generic AI into &lt;em&gt;your team's&lt;/em&gt; AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hooks Enable True Automation
&lt;/h3&gt;

&lt;p&gt;Documentation sync, test running, deployment checks—hooks let you build workflows that happen automatically. It's like CI/CD for your development process.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. MCP Gives AI Superpowers
&lt;/h3&gt;

&lt;p&gt;With the AWS documentation MCP server connected, Kiro always provided me with the latest implementations and platform versions and just knew how things are done with AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 'What'? The 'How'?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What did I build?&lt;/strong&gt; A full-stack, serverless code review system with AI-generated demonic feedback, auto-fix suggestions, and a Halloween-themed UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How did I build it?&lt;/strong&gt; By using Kiro's spec-driven development approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Specs&lt;/strong&gt; defined requirements, design, and tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steering&lt;/strong&gt; shaped AI behavior and enforced patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; automated documentation and workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; provided the latest AWS implementation knowledge to Kiro&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Could I have built this without Kiro?&lt;/strong&gt; Absolutely. Would it have taken 3-4x longer? Also absolutely.&lt;/p&gt;

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

&lt;p&gt;Building Cursed Code Reviewer taught me that the future of AI-assisted development isn't just about better models. It's about better &lt;strong&gt;structure&lt;/strong&gt;. Specs, steering, hooks, and MCP transform an agentic coding tool into a legitimate development partner.&lt;/p&gt;

</description>
      <category>kiro</category>
      <category>kiroween</category>
      <category>ai</category>
      <category>kirodotdev</category>
    </item>
  </channel>
</rss>
