<?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: Ketan Saraf</title>
    <description>The latest articles on DEV Community by Ketan Saraf (@keshraf).</description>
    <link>https://dev.to/keshraf</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%2F969358%2F1e9ed0cb-ac35-4827-9e9c-988d0fa92ff5.png</url>
      <title>DEV Community: Ketan Saraf</title>
      <link>https://dev.to/keshraf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/keshraf"/>
    <language>en</language>
    <item>
      <title>I Built a Infinite Variation Knowledge Base That AI Can Query — Here's How Kiro Made It Possible 🎃</title>
      <dc:creator>Ketan Saraf</dc:creator>
      <pubDate>Fri, 05 Dec 2025 18:21:22 +0000</pubDate>
      <link>https://dev.to/keshraf/i-built-a-infinite-variation-knowledge-base-that-ai-can-query-heres-how-kiro-made-it-possible-32d2</link>
      <guid>https://dev.to/keshraf/i-built-a-infinite-variation-knowledge-base-that-ai-can-query-heres-how-kiro-made-it-possible-32d2</guid>
      <description>&lt;p&gt;&lt;em&gt;How I used specs, hooks, steering, and MCP integrations to build NEXUS in a weekend&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Ever clicked a link in your notes app and immediately forgot what you were looking at before? Yeah, me too. That frustration led me to build &lt;strong&gt;NEXUS&lt;/strong&gt; — a knowledge base template where clicking a link opens a new pane &lt;em&gt;beside&lt;/em&gt; your current one, not &lt;em&gt;instead of&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;But here's the twist: I built it for the &lt;strong&gt;Kiroween Hackathon&lt;/strong&gt;, and Kiro's AI-powered IDE features turned what would've been a month-long project into a weekend sprint.&lt;/p&gt;

&lt;p&gt;Let me show you how.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Knowledge Tools Are Broken
&lt;/h2&gt;

&lt;p&gt;I've tried them all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Obsidian&lt;/strong&gt; — Great linking, but click a link and &lt;em&gt;poof&lt;/em&gt;, your context vanishes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitBook&lt;/strong&gt; — Perfect for linear docs, but no way to explore connections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion&lt;/strong&gt; — Jack of all trades, master of none&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Andy Matuschak's Notes&lt;/strong&gt; — &lt;em&gt;Chef's kiss&lt;/em&gt; for stacking panes, but not open source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted something that combined:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Horizontal stacking&lt;/strong&gt; — Click a link, new pane opens right, old one stays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linear navigation&lt;/strong&gt; — Prev/Next for documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph view&lt;/strong&gt; — See how everything connects&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And I wanted it to be &lt;strong&gt;AI-native&lt;/strong&gt; — meaning Claude or any AI assistant could query my knowledge base directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter NEXUS: Three Ways to Explore
&lt;/h2&gt;

&lt;p&gt;NEXUS is a skeleton template. One codebase, infinite possibilities.&lt;/p&gt;

&lt;p&gt;To prove it, I built two completely different apps:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Vibe&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Arcana&lt;/strong&gt; 🔮&lt;/td&gt;
&lt;td&gt;Dark, mystical&lt;/td&gt;
&lt;td&gt;Personal knowledge vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Codex&lt;/strong&gt; 📖&lt;/td&gt;
&lt;td&gt;Light, professional&lt;/td&gt;
&lt;td&gt;API documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same code. Different YAML config. Completely different experiences.&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="c1"&gt;# Arcana config&lt;/span&gt;
&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;personal"&lt;/span&gt;
&lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;preset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dark"&lt;/span&gt;
  &lt;span class="na"&gt;colors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#9333ea"&lt;/span&gt;
&lt;span class="na"&gt;features&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;local_graph&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;linear_nav&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="c1"&gt;# Codex config&lt;/span&gt;
&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;documentation"&lt;/span&gt;
&lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;preset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;light"&lt;/span&gt;
  &lt;span class="na"&gt;colors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#2563eb"&lt;/span&gt;
&lt;span class="na"&gt;features&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;local_graph&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;linear_nav&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. That's the difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Kiro Changed Everything
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. I didn't just &lt;em&gt;use&lt;/em&gt; Kiro — I used &lt;strong&gt;every feature&lt;/strong&gt; it offers. And the combination was more powerful than any individual piece.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Spec-Driven Development: Planning Before Coding
&lt;/h3&gt;

&lt;p&gt;Kiro's spec system is like having a senior architect on your team who never gets tired.&lt;/p&gt;

&lt;p&gt;For complex features like the multi-pane navigation, I created specs with three phases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt; → What does the user need?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;WHEN a user clicks a [[wikilink]]
THEN the System SHALL open a new pane to the right
WHILE keeping the previous pane visible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Design&lt;/strong&gt; → How do we build it?&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; NavigationContext manages pane state
&lt;span class="p"&gt;-&lt;/span&gt; useReducer handles open/close/focus actions
&lt;span class="p"&gt;-&lt;/span&gt; Horizontal scroll container with snap points
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tasks&lt;/strong&gt; → What are the steps?&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;1.&lt;/span&gt; Create NavigationContext with pane state
&lt;span class="p"&gt;2.&lt;/span&gt; Implement OPEN_PANE action
&lt;span class="p"&gt;3.&lt;/span&gt; Add horizontal scroll container
&lt;span class="p"&gt;4.&lt;/span&gt; Wire up wikilink click handlers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I created &lt;strong&gt;16 specs&lt;/strong&gt; total. Each one kept Kiro focused and prevented the "let me just refactor everything" syndrome that plagues AI coding.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Agent Hooks: Automation That Actually Works
&lt;/h3&gt;

&lt;p&gt;This is the feature that made me go "wait, this is actually magic."&lt;/p&gt;

&lt;p&gt;I set up three hooks that run automatically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Quality Check&lt;/strong&gt; — Runs on every &lt;code&gt;.ts&lt;/code&gt;/&lt;code&gt;.tsx&lt;/code&gt; save&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;"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;"src/**/*.ts"&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;"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;"Fix TypeScript errors, add missing imports"&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;Component Docs Generator&lt;/strong&gt; — Auto-documents React components&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;"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;"**/components/**/*.tsx"&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;"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;"Add JSDoc documentation to this component"&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;Secrets Scanner&lt;/strong&gt; — Catches API keys before they hit git&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;"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;"**/*.yaml"&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;"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;"Scan for exposed secrets and alert if found"&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;The result? Every file I saved was automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type-checked and fixed&lt;/li&gt;
&lt;li&gt;Documented with JSDoc&lt;/li&gt;
&lt;li&gt;Scanned for accidental credential exposure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No manual linting. No "oh crap I committed my API key" moments.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Steering Documents: Context That Persists
&lt;/h3&gt;

&lt;p&gt;The biggest problem with AI coding assistants? They forget everything between sessions.&lt;/p&gt;

&lt;p&gt;Kiro's steering documents solve this. I created three files in &lt;code&gt;.kiro/steering/&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tech.md&lt;/strong&gt; — The tech stack&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; Next.js 14 (App Router) with TypeScript strict mode
&lt;span class="p"&gt;-&lt;/span&gt; Tailwind CSS for styling
&lt;span class="p"&gt;-&lt;/span&gt; Supabase (PostgreSQL) for database
&lt;span class="p"&gt;-&lt;/span&gt; React Query v5 for server state
&lt;span class="p"&gt;-&lt;/span&gt; TipTap for WYSIWYG editing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;structure.md&lt;/strong&gt; — Project conventions&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; Barrel exports in hooks/, components/, types/
&lt;span class="p"&gt;-&lt;/span&gt; Path alias @/_ maps to src/_
&lt;span class="p"&gt;-&lt;/span&gt; Tests in &lt;span class="gs"&gt;**tests**&lt;/span&gt;/ folders adjacent to source
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;product.md&lt;/strong&gt; — What we're building&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;NEXUS supports three navigation modes:
&lt;span class="p"&gt;
1.&lt;/span&gt; Horizontal (stacking panes)
&lt;span class="p"&gt;2.&lt;/span&gt; Linear (prev/next)
&lt;span class="p"&gt;3.&lt;/span&gt; Graphical (node graph)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every time I started a new chat, Kiro already knew:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What libraries to use&lt;/li&gt;
&lt;li&gt;How to structure code&lt;/li&gt;
&lt;li&gt;What features exist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more "actually, we're using React Query, not SWR" corrections.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. MCP Integrations: No More Hallucinated Docs
&lt;/h3&gt;

&lt;p&gt;This one's subtle but crucial.&lt;/p&gt;

&lt;p&gt;AI models hallucinate documentation. They'll confidently tell you to use &lt;code&gt;useQuery({ queryKey: 'users' })&lt;/code&gt; when React Query v5 actually requires &lt;code&gt;useQuery({ queryKey: ['users'] })&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kiro's MCP integrations fix this by fetching &lt;strong&gt;real, current documentation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context7 MCP&lt;/strong&gt; — Up-to-date Next.js, React Query, Supabase docs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TailwindCSS MCP&lt;/strong&gt; — Accurate utility classes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;21st.dev MCP&lt;/strong&gt; — UI component patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before MCP:&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="c1"&gt;// Wrong v3 API&lt;/span&gt;
&lt;span class="nf"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fetchUsers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After MCP:&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="c1"&gt;// Correct v5 API&lt;/span&gt;
&lt;span class="nf"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;queryKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;queryFn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fetchUsers&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small difference. Hours of debugging saved.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Vibe Coding Highlights
&lt;/h2&gt;

&lt;p&gt;Not everything needed a spec. Some features just flowed through conversation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Create a wikilink parser that extracts [[links]] and handles aliases like [[Title|display text]]"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kiro generated a complete &lt;code&gt;links.ts&lt;/code&gt; module with regex parsing, alias handling, and autocomplete suggestions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Build an MCP server endpoint that exposes our notes as tools for AI agents"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full implementation with &lt;code&gt;list_pages&lt;/code&gt;, &lt;code&gt;get_page&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt;, and &lt;code&gt;ask&lt;/code&gt; tools. Input validation included.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Make a local graph component showing the current note and its connections"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SVG-based force-directed graph with animated transitions and click-to-navigate.&lt;/p&gt;

&lt;p&gt;Each of these would've taken me a day to research and implement. With Kiro? An hour each, tops.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AI-Native Part
&lt;/h2&gt;

&lt;p&gt;Here's the feature I'm most proud of: &lt;strong&gt;every NEXUS deployment can be an MCP server&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"my-docs"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-app.vercel.app/api/mcp"&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;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;Point Claude at your knowledge base and ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What notes mention authentication?"&lt;/li&gt;
&lt;li&gt;"Summarize my notes on React patterns"&lt;/li&gt;
&lt;li&gt;"How do these three concepts connect?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your personal notes become AI-queryable. Your company docs become accessible to coding assistants.&lt;/p&gt;

&lt;p&gt;We used AI tools to build tools for AI. Meta? Absolutely. Cool? Also yes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;16 specs&lt;/strong&gt; created for major features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 agent hooks&lt;/strong&gt; automating quality checks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 steering documents&lt;/strong&gt; maintaining context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 MCP integrations&lt;/strong&gt; for accurate documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 apps&lt;/strong&gt; (Arcana + Codex) from one codebase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 weekend&lt;/strong&gt; to build it all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without Kiro, this would've been a month-long project. The combination of specs + hooks + steering + MCP created a development flow I've never experienced before.&lt;/p&gt;




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

&lt;p&gt;NEXUS is open source. Clone it, configure it, deploy it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/yourname/nexus.git
&lt;span class="nb"&gt;cd &lt;/span&gt;nexus &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Add your Supabase credentials&lt;/span&gt;
npm run seed:arcana
npm run dev:arcana  &lt;span class="c"&gt;# localhost:3001&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or just explore the code to see how the pieces fit together.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Specs prevent scope creep&lt;/strong&gt; — When the AI knows exactly what to build, it doesn't wander&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks eliminate toil&lt;/strong&gt; — Automating quality checks freed me to focus on features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steering is underrated&lt;/strong&gt; — Persistent context is the difference between "AI assistant" and "AI teammate"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP integrations matter&lt;/strong&gt; — Accurate docs &amp;gt; hallucinated docs, every time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The future of coding isn't AI replacing developers. It's AI amplifying developers. Kiro showed me what that actually looks like.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔮 &lt;a href="https://grimoire-arcana.vercel.app/" rel="noopener noreferrer"&gt;Arcana Demo&lt;/a&gt; — Personal knowledge vault&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://grimoire-codex.vercel.app/" rel="noopener noreferrer"&gt;Codex Demo&lt;/a&gt; — API documentation&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/Keshraf/grimoire" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎥 3-Minute Demo Video
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built for the Kiroween Hackathon 2025 — Skeleton Crew Category&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Three ways to explore. One template to build.&lt;/em&gt; 🎃👻🦇&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your experience with AI-assisted development? Have you tried Kiro's spec system or agent hooks? Drop a comment below!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tooling</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Forge Master: Text-to-3D on Cloud Run GPU</title>
      <dc:creator>Ketan Saraf</dc:creator>
      <pubDate>Tue, 11 Nov 2025 00:18:52 +0000</pubDate>
      <link>https://dev.to/keshraf/forge-master-text-to-3d-on-cloud-run-gpu-4p2i</link>
      <guid>https://dev.to/keshraf/forge-master-text-to-3d-on-cloud-run-gpu-4p2i</guid>
      <description>&lt;h2&gt;
  
  
  What We Built and Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; We built &lt;strong&gt;Forge Master&lt;/strong&gt;, a small web app that turns short text prompts into production-ready 3D assets in about ninety seconds. It runs on &lt;strong&gt;Google Cloud Run with an NVIDIA L4 GPU&lt;/strong&gt;, uses &lt;strong&gt;Imagen&lt;/strong&gt; for crisp reference images, &lt;strong&gt;InstantMesh&lt;/strong&gt; (Zero123++ + LRM) for reconstruction, and &lt;strong&gt;Gemini&lt;/strong&gt; for prompt enhancement and QA.&lt;br&gt;
&lt;strong&gt;This post is published for the purposes of entering the Cloud Run Hackathon.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live demo: &lt;a href="https://forge-master-frontend-525900378413.europe-west1.run.app" rel="noopener noreferrer"&gt;https://forge-master-frontend-525900378413.europe-west1.run.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub repo: &lt;a href="https://github.com/Keshraf/forge/" rel="noopener noreferrer"&gt;https://github.com/Keshraf/forge/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;

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


&lt;/p&gt;




&lt;h2&gt;
  
  
  Why we chose Cloud Run GPU
&lt;/h2&gt;

&lt;p&gt;We wanted to run real 3D reconstruction without managing clusters. Cloud Run GPU let us ship a container with PyTorch, Diffusers, and InstantMesh, scale from zero, and keep costs bounded. Pairing a public frontend with an &lt;strong&gt;IAM-protected GPU backend&lt;/strong&gt; made it safe to open the demo to everyone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture at a glance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend (Cloud Run):&lt;/strong&gt; Next.js UI + React Three Fiber viewer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent service (Cloud Run):&lt;/strong&gt; four agents for prompt enhancement, generation coordination, quality assurance, and iterative improvement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU service (Cloud Run GPU L4):&lt;/strong&gt; Imagen → Zero123++ → LRM → post-process → export (GLB, OBJ, FBX, STL)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Storage:&lt;/strong&gt; serves model files and multi-view images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Run IAM:&lt;/strong&gt; only the Agent can call the GPU service&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%2Fprivate-user-images.githubusercontent.com%2F82109991%2F512444300-3bd5a322-2ce6-4fae-b5d6-64ba929040af.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjI4MTk4MjYsIm5iZiI6MTc2MjgxOTUyNiwicGF0aCI6Ii84MjEwOTk5MS81MTI0NDQzMDAtM2JkNWEzMjItMmNlNi00ZmFlLWI1ZDYtNjRiYTkyOTA0MGFmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTExMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUxMTExVDAwMDUyNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg5NDQ0OTVmNzU1NmM5OTI0NDc4M2JkNGZhYjg2N2Q4MTUxMDcyOWNlMDA0MjIxMTM1NDc4YzgxOTg1NDFiNmYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.onpt6wuBwhY2cKXwT8hbAnJG61pdhG72cviU4F_hAd0" 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%2Fprivate-user-images.githubusercontent.com%2F82109991%2F512444300-3bd5a322-2ce6-4fae-b5d6-64ba929040af.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjI4MTk4MjYsIm5iZiI6MTc2MjgxOTUyNiwicGF0aCI6Ii84MjEwOTk5MS81MTI0NDQzMDAtM2JkNWEzMjItMmNlNi00ZmFlLWI1ZDYtNjRiYTkyOTA0MGFmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTExMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUxMTExVDAwMDUyNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg5NDQ0OTVmNzU1NmM5OTI0NDc4M2JkNGZhYjg2N2Q4MTUxMDcyOWNlMDA0MjIxMTM1NDc4YzgxOTg1NDFiNmYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.onpt6wuBwhY2cKXwT8hbAnJG61pdhG72cviU4F_hAd0" alt="Forge Master architecture"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The weekend build: three things that worked
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Small, explicit contracts between services.&lt;/strong&gt;&lt;br&gt;
Frontend calls &lt;code&gt;POST /generate&lt;/code&gt; on the Agent; the Agent obtains an IAM token, invokes the GPU service, collects URLs and stats, runs QA, and returns a compact result. Clear payloads made debugging easy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reconstruction-friendly inputs.&lt;/strong&gt;&lt;br&gt;
We bias prompts toward centered objects, white background, and studio lighting. That single nudge reduced artifacts and improved mesh quality in Zero123++ and LRM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A short, bounded “quality loop.”&lt;/strong&gt;&lt;br&gt;
We compute mesh stats (vertices, faces, watertightness) and have Gemini score semantic fidelity. If the score is low, we re-run once with adjusted guidance. Tight loops beat unbounded retries.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What we learned about running our own models on Cloud Run GPU
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VRAM spikes happen.&lt;/strong&gt; Zero123++ and LRM can spike memory. Fixing batch sizes, capping resolution, using FP16, and adding timeouts kept the service stable on a single L4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cold starts are manageable.&lt;/strong&gt; Trimming model load and keeping post-processing minimal kept p95 under ~140s, with typical runs around ~90s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure the expensive hop.&lt;/strong&gt; The GPU path is IAM-gated. Browsers never call it directly, which kept the demo public without risking runaway costs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Prompt idea: “A medieval fantasy sword with ornate handle, centered, white background, studio lighting.”&lt;br&gt;
Inspect the mesh in the viewer and download GLB, OBJ, FBX, or STL.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live demo: &lt;a href="https://forge-master-frontend-525900378413.europe-west1.run.app" rel="noopener noreferrer"&gt;https://forge-master-frontend-525900378413.europe-west1.run.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub repo: &lt;a href="https://github.com/Keshraf/forge/" rel="noopener noreferrer"&gt;https://github.com/Keshraf/forge/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This article is public and was created for the purposes of entering the Cloud Run Hackathon.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>google</category>
      <category>serverless</category>
      <category>showdev</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
