<?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 Rewiri-Thorsen</title>
    <description>The latest articles on DEV Community by Michael Rewiri-Thorsen (@mikeartee).</description>
    <link>https://dev.to/mikeartee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3632397%2F36568aa6-f78a-40fd-8e86-3299886c587c.jpeg</url>
      <title>DEV Community: Michael Rewiri-Thorsen</title>
      <link>https://dev.to/mikeartee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mikeartee"/>
    <language>en</language>
    <item>
      <title>Redesigning My Site Theme in One Evening with Kiro IDE, Astro 7, and AWS Amplify</title>
      <dc:creator>Michael Rewiri-Thorsen</dc:creator>
      <pubDate>Mon, 17 Aug 2026 06:03:10 +0000</pubDate>
      <link>https://dev.to/mikeartee/redesigning-my-site-theme-in-one-evening-with-kiro-ide-astro-7-and-aws-amplify-134d</link>
      <guid>https://dev.to/mikeartee/redesigning-my-site-theme-in-one-evening-with-kiro-ide-astro-7-and-aws-amplify-134d</guid>
      <description>&lt;p&gt;&lt;strong&gt;The following is a build-in-public walkthrough of a full theme redesign. From colour exploration to production deployment, including the deployment issues I hit and how they were solved.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;My site (&lt;a href="https://mikefromnz.com" rel="noopener noreferrer"&gt;mikefromnz.com&lt;/a&gt;) runs on Astro, deployed to AWS Amplify, styled with Tailwind CSS. &lt;/p&gt;

&lt;p&gt;It had a dark theme the typical near-black background (&lt;code&gt;#0a0a0a&lt;/code&gt;), cyan accent (&lt;code&gt;#22d3ee&lt;/code&gt;), Inter font at 16px. Functional, but generic. &lt;/p&gt;

&lt;p&gt;Every dark-mode dev blog looks like this. (mine still has a way to go)&lt;/p&gt;

&lt;p&gt;I wanted something warmer and more distinctive. I use &lt;a href="https://kiro.dev" rel="noopener noreferrer"&gt;Kiro IDE&lt;/a&gt; as my development environment, so the whole process happened as a conversation, describe what I want, iterate on options, apply changes, deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Design Process- BEFORE
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp32ngd5fanzxi3erscii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp32ngd5fanzxi3erscii.png" alt=" " width="800" height="841"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding Colours
&lt;/h3&gt;

&lt;p&gt;I went looking for colour palettes and landed on the work of &lt;a href="https://en.wikipedia.org/wiki/Sanzo_Wada" rel="noopener noreferrer"&gt;Sanzo Wada&lt;/a&gt;, who founded the Japan Standard Color Association in 1927. His six-volume &lt;em&gt;Haishoku Soukan&lt;/em&gt; documents over a thousand colour combinations. I browsed them at &lt;a href="https://colors.elwyn.co/" rel="noopener noreferrer"&gt;colors.elwyn.co&lt;/a&gt; and pulled out two palettes to explore:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Palette 1:&lt;/strong&gt; Pomegranate Purple, Cobalt Green, Green Blue, Deep Slate Green&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmdhq1qbmcopm2xn7pfvq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmdhq1qbmcopm2xn7pfvq.png" alt=" " width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Palette 2:&lt;/strong&gt; Spectrum Red, Ivory Buff, Rainette Green, Aconite Violet&lt;/p&gt;

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

&lt;p&gt;Rather than guessing how colours would look applied to my actual layout, Kiro generated standalone HTML mockups — no dependencies, just open in a browser. Each mockup showed three side-by-side previews of my real site layout (nav, hero, blog cards, footer) with different colour mappings.&lt;/p&gt;

&lt;p&gt;I explored three "patterns" for how to assign the colours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Option A/B:&lt;/strong&gt; Single bold accent colour&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Option C:&lt;/strong&gt; Calm primary accent with a contrasting "pop" colour on hover/active states&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Option C won — the dual-accent approach gives the site personality without overwhelming the reader.&lt;/p&gt;
&lt;h3&gt;
  
  
  Picking a Font
&lt;/h3&gt;

&lt;p&gt;I like Century Gothic for its clean geometric forms, but it's a proprietary Monotype font — can't load it from Google Fonts. Kiro suggested alternatives and mocked up three:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Outfit&lt;/strong&gt; — modern, slightly condensed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nunito&lt;/strong&gt; — soft rounded terminals, warm (closest to Century Gothic)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poppins&lt;/strong&gt; — geometric, crisp, widely used&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nunito won. Then I compared 18px vs 20px base size — 20px gave an editorial feel that suits long-form technical content.&lt;/p&gt;

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

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Background&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;#1c2219&lt;/code&gt; (dark mossy green)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surface&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#272e23&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;#ebd3a2&lt;/code&gt; (Ivory Buff)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Muted text&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;#8fa071&lt;/code&gt; (Rainette Green)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accent&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;#ebd3a2&lt;/code&gt; (Ivory Buff)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hover pop&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;#a36aa5&lt;/code&gt; (Aconite Violet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Font&lt;/td&gt;
&lt;td&gt;Nunito, 20px base&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dot-field&lt;/td&gt;
&lt;td&gt;Faint Spectrum Red at 12% opacity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The actual code change? Two files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tailwind.config.mjs&lt;/code&gt; — colour tokens and font family&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/layouts/BaseLayout.astro&lt;/code&gt; — Google Fonts link, base font-size, dot colour&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The Deployment Issues
&lt;/h2&gt;

&lt;p&gt;This is where the "build in public" part gets bumpy, but not impossible to fix. Three problems were hit on the way to production:&lt;/p&gt;
&lt;h3&gt;
  
  
  Problem 1: Astro 7 + astro-aws-amplify Peer Dependency Conflict
&lt;/h3&gt;

&lt;p&gt;I upgraded from Astro 6 to 7.2.2 at the same time as the theme change. The &lt;code&gt;astro-aws-amplify&lt;/code&gt; adapter (v0.4.1) declares &lt;code&gt;peer astro@"^6.0.0"&lt;/code&gt;, so &lt;code&gt;npm ci&lt;/code&gt; in the Amplify build pipeline refused to install.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Added a &lt;code&gt;.npmrc&lt;/code&gt; file to the repo:&lt;br&gt;
legacy-peer-deps=true&lt;/p&gt;

&lt;p&gt;The adapter works fine at runtime with Astro 7, it's just the peer dep declaration that's outdated. My solution unblocked the install until the adapter publishes a v7-compatible release.&lt;/p&gt;
&lt;h3&gt;
  
  
  Problem 2: Build Output Exceeded Amplify's 220MB Limit
&lt;/h3&gt;

&lt;p&gt;The Amplify build completed successfully, but deployment failed:&lt;/p&gt;

&lt;p&gt;CustomerError: The size of the build output (243093783) exceeds the max allowed size of 230686720 bytes. &lt;em&gt;DOH!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Astro 7's dependency tree is heavier than v6. The build moves &lt;code&gt;node_modules&lt;/code&gt; into &lt;code&gt;.amplify-hosting/compute/default/&lt;/code&gt; for the SSR runtime, and it was 243MB — 23MB over the limit. &lt;em&gt;DOUBLE DOH!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Added cleanup commands to &lt;code&gt;amplify.yml&lt;/code&gt; after &lt;code&gt;npm prune --production&lt;/code&gt;:&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="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;find node_modules \( -name '*.ts' ! -name '*.d.ts' -o -name '*.map' -o -name 'CHANGELOG*' -o -name '*.test.*' -o -name '*.spec.*' \) -delete 2&amp;gt;/dev/null || &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;find node_modules -type d \( -name '__tests__' -o -name 'test' -o -name 'tests' -o -name 'docs' \) -exec rm -rf {} + 2&amp;gt;/dev/null || &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;find node_modules -name '*.md' ! -name 'LICENSE*' -delete 2&amp;gt;/dev/null || &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This strips TypeScript source files, source maps, changelogs, test directories, and documentation from production node_modules. Shaved enough to get under the limit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson&lt;/strong&gt;: If you're on Amplify with SSR (server output mode), watch your node_modules size after major framework upgrades. The 220MB limit is for the entire compute artifact including your bundled app AND node_modules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 3: New Routes 404ing Despite Successful Build
&lt;/h3&gt;

&lt;p&gt;The /learn page (and all nested course pages) returned 404 on staging, even though:&lt;/p&gt;

&lt;p&gt;The build log showed them prerendering successfully.&lt;br&gt;
The static HTML existed at index.html.&lt;br&gt;
Directly accessing index.html worked fine.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Root cause&lt;/em&gt;: Amplify's deploy manifest routes extensionless paths (/learn) to the Compute (SSR) handler. &lt;/p&gt;

&lt;p&gt;For prerendered pages to be served at clean URLs, they need app-level custom rewrite rules that map /learn → index.html.&lt;/p&gt;

&lt;p&gt;These rules are pushed via the Amplify API in the postBuild step. But:&lt;/p&gt;

&lt;p&gt;The existing generate-amplify-rules.mjs script only handled single-depth routes (/about, /cv) and single-level wildcards (/blog/). &lt;/p&gt;

&lt;p&gt;The multi-level /learn/aws-aif-c01/aif-exam-overview/exam-format paths were never covered.&lt;/p&gt;

&lt;p&gt;The rule-push was restricted to the main branch, so staging deploys never updated the rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: Rewrote the script to emit an explicit rewrite for every prerendered index.html regardless of nesting depth, and allowed staging to push rules too:&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;toRules&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paths&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;rules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;200&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}];&lt;/span&gt;
  &lt;span class="k"&gt;for &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;p&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;source&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;p&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="na"&gt;target&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;p&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/index.html`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;200&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;source&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;p&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="na"&gt;target&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;p&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/index.html`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;200&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;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;rules&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;Lesson&lt;/strong&gt;: If you're using Astro in hybrid mode (some pages prerendered, some SSR) on Amplify, you need rewrite rules for every prerendered clean URL. The astro-aws-amplify adapter's deploy manifest sends all extensionless paths to compute by default. &lt;/p&gt;

&lt;p&gt;Without explicit rewrites, prerendered pages at nested paths will 404.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Worked Well
&lt;/h2&gt;

&lt;p&gt;Kiro IDE kept the full conversation context, and alongside my Obsidian vault, it read my existing Tailwind config, understood the component structure, generated mockups using my actual layout, and applied changes to the right files without touching unrelated code.&lt;/p&gt;

&lt;p&gt;Astro prerendered 80+ pages in under a second. The hybrid mode (SSR for admin, static for everything else) is exactly right for a content site with a lightweight CMS.&lt;/p&gt;

&lt;p&gt;AWS Amplify gave me staging and production branches with automatic deploys from git push. The staging preview URL meant I could check the theme visually before going live.&lt;/p&gt;

&lt;p&gt;The combination meant the feedback loop was measured in minutes: &lt;/p&gt;

&lt;p&gt;change colours → build → see it on staging → adjust → push to prod.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Below is the learn page that was having issues, but not anymore!&lt;/em&gt;:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The ADR
&lt;/h2&gt;

&lt;p&gt;I documented the decision formally as ADR-001 in the repo, captures the context, options considered, final decision, and consequences. &lt;/p&gt;

&lt;p&gt;ALWAYS worth doing even for personal projects when you know you'll forget why you picked that specific shade of green in six months.&lt;/p&gt;

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

&lt;p&gt;The whole redesign: from "I want new colours" to live on production, took one evening session and half an hour the next morning to fix deployment issues. &lt;/p&gt;

&lt;p&gt;The colour exploration alone (two palettes, six options, three fonts, two sizes) would have taken me days of indecision without the instant visual comparison that the mockup approach gave me.&lt;/p&gt;

&lt;p&gt;Sometimes the best part of building in public is showing the problems, not just the polished result.&lt;/p&gt;

&lt;p&gt;The site is live at mikefromnz.com. Colours by Sanzo Wada (via &lt;a href="https://colors.elwyn.co/" rel="noopener noreferrer"&gt;colors.elwyn.co&lt;/a&gt;).&lt;/p&gt;

</description>
      <category>aws</category>
      <category>webdev</category>
      <category>astro</category>
      <category>ai</category>
    </item>
    <item>
      <title>The MCP Server of You: Building a Personal Knowledge Power for Kiro IDE</title>
      <dc:creator>Michael Rewiri-Thorsen</dc:creator>
      <pubDate>Fri, 20 Mar 2026 05:49:32 +0000</pubDate>
      <link>https://dev.to/mikeartee/the-mcp-server-of-you-building-a-personal-knowledge-power-for-kiro-ide-159j</link>
      <guid>https://dev.to/mikeartee/the-mcp-server-of-you-building-a-personal-knowledge-power-for-kiro-ide-159j</guid>
      <description>&lt;p&gt;&lt;strong&gt;In this post I'm going to walk you through how I built kiro-recall, &lt;br&gt;
a Kiro IDE Power that loads your personal knowledge vault into every &lt;br&gt;
session before you type a single word.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We'll cover why I built it, how it works, and how you can install &lt;br&gt;
and test it yourself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm getting old, and as I get older, I find my brain races faster than it ever has, because I have gained more and more knowledge as the years have dragged on ceaselessly.&lt;/p&gt;

&lt;p&gt;I needed to go back to filing my thoughts.&lt;/p&gt;

&lt;p&gt;I started with a notepad with way too many unsaved tabs. Great. Now I can't remember what I wrote on every single tab, let alone find them on my PC if I closed them down.&lt;/p&gt;

&lt;p&gt;I needed a solution - a digital &lt;a href="https://zettelkasten.de/introduction/" rel="noopener noreferrer"&gt;Zettelkasten&lt;/a&gt; folder or "second brain" vault seemed to solve that problem, so I built one in &lt;a href="https://obsidian.md" rel="noopener noreferrer"&gt;Obsidian&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;During the development of the Power though, I discovered all I needed&lt;br&gt;
Obsidian for was the inspiration. I needed to see the shape of how&lt;br&gt;
these things were constructed.&lt;/p&gt;

&lt;p&gt;Turns out a vault is just a folder. Plain markdown files on your own disk,&lt;br&gt;
organised in a way that makes sense to you. No app required to read&lt;br&gt;
them, no proprietary format locking you in, no cloud sync needed.&lt;br&gt;
Any text editor can open them. Any MCP server can read them.&lt;/p&gt;

&lt;p&gt;That realisation is what made kiro-recall possible. If the vault is&lt;br&gt;
just a folder, you can point an MCP server at it, read the files&lt;br&gt;
directly, and inject them into a Kiro session without Obsidian ever&lt;br&gt;
being involved. Obsidian is still great for browsing your notes&lt;br&gt;
visually, the graph view, backlinks, and plugin ecosystem are&lt;br&gt;
genuinely useful. But it's optional. The vault works without it.&lt;/p&gt;
&lt;h2&gt;
  
  
  What we're building
&lt;/h2&gt;

&lt;p&gt;kiro-recall is the MCP Server of You.&lt;/p&gt;

&lt;p&gt;Your decisions, your knowledge, your project context, loaded from your&lt;br&gt;
own machine into every Kiro session automatically before your first&lt;br&gt;
prompt reaches the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiro's steering files are unreliable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I found this out the hard way. I had steering files configured with&lt;br&gt;
&lt;code&gt;inclusion: always&lt;/code&gt;, the mode that's supposed to load them into every&lt;br&gt;
single interaction. They still got ignored. Kiro would generate code&lt;br&gt;
in broken language causing syntax errors, forget architectural decisions&lt;br&gt;
I'd documented, and ask me to re-explain context I'd already written down.&lt;/p&gt;

&lt;p&gt;After a Kiro update introduced Agent Skills, the problem got worse. Users&lt;br&gt;
started reporting on GitHub that project steering files were failing&lt;br&gt;
to load entirely, with the AI ignoring &lt;code&gt;inclusion: always&lt;/code&gt; in favour&lt;br&gt;
of generic task instructions.&lt;/p&gt;

&lt;p&gt;Every new session I was back to re-establishing who I am, what the&lt;br&gt;
project is, what decisions were already made.&lt;/p&gt;

&lt;p&gt;kiro-recall replaces that with a hook-based context injection system.&lt;/p&gt;

&lt;p&gt;A session start hook fires on your first prompt. Before your message&lt;br&gt;
reaches the model, it reads your personal knowledge vault from disk&lt;br&gt;
via MCP and injects the relevant notes as context. Not steering files.&lt;br&gt;
Not a prompt you paste in every session. Your actual notes, loaded&lt;br&gt;
automatically, every time.&lt;/p&gt;

&lt;p&gt;You do nothing. It just happens.&lt;/p&gt;

&lt;p&gt;The difference is architectural. Steering files sit in your workspace&lt;br&gt;
and hope the model reads them. kiro-recall uses a hook - it fires on&lt;br&gt;
the &lt;code&gt;promptSubmit&lt;/code&gt; event, which means it runs before Kiro can ignore&lt;br&gt;
anything. The context is already in the session before your first word.&lt;/p&gt;

&lt;p&gt;The vault is plain markdown files. No cloud dependency for reading your&lt;br&gt;
own notes. No data leaving your machine.&lt;br&gt;
v0.1.0 ships four hooks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Session Start&lt;/td&gt;
&lt;td&gt;Every first prompt&lt;/td&gt;
&lt;td&gt;Reads vault, injects context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/recall&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User triggered&lt;/td&gt;
&lt;td&gt;Writes a structured note to &lt;code&gt;00-inbox/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vault Scaffold&lt;/td&gt;
&lt;td&gt;User triggered&lt;/td&gt;
&lt;td&gt;Creates the standard folder structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/promote&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User triggered&lt;/td&gt;
&lt;td&gt;Reformats an inbox note as a Zettelkasten permanent note&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The architecture is intentionally minimal. No compiled code. No runtime&lt;br&gt;
dependencies beyond the MCP server. Every hook is a JSON file with an&lt;br&gt;
&lt;code&gt;askAgent&lt;/code&gt; prompt that instructs the model to execute a numbered&lt;br&gt;
procedure using MCP tool calls.&lt;/p&gt;

&lt;p&gt;This isn't a new idea. Developers have been pointing Claude Code at &lt;br&gt;
Obsidian vaults for months, and the consensus is consistent: targeted &lt;br&gt;
context beats re-explaining everything from scratch every time.&lt;/p&gt;

&lt;p&gt;And apparently, it saves you tokens and credits.&lt;/p&gt;

&lt;p&gt;That might seem counterintuitive. You're adding context, so shouldn't &lt;br&gt;
that cost more? The saving comes from what you stop doing.&lt;/p&gt;

&lt;p&gt;Before I built kiro-recall, every Kiro session started the same way. &lt;br&gt;
I'd open a workspace, type my first prompt, and immediately hit a wall. &lt;br&gt;
Kiro didn't know what I was building, what decisions I'd already made, &lt;br&gt;
or what stack I was using. So I'd spend the first few exchanges just &lt;br&gt;
getting it up to speed. Sometimes I'd paste in background. Sometimes &lt;br&gt;
I'd answer clarifying questions. Sometimes I'd just watch it confidently &lt;br&gt;
do the wrong thing because it had no context to work from.&lt;/p&gt;

&lt;p&gt;That re-establishment isn't free. Every clarification, every correction, &lt;br&gt;
every "no, I already decided to use X not Y" costs tokens. It happens &lt;br&gt;
at the start of every session, every day, across every project.&lt;/p&gt;

&lt;p&gt;kiro-recall front-loads a small, targeted context injection once per &lt;br&gt;
session. Atomic permanent notes are concise by design, one idea per &lt;br&gt;
note. The session hook runs once and stops. What it replaces is &lt;br&gt;
typically far more expensive in both credits and time, but that's &lt;br&gt;
one of the things I want testers to actually measure and report back on. I will be conducting my own A/B testing in regards to this.&lt;/p&gt;

&lt;p&gt;The difference with kiro-recall specifically is the hook. Every other &lt;br&gt;
approach still requires you to remember to load the context. &lt;br&gt;
kiro-recall makes it impossible to forget.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The vault structure
&lt;/h3&gt;

&lt;p&gt;The scaffold hook creates this structure on first run, wherever you&lt;br&gt;
point it. Your vault can live anywhere on your machine, a dedicated&lt;br&gt;
folder in Documents, alongside your dev projects, wherever makes sense&lt;br&gt;
for you. You configure the path once in &lt;code&gt;mcp.json&lt;/code&gt; and that's it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vault/
├── 00-inbox/          # /recall writes here
├── 01-projects/       # one file or subfolder per active project
├── 02-job-search/
├── 03-learning/
├── 04-knowledge/
├── 05-community/
├── 06-permanent/      # atomic Zettelkasten notes — loaded every session
└── 07-templates/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure is opinionated. It's based on my own workflow as an&lt;br&gt;
AWS Community Builder juggling job applications, learning, and community&lt;br&gt;
work alongside dev projects. The folders that actually drive kiro-recall's&lt;br&gt;
behaviour are only three: &lt;code&gt;00-inbox/&lt;/code&gt;, &lt;code&gt;01-projects/&lt;/code&gt;, and &lt;code&gt;06-permanent/&lt;/code&gt;.&lt;br&gt;
The rest is suggested organisation. Rename them, ignore them, add your own.&lt;br&gt;
The vault is just a folder, it's yours.&lt;br&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%2Fktn53r3lp4nfku3x78nz.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%2Fktn53r3lp4nfku3x78nz.png" alt="Session start flow" width="532" height="650"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Relevance detection
&lt;/h3&gt;

&lt;p&gt;The session start hook runs a four-stage Relevance Detector before injecting anything:&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%2F2w7uvwr301vwtidbw5n3.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%2F2w7uvwr301vwtidbw5n3.png" alt="Relevance Detection" width="699" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1 - Primary signal.&lt;/strong&gt; The hook extracts the workspace folder&lt;br&gt;
name (e.g. &lt;code&gt;kiro-recall&lt;/code&gt; from &lt;code&gt;C:\Dev\kiro-recall&lt;/code&gt; or&lt;br&gt;
&lt;code&gt;/Users/mike/projects/kiro-recall&lt;/code&gt;) and checks whether a matching file&lt;br&gt;
or subfolder exists in &lt;code&gt;01-projects/&lt;/code&gt;. If it finds one, it loads that&lt;br&gt;
project note plus all permanent notes and stops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2 - Secondary signal.&lt;/strong&gt; If no primary match, it scans the paths&lt;br&gt;
of all open files in the workspace. Any path segment that matches a&lt;br&gt;
project folder name in &lt;code&gt;01-projects/&lt;/code&gt; resolves the project. It also&lt;br&gt;
checks &lt;code&gt;.kiro/steering/&lt;/code&gt; for a &lt;code&gt;project&lt;/code&gt; field as a fallback within&lt;br&gt;
this stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 3 - Fallback.&lt;/strong&gt; No project match found. Load all permanent notes&lt;br&gt;
from &lt;code&gt;06-permanent/&lt;/code&gt; and inject those.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 4 - Cold vault.&lt;/strong&gt; If &lt;code&gt;06-permanent/&lt;/code&gt; and &lt;code&gt;00-inbox/&lt;/code&gt; are both&lt;br&gt;
empty, skip injection entirely and show a warm onboarding message&lt;br&gt;
instead of an error.&lt;/p&gt;

&lt;p&gt;A generic name guard runs before Stage 1. Workspace names like &lt;code&gt;src&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;app&lt;/code&gt;, &lt;code&gt;repo&lt;/code&gt; skip primary matching entirely and go straight to&lt;br&gt;
secondary signals. This prevents false matches on common folder names.&lt;/p&gt;
&lt;h3&gt;
  
  
  The hook files
&lt;/h3&gt;

&lt;p&gt;Each hook is a &lt;code&gt;.kiro.hook&lt;/code&gt; JSON file. Here's the structure:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kiro-recall: Session Start"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&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;"promptSubmit"&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;"..."&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 &lt;code&gt;promptSubmit&lt;/code&gt; event fires on every prompt, so the session start&lt;br&gt;
hook includes a once-per-session guard. On the first prompt it runs&lt;br&gt;
the full Relevance Detector and injects context. On every subsequent&lt;br&gt;
prompt in the same session it exits immediately. You get context once,&lt;br&gt;
cleanly, at the start.&lt;/p&gt;

&lt;p&gt;The capture and promote hooks use &lt;code&gt;userTriggered&lt;/code&gt; instead. They sit&lt;br&gt;
quietly until you need them, type &lt;code&gt;/recall&lt;/code&gt; mid-session to capture&lt;br&gt;
a note, or &lt;code&gt;/promote&lt;/code&gt; to move an inbox note into your permanent&lt;br&gt;
knowledge base.&lt;/p&gt;
&lt;h3&gt;
  
  
  The MCP dependency
&lt;/h3&gt;

&lt;p&gt;kiro-recall wraps &lt;a href="https://github.com/bitbonsai/mcpvault" rel="noopener noreferrer"&gt;@bitbonsai/mcpvault&lt;/a&gt;&lt;br&gt;
for vault access.&lt;/p&gt;

&lt;p&gt;The original choice was smithery-ai/mcp-obsidian, but it only exposed&lt;br&gt;
two tools and had no active maintenance. mcpvault ships 14 tools&lt;br&gt;
including &lt;code&gt;write_note&lt;/code&gt;, &lt;code&gt;search_notes&lt;/code&gt;, &lt;code&gt;read_multiple_notes&lt;/code&gt;, and&lt;br&gt;
&lt;code&gt;move_note&lt;/code&gt;, everything the hooks need to read, write, and reorganise&lt;br&gt;
your vault. It reads any directory of markdown files directly from disk,&lt;br&gt;
which means no Obsidian install required and no dependency on any&lt;br&gt;
proprietary format.&lt;/p&gt;

&lt;p&gt;One configuration line is all it needs:&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;"mcpvault"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@bitbonsai/mcpvault"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_VAULT_PATH_HERE"&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;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;Replace &lt;code&gt;YOUR_VAULT_PATH_HERE&lt;/code&gt; with the path to your vault folder and&lt;br&gt;
you're connected. The vault path is the only configuration required.&lt;br&gt;
Everything else is derived from the folder structure at runtime.&lt;/p&gt;
&lt;h3&gt;
  
  
  The promote flow
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;/promote&lt;/code&gt; hook is the most interesting piece of v0.1.0.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/recall&lt;/code&gt; is fast and low-friction by design. You dump a rough note&lt;br&gt;
into &lt;code&gt;00-inbox/&lt;/code&gt; and move on. But rough notes don't load well as&lt;br&gt;
context, they're messy, multi-topic, and hard for the model to use.&lt;br&gt;
Permanent notes need to be atomic. One idea, clearly stated, with&lt;br&gt;
connections to related concepts.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/promote&lt;/code&gt; does that reformatting for you. It lists your inbox notes,&lt;br&gt;
you pick one, and the hook rewrites it as a proper Zettelkasten permanent&lt;br&gt;
note with a fixed structure:&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="gh"&gt;# {Idea Title}&lt;/span&gt;

&lt;span class="gu"&gt;## The idea&lt;/span&gt;
{single atomic statement, 1-2 sentences}

&lt;span class="gu"&gt;## Why it matters&lt;/span&gt;
{significance or future relevance, 1-2 sentences}

&lt;span class="gu"&gt;## Connected to&lt;/span&gt;
{[[wikilink]] references}

&lt;span class="gu"&gt;## Source&lt;/span&gt;
{project}, {session description}, {YYYY-MM-DD}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The filename is derived from the idea title using &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Kebab_case" rel="noopener noreferrer"&gt;kebab-case&lt;/a&gt; with no&lt;br&gt;
date prefix. Permanent notes are evergreen, the filename reflects the&lt;br&gt;
idea, not when it was written. A note called&lt;br&gt;
&lt;code&gt;relevance-detection-via-workspace-name.md&lt;/code&gt; is still findable and&lt;br&gt;
meaningful in two years. A note called &lt;code&gt;2026-03-20-session-notes.md&lt;/code&gt;&lt;br&gt;
is not.&lt;/p&gt;

&lt;p&gt;After writing to &lt;code&gt;06-permanent/&lt;/code&gt;, the hook deletes the original from&lt;br&gt;
&lt;code&gt;00-inbox/&lt;/code&gt;. If the write fails, it surfaces the full reformatted note&lt;br&gt;
in a code block so nothing is lost. If the delete fails after a&lt;br&gt;
successful write, it warns you but doesn't roll back. The promoted&lt;br&gt;
note already exists in permanent, so the worst case is a duplicate&lt;br&gt;
in your inbox that you can delete manually.&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%2F7i3pmptt49rpu50cj7bh.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%2F7i3pmptt49rpu50cj7bh.png" alt="Promote Flow" width="505" height="780"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Installing it
&lt;/h3&gt;

&lt;p&gt;kiro-recall ships as a Kiro Power and is installable right now directly &lt;br&gt;
from GitHub.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Kiro IDE and go to the Powers panel&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add power from GitHub&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Paste &lt;code&gt;https://github.com/mikeartee/kiro-recall&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Once installed, open the Powers config and update the 
&lt;code&gt;power-kiro-recall-mcp-obsidian&lt;/code&gt; entry - replace &lt;code&gt;YOUR_VAULT_PATH_HERE&lt;/code&gt; 
with the full path to your vault folder&lt;/li&gt;
&lt;li&gt;Restart Kiro or reconnect the MCP server from the MCP Servers panel&lt;/li&gt;
&lt;li&gt;Trigger the Vault Scaffold hook once from the Hooks panel to create 
your folder structure&lt;/li&gt;
&lt;li&gt;Start a new session - the session start hook fires automatically on 
your first prompt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From the next session onwards, context loads automatically.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it produces
&lt;/h2&gt;

&lt;p&gt;After the session start hook runs, you see exactly one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Loaded kiro-recall note (primary match) + 3 permanent notes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No file paths. No diagnostic output. Just a confirmation of what was loaded and how it was matched.&lt;/p&gt;

&lt;p&gt;After &lt;code&gt;/recall&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Note saved: 2026-03-20-kiro-recall-promote-flow-decision.md. It's in your inbox whenever you're ready to review it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After &lt;code&gt;/promote&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Promoted to `06-permanent/relevance-detection-via-workspace-name.md`.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The vault fills itself as a side effect of your normal dev workflow. Over time it becomes a searchable record of every decision, pattern, and insight across all your projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I need testers. Windows and Mac both welcome.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some things I want feedback on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does it work on your machine?&lt;/li&gt;
&lt;li&gt;Does the vault context actually change how your sessions feel?&lt;/li&gt;
&lt;li&gt;Does it use less credits in Kiro IDE on tasks?&lt;/li&gt;
&lt;li&gt;What would you add or change?&lt;/li&gt;
&lt;li&gt;Was it easy to install?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Install via Add Power from GitHub in Kiro IDE:&lt;br&gt;
&lt;a href="https://github.com/mikeartee/kiro-recall" rel="noopener noreferrer"&gt;https://github.com/mikeartee/kiro-recall&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;Mike Rewiri-Thorsen is an AWS Community Builder in the AI Engineering &lt;br&gt;
track, based in Palmerston North, Aotearoa New Zealand. He builds agentic AI tooling and cloud infrastructure, and shares the work publicly as he goes.&lt;/p&gt;

&lt;p&gt;Follow along on &lt;a href="https://github.com/mikeartee" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/michaelrewirithorsen/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;bitbonsai. (2026). &lt;em&gt;mcpvault: MCP server for markdown vaults&lt;/em&gt;. GitHub. &lt;a href="https://github.com/bitbonsai/mcpvault" rel="noopener noreferrer"&gt;https://github.com/bitbonsai/mcpvault&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>kiro</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
