<?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: Sarvar Nadaf</title>
    <description>The latest articles on DEV Community by Sarvar Nadaf (@sarvar_04).</description>
    <link>https://dev.to/sarvar_04</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%2F1163149%2F5afa2902-591e-4944-b6fa-9bbba80c6e95.png</url>
      <title>DEV Community: Sarvar Nadaf</title>
      <link>https://dev.to/sarvar_04</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarvar_04"/>
    <language>en</language>
    <item>
      <title>My Dev.to CLI Got Its First Community PR. Image Uploads From Terminal.</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Thu, 03 Sep 2026 11:36:02 +0000</pubDate>
      <link>https://dev.to/sarvar_04/my-devto-cli-got-its-first-community-pr-image-uploads-from-terminal-4562</link>
      <guid>https://dev.to/sarvar_04/my-devto-cli-got-its-first-community-pr-image-uploads-from-terminal-4562</guid>
      <description>&lt;p&gt;Three weeks after launching devpub, I got a notification I wasn't expecting: a pull request from someone I'd never talked to.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/HarishTeens" rel="noopener noreferrer"&gt;Harish&lt;/a&gt; / &lt;a class="mentioned-user" href="https://dev.to/harishteens"&gt;@harishteens&lt;/a&gt; had forked the repo, read the issues, picked one that I'd been putting off for weeks, and built a complete solution. Tests included. Design decisions documented. Edge cases handled.&lt;/p&gt;

&lt;p&gt;The feature? &lt;code&gt;devpub upload&lt;/code&gt;. The one command that should have existed from day one but couldn't, because the Forem API literally doesn't support it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;devpub&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.3.0
devpub upload cover.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one command now gives you this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Uploaded: cover.png

              Uploaded Images
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ File         ┃ URL                                       ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ cover.png    │ https://dev-to-uploads.s3.amazonaws.com/… │
└──────────────┴──────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more opening dev.to/new in the browser just to drag an image and copy the URL.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The problem&lt;/li&gt;
&lt;li&gt;How devpub upload works&lt;/li&gt;
&lt;li&gt;The authentication problem&lt;/li&gt;
&lt;li&gt;What Harish built&lt;/li&gt;
&lt;li&gt;Try it&lt;/li&gt;
&lt;li&gt;What's next&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The problem: no image endpoint in the API
&lt;/h2&gt;

&lt;p&gt;When I launched devpub in v0.1, the goal was to replace the Dev.to web editor entirely. Write locally, push with one command, track analytics. Done.&lt;/p&gt;

&lt;p&gt;But there was a gap. Every time I wrote an article with diagrams or a cover image, I had to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open dev.to/new in the browser&lt;/li&gt;
&lt;li&gt;Click the image upload button&lt;/li&gt;
&lt;li&gt;Select the file&lt;/li&gt;
&lt;li&gt;Wait for upload&lt;/li&gt;
&lt;li&gt;Copy the URL&lt;/li&gt;
&lt;li&gt;Paste it into my local markdown&lt;/li&gt;
&lt;li&gt;Close the tab&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Seven steps for something that should be &lt;code&gt;devpub upload figure.png&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The reason I hadn't built this: &lt;strong&gt;the Forem API V1 has no image upload endpoint.&lt;/strong&gt; It doesn't exist. You can set &lt;code&gt;cover_image&lt;/code&gt; in article frontmatter, but only to a URL that already exists somewhere. The API cannot create that URL.&lt;/p&gt;

&lt;p&gt;I filed &lt;a href="https://github.com/simplynadaf/devpub/issues/11" rel="noopener noreferrer"&gt;issue #11&lt;/a&gt; with a note saying "this requires reverse-engineering the web editor's upload mechanism" and moved on to other features.&lt;/p&gt;

&lt;p&gt;Harish didn't move on. He figured it out.&lt;/p&gt;




&lt;h2&gt;
  
  
  How devpub upload works
&lt;/h2&gt;

&lt;p&gt;The Dev.to web editor uploads images to &lt;code&gt;POST /image_uploads&lt;/code&gt;. It's a multipart form submission, same as any file upload. But it's not authenticated with your API key. It uses your browser session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Upload a single image&lt;/span&gt;
devpub upload cover.png

&lt;span class="c"&gt;# Upload multiple images&lt;/span&gt;
devpub upload &lt;span class="k"&gt;*&lt;/span&gt;.png

&lt;span class="c"&gt;# Get ready-to-paste Markdown&lt;/span&gt;
devpub upload architecture.png &lt;span class="nt"&gt;--markdown&lt;/span&gt;
&lt;span class="c"&gt;# Output: ![architecture](https://dev-to-uploads.s3.amazonaws.com/uploads/...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--markdown&lt;/code&gt; flag is the one I use most. Write your article with &lt;code&gt;![](./figures/diagram.png)&lt;/code&gt;, then run &lt;code&gt;devpub upload figures/*.png --markdown&lt;/code&gt; and paste the output directly over your local references.&lt;/p&gt;




&lt;h2&gt;
  
  
  The authentication problem
&lt;/h2&gt;

&lt;p&gt;Here's why this feature sat undone for three weeks. The &lt;code&gt;/image_uploads&lt;/code&gt; endpoint requires:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;code&gt;_Devto_Forem_Session&lt;/code&gt; cookie (your login session)&lt;/li&gt;
&lt;li&gt;A CSRF token (anti-forgery protection)&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;Origin&lt;/code&gt; header matching &lt;code&gt;https://dev.to&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your API key? Useless. This endpoint doesn't accept it.&lt;/p&gt;

&lt;p&gt;So devpub needs two extra credentials beyond your API key. They live in &lt;code&gt;.devpub/.env&lt;/code&gt; (which &lt;code&gt;devpub init&lt;/code&gt; gitignores by default):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DEVPUB_SESSION_COOKIE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_Devto_Forem_Session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;abc123...
&lt;span class="nv"&gt;DEVPUB_CSRF_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;a1b2c3d4...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run &lt;code&gt;devpub upload&lt;/code&gt; without setting these, it doesn't just fail with a cryptic error. It shows you exactly where to find them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╭─ Session Credentials Required ─────────────────────────────╮
│                                                             │
│  devpub upload needs your browser session (not API key).    │
│                                                             │
│  1. Open https://dev.to/new in Chrome                       │
│  2. Press F12 → Application → Cookies → dev.to             │
│  3. Copy _Devto_Forem_Session value                         │
│  4. View page source → find &amp;lt;meta name="csrf-token"&amp;gt;       │
│  5. Add both to .devpub/.env                                │
│                                                             │
╰─────────────────────────────────────────────────────────────╯
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One deliberate design choice: these are &lt;strong&gt;login credentials&lt;/strong&gt;, not a scoped token. The &lt;code&gt;.env&lt;/code&gt; file is gitignored, and when they expire (you'll get a 401 or 403), you just re-copy them. devpub tells you that upfront rather than leaving you to guess why uploads suddenly stopped working.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Harish built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/simplynadaf/devpub/pull/12" rel="noopener noreferrer"&gt;Harish's PR&lt;/a&gt; wasn't a quick hack. It was a proper module with clear boundaries:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/devpub/api/uploads.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ImageUploader&lt;/code&gt; class with all HTTP logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/devpub/cli/images.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Click command + Rich table output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tests/test_uploads.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;29 tests, all HTTP-mocked with respx&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things stood out in his implementation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Fail before the network.&lt;/strong&gt; File existence, extension validation, and size check (25 MB limit) all happen before any HTTP request fires. A typo in a filename costs zero network round-trips.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Flexible response parsing.&lt;/strong&gt; Dev.to's upload response isn't documented, so the &lt;code&gt;_extract_url&lt;/code&gt; method handles every response shape that's been observed: &lt;code&gt;links.url&lt;/code&gt;, &lt;code&gt;image.url&lt;/code&gt;, &lt;code&gt;images[0]&lt;/code&gt;, a raw string. If none match, it raises with the full response body included. A wrong URL silently landing in your article would be worse than a loud error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cookie flexibility.&lt;/strong&gt; You can paste the full cookie header (&lt;code&gt;a=1; b=2; _Devto_Forem_Session=xyz&lt;/code&gt;) or just the session value. Both work. Because copying one value out of DevTools is easy to get wrong.&lt;/p&gt;

&lt;p&gt;The PR description was thorough. Design rationale for keeping &lt;code&gt;ImageUploader&lt;/code&gt; separate from &lt;code&gt;DevtoClient&lt;/code&gt; (different auth models shouldn't share a class). Explicit call-out that tests pin the request shape, not the live response. A suggestion to smoke-test against a real session before release.&lt;/p&gt;

&lt;p&gt;This is what good open source contributions look like. Not just code that works, but code that explains &lt;em&gt;why it works that way&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Other changes in v0.3.0
&lt;/h2&gt;

&lt;p&gt;Beyond the upload feature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fixed hardcoded User-Agent&lt;/strong&gt;: Was stuck at &lt;code&gt;devpub/0.1.0&lt;/code&gt;. Now reads the actual version from &lt;code&gt;importlib.metadata&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed empty API key edge case&lt;/strong&gt;: &lt;code&gt;DevtoClient(api_key='')&lt;/code&gt; used to fall through to environment variables silently. Now it raises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo cleanup&lt;/strong&gt;: Removed personal draft articles from tracking, updated &lt;code&gt;.gitignore&lt;/code&gt; for research docs and recordings.&lt;/li&gt;
&lt;/ul&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;devpub&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.3.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For uploads, you need the session credentials (one-time setup):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add to .devpub/.env&lt;/span&gt;
&lt;span class="nv"&gt;DEVPUB_SESSION_COOKIE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_session_cookie_here
&lt;span class="nv"&gt;DEVPUB_CSRF_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_csrf_token_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devpub upload cover.png              &lt;span class="c"&gt;# Upload and get URL&lt;/span&gt;
devpub upload &lt;span class="k"&gt;*&lt;/span&gt;.png &lt;span class="nt"&gt;--markdown&lt;/span&gt;       &lt;span class="c"&gt;# Ready-to-paste Markdown tags&lt;/span&gt;
devpub upload diagram.png &lt;span class="nt"&gt;--dry-run&lt;/span&gt;  &lt;span class="c"&gt;# Validate without uploading&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full source: &lt;a href="https://github.com/simplynadaf/devpub" rel="noopener noreferrer"&gt;github.com/simplynadaf/devpub&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Two follow-ups that Harish explicitly scoped out of his PR (smart -- ship the primitive first, then build on it):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-rewrite during push&lt;/strong&gt;: &lt;code&gt;devpub push&lt;/code&gt; could detect local image paths like &lt;code&gt;![](./figures/arch.png)&lt;/code&gt;, upload them automatically, and rewrite the URLs in-place before publishing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cover image shortcut&lt;/strong&gt;: &lt;code&gt;devpub push -f article.md --cover photo.png&lt;/code&gt; to upload the image and set &lt;code&gt;cover_image&lt;/code&gt; in frontmatter in one step.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both become trivial now that the upload primitive exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  Shoutout
&lt;/h2&gt;

&lt;p&gt;Big thanks to &lt;strong&gt;&lt;a href="https://github.com/HarishTeens" rel="noopener noreferrer"&gt;Harish&lt;/a&gt;&lt;/strong&gt; &lt;a class="mentioned-user" href="https://dev.to/harishteens"&gt;@harishteens&lt;/a&gt; for the first external contribution to devpub. The PR was clean, well-tested, and properly documented. If you're looking for an open-source project to contribute to, devpub has &lt;a href="https://github.com/simplynadaf/devpub/issues" rel="noopener noreferrer"&gt;open issues&lt;/a&gt; ranging from beginner-friendly to architecturally interesting.&lt;/p&gt;




&lt;p&gt;What's your image workflow for Dev.to articles? Drag-and-drop in the browser? Hosted on GitHub? Imgur? I'd like to know if &lt;code&gt;devpub upload&lt;/code&gt; fills a gap people feel, or if everyone's already solved this differently.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on AWS architecture, DevOps, and AI Infrastructure:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@TechwithSarvar" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="mailto:simplynadaf@gmail.com"&gt;Email&lt;/a&gt; | &lt;a href="https://builder.aws.com/community/@sarvar" rel="noopener noreferrer"&gt;AWS Builder Center&lt;/a&gt; | &lt;a href="https://x.com/SarvarN_04" rel="noopener noreferrer"&gt;X&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devto</category>
      <category>opensource</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Free AWS Certification for Students: The Complete Step-by-Step Guide</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Mon, 31 Aug 2026 11:42:29 +0000</pubDate>
      <link>https://dev.to/aws-builders/free-aws-certification-for-students-the-complete-step-by-step-guide-3m1m</link>
      <guid>https://dev.to/aws-builders/free-aws-certification-for-students-the-complete-step-by-step-guide-3m1m</guid>
      <description>&lt;p&gt;👋 Hey there! I'm &lt;strong&gt;Sarvar&lt;/strong&gt;, a Cloud Architect who spends most days building on AWS and Azure, and the rest writing about it. Last year I wrote a guide on getting a free AWS certification voucher. Around 85,000 of you read it. You can still see it here: &lt;a href="https://dev.to/aws-builders/unlocking-free-aws-certifications-your-step-by-step-guide-29nc"&gt;Unlocking Free AWS Certifications: Your Step-by-Step Guide&lt;/a&gt;. Then AWS closed that program (the old AWS Educate ETC route), and for the next year my comment section became a support desk. The same questions came up again and again: "my voucher got denied," "I don't see the reward," "when is it coming back?"&lt;/p&gt;

&lt;p&gt;It's back. And this version is better.&lt;/p&gt;

&lt;p&gt;On August 20, 2026, AWS launched &lt;strong&gt;Student Rewards on AWS Builder Center&lt;/strong&gt;. If you are a student, you get 12 months of premium training, up to $30 in AWS credits, and a &lt;strong&gt;$100 certification exam voucher&lt;/strong&gt;. Total value: &lt;strong&gt;$579&lt;/strong&gt;. Your cost: &lt;strong&gt;$0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No credit card. Ever. You never pay anything and you never enter a card. If you are a student, this is as close to free money for your career as it gets.&lt;/p&gt;

&lt;p&gt;This is the step-by-step guide I promised you last year. I have added a full tips-and-tricks section so you skip the mistakes that got hundreds of people stuck. Take a breath. This is doable, and I will walk you through every step. Let's go. 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  What do you get?
&lt;/h2&gt;

&lt;p&gt;When you verify that you are a student and finish your profile, rewards unlock in stages as you earn badges on Builder Center.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Milestone&lt;/th&gt;
&lt;th&gt;Reward&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Verified + profile complete&lt;/td&gt;
&lt;td&gt;12 months Skill Builder premium ($449 value)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7 badges&lt;/td&gt;
&lt;td&gt;$10 AWS credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14 badges&lt;/td&gt;
&lt;td&gt;$20 AWS credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21 badges&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$100 Foundational exam voucher&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A quick word on those &lt;strong&gt;AWS credits&lt;/strong&gt;: they are like store money for AWS. You use them to run real services (a small server, a database, some storage) while you practice, so you can learn hands-on without paying from your own pocket.&lt;/p&gt;

&lt;p&gt;That &lt;strong&gt;$100 voucher&lt;/strong&gt; covers the full price of one Foundational exam. You pay nothing for the exam.&lt;/p&gt;




&lt;h3&gt;
  
  
  Which exam should I pick?
&lt;/h3&gt;

&lt;p&gt;The voucher works for either of AWS's two beginner certifications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Certified Cloud Practitioner (CLF-C02):&lt;/strong&gt; pick this if you are new to cloud and want the classic, most-recognized starter cert.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Certified AI Practitioner:&lt;/strong&gt; pick this if you are curious about AI and cloud together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are entry-level. Both are made for people with little or no hands-on experience. Both count for the voucher. If you are unsure, go with Cloud Practitioner. It is the one recruiters know best.&lt;/p&gt;

&lt;p&gt;One honest heads-up before you start: the credits come fast, the voucher takes longer. I explain why in the timing section, so read that before you plan. The good news is you get your first win in the first two weeks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who is eligible?
&lt;/h2&gt;

&lt;p&gt;Three conditions, all confirmed on the official Student Rewards page:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You are &lt;strong&gt;18 or older&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You are a student at an &lt;strong&gt;accredited higher education institution&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Your enrollment can be &lt;strong&gt;verified&lt;/strong&gt; (AWS uses a third-party service called SheerID for this).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The program is global, open to students at accredited institutions worldwide, subject to verification and local terms. A small number of countries are excluded by AWS voucher terms (Cuba, Iran, North Korea, Syria, Russia, and Crimea), so if you are there this offer will not apply.&lt;/p&gt;




&lt;h2&gt;
  
  
  How do I verify as a student?
&lt;/h2&gt;

&lt;p&gt;This is step one, and from my experience with the old program, it is where the first batch of people get stuck. AWS hands verification to &lt;strong&gt;SheerID&lt;/strong&gt;. You sign in with your Builder ID, give SheerID a few details, and it checks enrollment records.&lt;/p&gt;

&lt;p&gt;The official page says most verifications finish &lt;strong&gt;within minutes&lt;/strong&gt;. If SheerID needs a document from you, that review &lt;strong&gt;typically takes 24 to 48 hours&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You will provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your name&lt;/li&gt;
&lt;li&gt;Your college or school name&lt;/li&gt;
&lt;li&gt;Your &lt;strong&gt;school email address&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the instant check needs backup, SheerID asks for a document showing your name, your school name, and a current enrollment date. Based on SheerID's own student FAQ, these work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;School ID card &lt;strong&gt;with an expiration date&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Class schedule&lt;/li&gt;
&lt;li&gt;Tuition receipt&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💡 Tips for passing verification on the first try
&lt;/h3&gt;

&lt;p&gt;These come from watching people fail (and fix) verification on my last guide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Match your name to your school records, not your nickname.&lt;/strong&gt; If your university has you as "Mohammed A. Khan" and you type "Mo Khan," the automatic check can fail. In my experience this is the number one reason verification bounces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use your school email.&lt;/strong&gt; The official page asks for it specifically, and it clears the instant check far more often than a personal Gmail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You are allowed to black out sensitive info&lt;/strong&gt; on uploaded documents. Cover your ID number or address. Keep your name, school name, and the date visible. SheerID says it deletes documents after review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify on your own device.&lt;/strong&gt; Shared or public machines that already ran a verification can trip an error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you hit an error, check your details for typos first&lt;/strong&gt;, then contact SheerID support. If the reward itself is the problem after you are verified, that is an AWS/Builder Center issue, not SheerID.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How do I earn the 21 badges?
&lt;/h2&gt;

&lt;p&gt;Here I need to be honest with you about sources. The official Student Rewards page says you earn badges by continuing to take actions on Builder Center: "Publish articles, comment, and maintain streaks." AWS publishes the full badge criteria in its own FAQ at builder.aws.com/faq#badges. What AWS does &lt;strong&gt;not&lt;/strong&gt; publish in a neat table is the exact duration of every streak.&lt;/p&gt;

&lt;p&gt;So the breakdown below combines what AWS confirms (badges exist, streaks exist, these actions count) with what students are actively reporting on their profiles and what I have pieced together tracking the program. Treat the exact day counts as community-reported, not gospel, and check the official FAQ for the current criteria.&lt;/p&gt;

&lt;p&gt;Badges fall into four kinds, and understanding the mix is the whole game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-time badges (the quick wins):&lt;/strong&gt; completing onboarding, adding a profile photo, reading content, making your first post, submitting your first Wish (a Wish is a feature request you send to AWS through the Wishlist), and publishing your first article. These are the fastest badges you will earn, and you can grab most of them on day one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streak badges (the backbone):&lt;/strong&gt; sign-in, like, and comment streaks. Students report these come in 7-day, 30-day, and 90-day tiers, so the longest ones are what stretch the timeline. I explain how to handle them below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weekly streak badges:&lt;/strong&gt; voting on Wishes and publishing articles on a weekly cadence over several weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community badges (the hard part):&lt;/strong&gt; these depend on other builders reacting to you. Getting replies on your comments, collecting likes across your comments, publishing articles that get engagement, and posting Wishes that gain traction. Because they rely on other people, they take the longest to control.&lt;/p&gt;




&lt;h3&gt;
  
  
  Where are the buttons? (the part that confuses everyone on day one)
&lt;/h3&gt;

&lt;p&gt;When you first open Builder Center, you will not know where anything is. That is normal. I got a hundred messages last year that were basically "I want to do it but I cannot find the button." So here is exactly where to click:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add your profile photo:&lt;/strong&gt; open your profile, add a photo, hit save. That alone unlocks your first big reward (12 months of Skill Builder). Do this first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your first post:&lt;/strong&gt; join a Space first (a Space is just a topic room, like a group chat for a subject), then create your post inside it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your first Wish:&lt;/strong&gt; go to the Wishlist, click &lt;strong&gt;+&lt;/strong&gt;, then &lt;strong&gt;Create Wish&lt;/strong&gt;, and write one small AWS idea you wish existed. Tip: look through the Wishlist first and support an existing Wish, AWS prefers that over a duplicate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your first article:&lt;/strong&gt; click &lt;strong&gt;+&lt;/strong&gt;, then &lt;strong&gt;Create Article&lt;/strong&gt;, write, then &lt;strong&gt;Preview → Publish&lt;/strong&gt;. It does not have to be long. A short honest post about what you learned this week is enough.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;New to all of this? Bookmark the official &lt;a href="https://builder.aws.com/content/2zcHXEQEQkxFslPN4dT0Qm2CSJA/your-guide-to-builder-center" rel="noopener noreferrer"&gt;Your Guide to Builder Center&lt;/a&gt;. It walks you through the platform in plain steps.&lt;/p&gt;




&lt;h3&gt;
  
  
  Watch your number go up
&lt;/h3&gt;

&lt;p&gt;Here is the part that keeps you motivated. You do not jump from 0 to 21 in one leap. You climb it, and every stage is a small win you can feel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finish the easy day-one badges → you are already at about &lt;strong&gt;6 / 21&lt;/strong&gt;. On your first day. That fast.&lt;/li&gt;
&lt;li&gt;Hold your daily habit for a week → around &lt;strong&gt;9 / 21&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add the weekly article and Wish-vote streaks → about &lt;strong&gt;11 / 21&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Keep going to 30 days → roughly &lt;strong&gt;14 / 21&lt;/strong&gt;, and by now your $10 and $20 credits have landed. 💰&lt;/li&gt;
&lt;li&gt;Build a little community engagement → around &lt;strong&gt;18 / 21&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Finish the long streaks near 90 days → &lt;strong&gt;21 / 21&lt;/strong&gt;. Voucher unlocked. 🎉&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See it? More than half your badges come in the first few weeks. The last stretch is just showing up. If you can open an app once a day, you can do this.&lt;/p&gt;




&lt;h2&gt;
  
  
  The timing trick nobody tells you
&lt;/h2&gt;

&lt;p&gt;First, the good news, because it matters most. &lt;strong&gt;You get real rewards fast.&lt;/strong&gt; The one-time badges take a day or two. Keep a small daily habit going and you hit 7 badges within your first couple of weeks, which unlocks your first $10 in credits. Reach 14 badges over the next couple of weeks and $20 more lands. So you are not waiting three months for your first reward. You get an early win almost right away, and that early win is what keeps you going.&lt;/p&gt;

&lt;p&gt;Now the part nobody explains, and it is based on how the streaks work rather than an official AWS statement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The streaks stack. They do not reset each stage.&lt;/strong&gt; Think of it as one simple daily habit: sign in, like a post, leave a real comment. That same habit feeds the 7-day, 30-day, AND 90-day streak badges all at once. You are not doing three separate things. You are doing one small thing every day, and it counts three times.&lt;/p&gt;

&lt;p&gt;Here is the honest truth about the $100 voucher: if the longest streak really is 90 days (which is what students are reporting), then the voucher takes about 90 days of showing up daily. There is no shortcut past a time-based streak. But that is fine, because your credits already arrived early, and 90 days is exactly the time you need to study anyway. More on that later.&lt;/p&gt;

&lt;p&gt;So the plan is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Day 1:&lt;/strong&gt; grab all the one-time badges, and start your daily habit (sign in, one like, one comment). That is it for today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First 2 to 4 weeks:&lt;/strong&gt; you clear the short streaks and weekly streaks. $10 credit at 7 badges, $20 at 14 badges. Your first wins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Around 90 days:&lt;/strong&gt; the long streaks finish, you cross 21 badges, and the voucher unlocks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The single most important move: start the daily habit on day one. Everything else follows from that.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎯 More badge tips and tricks
&lt;/h3&gt;

&lt;p&gt;Based on my experience running the last program and watching how this one behaves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set a phone alarm for the daily three.&lt;/strong&gt; Sign in, one like, one comment. Ten minutes a day. On a long streak, one missed day is expensive, so protect the habit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For article streaks, keep them small.&lt;/strong&gt; A few short, honest articles beat one giant post you never finish. Write about what you learned in your course that week. That is enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comment with substance, not "nice post."&lt;/strong&gt; The community badges need other people to like and reply to you. A real question at the end of your comment earns replies. "Great article" gets ignored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the Wishlist before posting a Wish.&lt;/strong&gt; AWS suggests commenting on an existing Wish rather than duplicating one. Better engagement, and it still counts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start the community badges early.&lt;/strong&gt; They depend on other builders, which you do not control, so give them the most runway.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How do I claim and use the voucher?
&lt;/h2&gt;

&lt;p&gt;Once you hit 21 badges, the voucher appears in your rewards. From my last guide's comment section, this is where the real confusion lived, so let me pre-answer it.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ The mistakes that got people stuck last time
&lt;/h3&gt;

&lt;p&gt;I answered these same questions dozens of times in my last guide's comments. Here is what I learned, so you skip the queue.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"My reward isn't showing after I hit the milestone."&lt;/strong&gt; I lost count of how many people panicked here. The dashboard lags. Last year it took two to three days to update for most people. Wait it out before you open a ticket.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"The voucher got denied."&lt;/strong&gt; One reader tried three times in a row and kept failing. The fix was almost always the same: their training account email did not match their program email, so their progress was split across two profiles. Confirm you are using one account, one email, everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"I have an existing AWS training account and can't link it."&lt;/strong&gt; A reader hit a 500 error every time he tried to reset his password to link accounts. This is a known issue. Reset your password at the AWS Training and Certification portal first, then link. If the reset still errors, use a different email or contact support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not let the voucher expire.&lt;/strong&gt; This is the one that hurts most. You will have done months of work to earn it. AWS exam vouchers carry a redemption deadline, and yours will state its own expiry date when it lands. Book your exam that same day. From my experience, people grind for months and then lose the voucher to the clock. Do not be that person.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To book: take the voucher code into the AWS Certification portal, schedule the CLF-C02 or AI Practitioner exam, and apply the code at checkout. Cost drops to $0.&lt;/p&gt;




&lt;h2&gt;
  
  
  Turn the voucher into a real certificate, for free
&lt;/h2&gt;

&lt;p&gt;A voucher is not a certificate. You still have to pass the exam. Here is the best part, though: &lt;strong&gt;the same program already gave you 12 months of premium Skill Builder the day you verified.&lt;/strong&gt; That is your study material. You do not need to buy a single course or pay for anything.&lt;/p&gt;

&lt;p&gt;And do not be scared of the exam. &lt;strong&gt;Cloud Practitioner is the easiest AWS certification.&lt;/strong&gt; It is built for people with zero hands-on experience. It tests whether you understand cloud basics, not whether you can build complex systems. Most people pass with three to four weeks of steady study. If you have been doing your daily badge habit, you already have the time built in.&lt;/p&gt;

&lt;p&gt;The exam (CLF-C02) is 65 questions, 90 minutes, and you pass at 700 out of 1000. It covers four areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud Technology and Services (34%)&lt;/li&gt;
&lt;li&gt;Security and Compliance (30%)&lt;/li&gt;
&lt;li&gt;Cloud Concepts (24%)&lt;/li&gt;
&lt;li&gt;Billing, Pricing, and Support (12%)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📚 A free 4-week study plan from your Skill Builder access
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 1 to 2:&lt;/strong&gt; work through the official CLF-C02 exam prep course in Skill Builder. Start with Security and Cloud Technology, since together they are 64% of the exam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 3:&lt;/strong&gt; do the hands-on labs your premium access unlocks. Clicking around S3, EC2, and IAM yourself sticks far better than reading about them. Use your free credits here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 4:&lt;/strong&gt; take the official practice question set. If you score above 75% a few times in a row, book the real exam. You are ready.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the rhythm: the badges take around 90 days, and that is also plenty of time to study. Do both together. Study a little while you keep your daily streak alive. By the time badge 21 hits, you are exam-ready and the exam costs you nothing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why bother? What this does for you
&lt;/h2&gt;

&lt;p&gt;Let me be clear about why 90 days of small daily effort is worth it. This certificate goes on your CV and your LinkedIn. Recruiters search for it. For a student with no work experience yet, an AWS certification is proof you can learn cloud, and cloud skills are in demand everywhere. You walk out with a real, verifiable credential that companies recognize, and it cost you nothing but consistency.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Last year, 80,000 people wanted a free AWS certification. The program they used closed. This one replaced it, and it gives you more: training, credits, and the voucher, all free for students.&lt;/p&gt;

&lt;p&gt;The whole path costs nothing but time and showing up. Verify today. Start your daily habit today. Study a little each week while the badges add up. In about 90 days you can sit a free exam already prepared, and walk away certified.&lt;/p&gt;

&lt;p&gt;You can do this. Thousands of students are doing it right now, and so can you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your turn: which exam are you going for, Cloud Practitioner or AI Practitioner? Drop it in the comments and tell me what day of your streak you are on. I reply to comments, and we can keep each other going.&lt;/strong&gt; 👇&lt;/p&gt;

&lt;p&gt;Happy learning. 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on AWS architecture, DevOps, and AI Infrastructure:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@sarvar-nadaf" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="mailto:simplynadaf@gmail.com"&gt;Email&lt;/a&gt; | &lt;a href="https://builder.aws.com/community/@sarvar" rel="noopener noreferrer"&gt;AWS Builder Center&lt;/a&gt; | &lt;a href="https://x.com/SarvarN_04" rel="noopener noreferrer"&gt;X&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>beginners</category>
      <category>career</category>
      <category>certification</category>
    </item>
    <item>
      <title>NexPath Review: The Prompt Quality Layer for Cursor, Windsurf and Claude Code</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Thu, 27 Aug 2026 13:21:53 +0000</pubDate>
      <link>https://dev.to/sarvar_04/nexpath-review-the-prompt-quality-layer-for-cursor-windsurf-and-claude-code-353n</link>
      <guid>https://dev.to/sarvar_04/nexpath-review-the-prompt-quality-layer-for-cursor-windsurf-and-claude-code-353n</guid>
      <description>&lt;p&gt;I've been building &lt;a href="https://github.com/simplynadaf/devpub" rel="noopener noreferrer"&gt;devpub&lt;/a&gt;, an open-source CLI that publishes and tracks articles on Dev.to. Last week I was in Cursor, adding a new analytics feature - full vibe coding mode, rapid-fire prompts, one after another:&lt;/p&gt;

&lt;p&gt;"add caching to the API client."&lt;/p&gt;

&lt;p&gt;"fix the rate limiter."&lt;/p&gt;

&lt;p&gt;"make the analytics faster."&lt;/p&gt;

&lt;p&gt;Three prompts, three pieces of code generated instantly. I moved on. Two days later I realized the "fix" had silently broken my retry logic, the "caching" had no invalidation strategy, and "faster" meant the agent had removed the safety throttle that prevents Dev.to from banning my API key.&lt;/p&gt;

&lt;p&gt;None of those prompts said what shouldn't change. None specified how I'd know it worked. I wrote them in flow, and the agent did exactly what I asked. Which wasn't what I meant.&lt;/p&gt;

&lt;p&gt;That's when I tried NexPath, a prompt quality layer for AI coding agents. It sits between you and your agent, catches vague prompts at the moment you submit them, and offers a stronger version. I thought: why not try this on devpub? A real codebase I know inside out, with real prompts I'd actually type. If it works here, it works anywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The vibe coding pattern nobody talks about&lt;/li&gt;
&lt;li&gt;What if something caught you before you hit Enter?&lt;/li&gt;
&lt;li&gt;What the enhanced version includes&lt;/li&gt;
&lt;li&gt;My hands-on experience with NexPath&lt;/li&gt;
&lt;li&gt;NexPath agent support: Cursor, Windsurf and Claude Code&lt;/li&gt;
&lt;li&gt;Who NexPath is for: Cursor, Windsurf and Claude Code users&lt;/li&gt;
&lt;li&gt;What NexPath costs&lt;/li&gt;
&lt;li&gt;Bottom line&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The vibe coding pattern nobody talks about
&lt;/h2&gt;

&lt;p&gt;Every developer using AI coding agents has a version of this story. Not because the agents are bad. They're incredibly good at generating code from whatever you give them. The problem is what we give them.&lt;/p&gt;

&lt;p&gt;"Fix this." "Make it work." "Clean up the code." "Add auth."&lt;/p&gt;

&lt;p&gt;These prompts feel productive. The agent responds instantly. Code appears. You move to the next thing. But six prompts later, your codebase has grown in directions you didn't plan, with assumptions you didn't state, skipping checks you didn't ask for.&lt;/p&gt;

&lt;p&gt;The same mistakes repeat: no acceptance criteria, no rollback plan, no mention of what shouldn't change. Not because we don't know better. Because momentum makes it easy to skip.&lt;/p&gt;

&lt;p&gt;The answer, I thought, was more discipline. Be better at prompting. Write longer, more detailed requests every time.&lt;/p&gt;

&lt;p&gt;That lasted about three days.&lt;/p&gt;




&lt;h2&gt;
  
  
  What if something caught you before you hit Enter?
&lt;/h2&gt;

&lt;p&gt;NexPath is not another coding agent. It doesn't generate code. It doesn't replace your agent. It doesn't try to be clever. It sits between you and your AI agent, and when you submit a vague prompt, it holds it for a second and says: "Here's a stronger version of what you meant. Want to use it instead?"&lt;/p&gt;

&lt;p&gt;The simplest way I'd describe it: "NexPath is the thing that keeps AI-generated code from becoming a mess."&lt;/p&gt;

&lt;p&gt;The workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You write your prompt in Cursor, Windsurf, or Claude Code&lt;/li&gt;
&lt;li&gt;NexPath intercepts it at submit time&lt;/li&gt;
&lt;li&gt;A popup shows your original alongside an enhanced version&lt;/li&gt;
&lt;li&gt;You pick which one gets sent&lt;/li&gt;
&lt;li&gt;The chosen version auto-submits to your agent&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your original intent stays visible throughout. Nothing auto-sends without your approval. If a prompt doesn't need enhancement, NexPath stays silent.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the enhanced version includes
&lt;/h2&gt;

&lt;p&gt;When the enhancement fires, it doesn't rewrite your prompt. It wraps your original request with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scope boundaries&lt;/strong&gt;: what should change, what shouldn't&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acceptance criteria&lt;/strong&gt;: how you'll know it worked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification steps&lt;/strong&gt;: tests to run after&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety requirements&lt;/strong&gt;: rollback plan for risky operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequencing&lt;/strong&gt;: if the task is complex, break it into ordered steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a real example from my devpub testing. I typed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix the rate limiter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NexPath enhanced it to something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fix the rate limiter in DevtoClient._throttle(). Scope: only modify the timestamp tracking logic in src/devpub/api/devto.py. Do not change RATE_LIMIT_REQUESTS or RATE_LIMIT_WINDOW constants. Do not modify the retry logic in _request(). Acceptance: 30 requests per 30-second window still enforced, no sleep longer than 30s. Verify: run pytest tests/test_api.py after changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's what I should have written in the first place. But I didn't, because I was in flow.&lt;/p&gt;

&lt;p&gt;Another one. I typed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;push all drafts to dev.to as published
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NexPath flagged the risk and added:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Push all draft articles to Dev.to with published=true. WARNING: This is a destructive action. Published articles are immediately visible to readers and cannot be easily unpublished. Scope: only modify the &lt;code&gt;published&lt;/code&gt; field in article payloads. Safety: list all affected articles first and confirm count before proceeding. Rollback: note all article IDs changed so they can be reverted to draft if needed. Verify: check each article URL returns 200 after publishing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The difference between "just do it" and "do it carefully," surfaced at exactly the right moment.&lt;/p&gt;




&lt;h2&gt;
  
  
  My hands-on experience with NexPath
&lt;/h2&gt;

&lt;p&gt;I tested NexPath in two environments: Cursor on my laptop for the popup experience with devpub, and Claude Code on my EC2 server to stress-test the CLI and dig into the internals.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation (2-3 minutes, clean)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/hi0001234d/nexpath.git
&lt;span class="nb"&gt;cd &lt;/span&gt;nexpath
npm &lt;span class="nb"&gt;install&lt;/span&gt;        &lt;span class="c"&gt;# 16 seconds, 298 packages&lt;/span&gt;
npm run build      &lt;span class="c"&gt;# Build + 1,175 test validation&lt;/span&gt;
npm &lt;span class="nb"&gt;link
&lt;/span&gt;nexpath &lt;span class="nb"&gt;install&lt;/span&gt;    &lt;span class="c"&gt;# Auto-detected my agents, wrote hooks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;nexpath status&lt;/code&gt; command gives you a complete picture: prompt store stats, hook activity, config state, environment detection. The level of observability in the CLI surprised me. Structured JSON logs, proper error codes, debuggable output.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I liked
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Privacy holds up.&lt;/strong&gt; Everything lives in &lt;code&gt;~/.nexpath/&lt;/code&gt;. A SQLite database stores your prompts locally. The only outbound calls are to OpenAI's API (GPT-4o-mini for classification). Telemetry is disabled by default, confirmed in config. Secret redaction strips API keys from stored prompts automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The engineering is solid.&lt;/strong&gt; 1,803 commits from a team of three. 1,175 tests in the VS Code extension alone. Structured logging. Environment detection (OS, WSL, CI, devcontainer). Proper config system with keychain integration. This is not a weekend hackathon project abandoned after the demo, even though it started at one (AI Hackfest 2026 by MLH).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It knows when to shut up.&lt;/strong&gt; The system classifies your prompts into development stages (idea, architecture, implementation, testing, etc.) and only fires when it detects a transition or an absence signal: a missing spec, a skipped test strategy, a risky shortcut. When your prompts are already well-structured, it stays out of the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The popup experience just works.&lt;/strong&gt; In Cursor, you type your prompt, hit Enter, and NexPath holds it for a beat. A popup appears showing your original alongside the enhanced version. You pick one, it auto-submits. No context switch, no copy-paste, no extra windows. It feels like a natural part of the workflow, not an interruption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment awareness is thorough.&lt;/strong&gt; The &lt;code&gt;nexpath env&lt;/code&gt; command probes your OS, detects WSL, devcontainers, CI pipelines, shell type, project framework, version control, test runner, and deploy config, all locally. It uses this context to calibrate when and how it intervenes. That level of situational awareness is rare in developer tooling.&lt;/p&gt;

&lt;h3&gt;
  
  
  What needs work
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API key handling has a rough edge.&lt;/strong&gt; NexPath requires an OpenAI API key (for GPT-4o-mini). Their docs say it falls back gracefully to local classification when no key is available. In practice, after the first prompt, subsequent calls throw an unhandled &lt;code&gt;OpenAIError: Missing credentials&lt;/code&gt; exception instead of degrading silently. It's a v1 edge case, easily fixable, but worth knowing if you're setting up on a fresh machine without a key configured yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The CLI advisory and the VS Code popup are different systems.&lt;/strong&gt; The submit-time popup (Cursor/Windsurf) is the primary product. It intercepts every prompt at the moment you press Enter. The CLI advisory for Claude Code is a different mechanism that builds up session history before intervening. In my CLI stress test, it captured 18 prompts and intervened zero times because it needs longer session context to detect meaningful transitions. The popup experience doesn't have this limitation. It evaluates each prompt independently. If you're on Claude Code, expect a quieter experience than the Cursor/Windsurf popup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single LLM provider for now.&lt;/strong&gt; It currently uses &lt;code&gt;gpt-4o-mini&lt;/code&gt; as the classification model, a reasonable v1 tradeoff that limits flexibility for teams using other providers. The API costs are tiny (pennies per day), but multi-provider support would make it more accessible to teams with existing Anthropic or Groq setups.&lt;/p&gt;




&lt;h2&gt;
  
  
  NexPath agent support: Cursor, Windsurf and Claude Code
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Status (Aug 2026)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Supported via CLI + MCP hooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Supported via VS Code extension (submit-time popup)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windsurf / Devin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Supported via VS Code extension (submit-time popup)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The VS Code extension (for Cursor and Windsurf) intercepts prompts at submit time and shows the popup inline. For Claude Code, it works through the CLI's hook system, firing between prompt submissions.&lt;/p&gt;

&lt;p&gt;Important distinction: the Cursor/Windsurf experience is the polished one. You type, hit Enter, NexPath catches it, shows a popup, you pick, it sends. The Claude Code experience works through terminal hooks, which is less visual but functional.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who NexPath is for: Cursor, Windsurf and Claude Code users
&lt;/h2&gt;

&lt;p&gt;NexPath makes sense if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt in short bursts ("fix this", "add that") and want guardrails without slowing down&lt;/li&gt;
&lt;li&gt;Work on production codebases where a vague prompt can cause real damage&lt;/li&gt;
&lt;li&gt;Want prompt discipline without having to be disciplined every single time&lt;/li&gt;
&lt;li&gt;Use Cursor or Windsurf as your primary agent environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's less useful if you already write detailed, structured prompts consistently, or if you're building throwaway prototypes where quality doesn't matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  What NexPath costs
&lt;/h2&gt;

&lt;p&gt;NexPath itself is free (Apache 2.0, open source). The only cost is your OpenAI API key usage for GPT-4o-mini. In a typical coding session, that's $0.01 to $0.05 per day. Negligible, but not zero.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;NexPath solves a problem I have: I write lazy prompts when I'm in flow, and those lazy prompts produce code that bites me later. The idea of a quality layer that catches me at the moment of submission, not after the damage is done, is genuinely useful.&lt;/p&gt;

&lt;p&gt;I tested it on devpub, my own open-source project with a real API client, real rate limiting, real push-to-production workflows. The prompts I'd normally fire off ("fix the rate limiter", "push all drafts as published") came back stronger, scoped, and safe. That's the value.&lt;/p&gt;

&lt;p&gt;The implementation on Cursor/Windsurf (submit-time popup, choose your version, auto-submit) is well-designed. The CLI experience for Claude Code needs more polish. The engineering underneath is serious, the privacy model is honest, and the team ships fast (20+ PRs merged in the 48 hours before launch).&lt;/p&gt;

&lt;p&gt;Is it perfect? No. The API key handling has a rough edge. The single-provider model limits flexibility. The CLI advisory needs longer sessions to activate. But for a v0.1.4 open-source tool from a three-person team, it's solving the right problem in the right place, and the Cursor/Windsurf popup experience is genuinely well-executed.&lt;/p&gt;

&lt;p&gt;I'll keep it installed. The first time it catches a dangerous prompt I would have sent unthinking, it pays for itself.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/hi0001234d/nexpath" rel="noopener noreferrer"&gt;NexPath on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;VS Code Marketplace: &lt;a href="https://marketplace.visualstudio.com/items?itemName=nexpath.nexpath-vscode" rel="noopener noreferrer"&gt;NexPath VS Code extension for Cursor and Windsurf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open VSX: &lt;a href="https://open-vsx.org/extension/nexpath/nexpath-vscode" rel="noopener noreferrer"&gt;NexPath on Open VSX&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo: &lt;a href="https://youtu.be/pNejtPA5DPU" rel="noopener noreferrer"&gt;Prompt Enhancement in action&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NexPath is running a Launch Feedback Challenge&lt;/strong&gt; (ends Sep 2, 2026). They're looking for honest feedback, not praise. If you try it and have opinions, good or bad, share them at &lt;a href="https://github.com/hi0001234d/nexpath/discussions/94" rel="noopener noreferrer"&gt;their discussion thread&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your approach to prompt quality? Do you write detailed prompts every time, or do you also fall into the "fix this" trap? Let me know in the comments.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Follow me for more on AWS architecture, DevOps, and AI Infrastructure:&lt;br&gt;
&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@TechwithSarvar" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="mailto:simplynadaf@gmail.com"&gt;Email&lt;/a&gt; | &lt;a href="https://builder.aws.com/community/@sarvar" rel="noopener noreferrer"&gt;AWS Builder Center&lt;/a&gt; | &lt;a href="https://x.com/SarvarN_04" rel="noopener noreferrer"&gt;X&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>showdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Built an AWS DevOps AI Agent Using Kiro Crew + MCP</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Mon, 24 Aug 2026 11:30:54 +0000</pubDate>
      <link>https://dev.to/aws-builders/i-built-an-aws-devops-ai-agent-using-kiro-crew-mcp-fk0</link>
      <guid>https://dev.to/aws-builders/i-built-an-aws-devops-ai-agent-using-kiro-crew-mcp-fk0</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/SPIIJ-dLN1E" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;At 3:17 AM last Tuesday, my payment-api ECS service entered a terminal failure loop. 7,279 failed tasks since August 13th. The health check expected &lt;code&gt;/api/health&lt;/code&gt; but the container only served static content. Every 60 seconds, ECS killed the task and replaced it. Burning compute the entire time.&lt;/p&gt;

&lt;p&gt;No alarm fired. I never set one up. No PagerDuty page. No Slack alert. Just a service churning through resources that nobody was watching.&lt;/p&gt;

&lt;p&gt;I slept through the whole thing. And woke up to a solved problem.&lt;/p&gt;

&lt;p&gt;Not because I got lucky. Because my Kiro Crew agent was awake. It spawned 5 parallel investigations, called AWS DevOps Agent for a health assessment, found the root cause across ECS, CodeBuild, CodePipeline, and Lambda, and flagged everything with severity-prioritized fixes. By 3:24 AM, done.&lt;/p&gt;

&lt;p&gt;This is Part 6 of my Kiro Crew series. Parts 1 to 5 showed what Crew can do: orchestrate agents, run cron jobs, enforce security, build custom apps. This one shows what happens when you connect it to AWS's production intelligence engine.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Watch the 12-min demo above to see the full autonomous investigation in action.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The problem nobody talks about&lt;/li&gt;
&lt;li&gt;What AWS DevOps Agent actually is&lt;/li&gt;
&lt;li&gt;The integration: one MCP config block&lt;/li&gt;
&lt;li&gt;The architecture&lt;/li&gt;
&lt;li&gt;Live demo: what the agent found&lt;/li&gt;
&lt;li&gt;Applying the fixes&lt;/li&gt;
&lt;li&gt;The cron job: check every 30 minutes&lt;/li&gt;
&lt;li&gt;The investigate skill: deep root-cause analysis&lt;/li&gt;
&lt;li&gt;The security model: why this is safe&lt;/li&gt;
&lt;li&gt;The self-learning layer&lt;/li&gt;
&lt;li&gt;34 tools at your agent's fingertips&lt;/li&gt;
&lt;li&gt;Cost considerations&lt;/li&gt;
&lt;li&gt;Try it yourself (complete walkthrough)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The problem nobody talks about
&lt;/h2&gt;

&lt;p&gt;Every DevOps team I've worked with has the same gap: the space between "something went wrong" and "someone noticed."&lt;/p&gt;

&lt;p&gt;PagerDuty fires when alarms trigger. But what about the things you never set alarms for? The ECS service silently cycling through failed tasks for four days straight. The CodeBuild project that's been FAILED since last week with nobody looking at it. The Lambda with a 3-second timeout calling a service that needs 6 seconds to respond.&lt;/p&gt;

&lt;p&gt;These aren't incidents. They're slow leaks. And they only become incidents when a customer complains or the bill arrives.&lt;/p&gt;

&lt;p&gt;I've seen this pattern across a dozen client engagements. The monitoring is always incomplete. The alarms cover the obvious cases. The subtle failures accumulate silently until something visible breaks.&lt;/p&gt;

&lt;h3&gt;
  
  
  The enterprise reality today
&lt;/h3&gt;

&lt;p&gt;Here's what incident response looks like at most organizations I've consulted for:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Alert fires&lt;/td&gt;
&lt;td&gt;PagerDuty/OpsGenie&lt;/td&gt;
&lt;td&gt;0 min&lt;/td&gt;
&lt;td&gt;Only works if alarm exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engineer wakes up&lt;/td&gt;
&lt;td&gt;On-call human&lt;/td&gt;
&lt;td&gt;5-15 min&lt;/td&gt;
&lt;td&gt;Context switch, fatigue, stress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Login to console&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;td&gt;MFA, VPN, finding the right account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check CloudWatch&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;td&gt;Which metrics? Which log group? Which time window?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correlate signals&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;td&gt;15-30 min&lt;/td&gt;
&lt;td&gt;Was there a deployment? Config change? Upstream issue?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identify root cause&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;td&gt;15-60 min&lt;/td&gt;
&lt;td&gt;Experience-dependent, often wrong first guess&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write fix&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;td&gt;10-30 min&lt;/td&gt;
&lt;td&gt;Under pressure, at 3 AM, with fatigue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apply + verify&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;td&gt;Hope it doesn't make things worse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total MTTR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1-3 hours&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;And that's IF an alarm existed&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The real killer: &lt;strong&gt;if no alarm was configured, this entire process never starts.&lt;/strong&gt; The failure just accumulates until someone notices manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  How our approach changes this
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cron fires (every 30 min)&lt;/td&gt;
&lt;td&gt;Kiro Crew&lt;/td&gt;
&lt;td&gt;0 min&lt;/td&gt;
&lt;td&gt;No alarm needed, proactive scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check all services&lt;/td&gt;
&lt;td&gt;Crew + DevOps Agent&lt;/td&gt;
&lt;td&gt;30 sec&lt;/td&gt;
&lt;td&gt;Parallel, covers everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correlate signals&lt;/td&gt;
&lt;td&gt;DevOps Agent&lt;/td&gt;
&lt;td&gt;60-90 sec&lt;/td&gt;
&lt;td&gt;X-Ray, CloudWatch, deployments, topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identify root cause&lt;/td&gt;
&lt;td&gt;DevOps Agent&lt;/td&gt;
&lt;td&gt;2-3 min&lt;/td&gt;
&lt;td&gt;Consistent, no fatigue, no wrong guesses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generate mitigation plan&lt;/td&gt;
&lt;td&gt;DevOps Agent&lt;/td&gt;
&lt;td&gt;90 sec&lt;/td&gt;
&lt;td&gt;Exact CLI commands, rollback steps included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apply fixes&lt;/td&gt;
&lt;td&gt;Kiro Crew&lt;/td&gt;
&lt;td&gt;30 sec&lt;/td&gt;
&lt;td&gt;Or: open PR for human review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verify healthy&lt;/td&gt;
&lt;td&gt;Kiro Crew&lt;/td&gt;
&lt;td&gt;30 sec&lt;/td&gt;
&lt;td&gt;Automated validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total MTTR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5-7 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No human woken up&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The architectural insight
&lt;/h3&gt;

&lt;p&gt;AWS designed DevOps Agent as a &lt;strong&gt;read-only investigator&lt;/strong&gt;. It observes, correlates, and produces mitigation plans with exact commands. But it never executes anything. That's intentional (security: no prompt injection risk from write operations).&lt;/p&gt;

&lt;p&gt;Kiro Crew fills that gap. It takes DevOps Agent's mitigation plan and executes it (or opens a PR for human approval in production).&lt;/p&gt;

&lt;p&gt;The separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DevOps Agent = the brain&lt;/strong&gt; (read-only, investigates, produces exact fix commands)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiro Crew = the hands&lt;/strong&gt; (orchestrates, executes, verifies, learns from past incidents)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither alone solves the problem. Together: autonomous incident response that runs 24/7, catches issues before customers notice, and gets smarter with every incident.&lt;/p&gt;

&lt;h3&gt;
  
  
  What enterprises gain
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No more silent failures.&lt;/strong&gt; Cron catches issues whether or not alarms exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent investigation quality.&lt;/strong&gt; DevOps Agent doesn't get tired at 3 AM or skip steps under pressure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;75% lower MTTR.&lt;/strong&gt; AWS reports 75% reduction in customers using DevOps Agent. Adding Crew automation pushes it further.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Institutional memory.&lt;/strong&gt; Crew's Knowledge base remembers every past incident. New team members inherit years of operational wisdom.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit trail by default.&lt;/strong&gt; Every investigation, every fix, every decision logged in CloudTrail and Crew sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-in-the-loop when you want it.&lt;/strong&gt; Trust mode for non-critical environments, PR approval for production.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What if an agent checked for you? Every 30 minutes. Autonomously. While you sleep, eat dinner, or take your kid to the park.&lt;/p&gt;




&lt;h2&gt;
  
  
  What AWS DevOps Agent actually is
&lt;/h2&gt;

&lt;p&gt;AWS DevOps Agent went GA in March 2026. Think of it as an always-on SRE that knows your AWS infrastructure intimately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it monitors:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon ECS (services, tasks, deployments, health checks)&lt;/li&gt;
&lt;li&gt;AWS Lambda (invocations, errors, duration, throttles, cold starts)&lt;/li&gt;
&lt;li&gt;Amazon API Gateway (5xx errors, latency, integration failures)&lt;/li&gt;
&lt;li&gt;Amazon RDS (connections, CPU, storage, replication lag)&lt;/li&gt;
&lt;li&gt;Amazon DynamoDB (throttles, capacity, latency)&lt;/li&gt;
&lt;li&gt;Amazon EC2 (status checks, CPU, network)&lt;/li&gt;
&lt;li&gt;Amazon S3 (error rates, request patterns)&lt;/li&gt;
&lt;li&gt;Amazon CloudWatch (alarms, metrics, anomalies)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it does with that data:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovers and maps&lt;/strong&gt; your service topology automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correlates signals&lt;/strong&gt; across metrics, traces, deployments, and configuration changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investigates incidents&lt;/strong&gt; with deep async root-cause analysis (takes 5 to 8 minutes per investigation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generates recommendations&lt;/strong&gt; with specific, actionable mitigations prioritized by severity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviews releases&lt;/strong&gt; by checking pull requests for production risk patterns before they ship&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The feature that makes this article possible: DevOps Agent exposes all of this over &lt;strong&gt;MCP&lt;/strong&gt; (Model Context Protocol). That means any MCP-compatible client can call its 34 tools programmatically. Including Kiro Crew.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Endpoint:&lt;/strong&gt; &lt;code&gt;https://connect.aidevops.{region}.api.aws/mcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A2A Endpoint (agent-to-agent):&lt;/strong&gt; &lt;code&gt;https://connect.aidevops.{region}.api.aws/a2a/*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supported Regions:&lt;/strong&gt; us-east-1, us-west-2, eu-west-1 (as of August 2026)&lt;/p&gt;




&lt;h2&gt;
  
  
  The integration: one MCP config block
&lt;/h2&gt;

&lt;p&gt;Connecting DevOps Agent to Kiro Crew takes one config block. I did this live in the terminal during the demo. Before adding it, I had 9 MCP servers configured in Crew. After: 10.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/home/ubuntu/.kiro/settings/mcp.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mcpServers&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;aws-devops-agent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://connect.aidevops.us-east-1.api.aws/mcp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;headers&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;X-Agent-Space-Id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;7ab2314d-15e8-4744-a1a7-3f96692fcd83&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;AWS DevOps Agent (34 tools)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;disabled&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/home/ubuntu/.kiro/settings/mcp.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Output: ✅ Added aws-devops-agent (10 total servers)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I verified the connection by calling &lt;code&gt;tools/list&lt;/code&gt; against the MCP endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tools available:
  • get_service
  • list_agent_spaces
  • get_agent_space
  • create_agent_space
  • update_agent_space
  • create_access_token
  • get_access_token
  • list_access_tokens
  • revoke_access_token
  ... and 24 more

Endpoint: https://connect.aidevops.us-east-1.api.aws/mcp
Space:    7ab2314d-15e8-4744-a1a7-3f96692fcd83
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;34 tools. Live connection confirmed. Your Crew agent can now call any of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alternative: SigV4 authentication (recommended for production)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you don't want to manage bearer tokens, use AWS SigV4 via &lt;code&gt;mcp-proxy-for-aws&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;"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;"aws-devops-agent"&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;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120000&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="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"mcp-proxy-for-aws@latest"&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://connect.aidevops.us-east-1.api.aws/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aidevops"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--region"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us-east-1"&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;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;This uses your existing AWS credentials (from &lt;code&gt;~/.aws/credentials&lt;/code&gt; or instance profile). No separate token to rotate.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;Here's the full autonomous pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────┐
│                       KIRO CREW                               │
│                                                               │
│  ┌───────────────┐     ┌──────────────────┐                  │
│  │  Cron Job     │────▶│  Orchestrator    │                  │
│  │  (*/30 * * *) │     │  (claude-sonnet) │                  │
│  └───────────────┘     └────────┬─────────┘                  │
│                                 │                             │
│                    Spawns 5 parallel subagents                │
│                                 │                             │
│        ┌────────────────────────┼────────────────────┐       │
│        ▼            ▼           ▼          ▼         ▼       │
│  ┌──────────┐ ┌──────────┐ ┌────────┐ ┌────────┐ ┌──────┐  │
│  │   ECS    │ │  CI/CD   │ │CloudW. │ │DevOps  │ │Lambda│  │
│  │  Check   │ │  Check   │ │ Check  │ │ Agent  │ │Check │  │
│  └────┬─────┘ └────┬─────┘ └───┬────┘ └───┬────┘ └──┬───┘  │
│       │             │           │          │         │       │
│       └─────────────┴───────────┴──────────┴─────────┘       │
│                              │                                │
│                    Consolidated findings                      │
│                    (severity-prioritized)                     │
│                              │                                │
│                    ┌─────────▼──────────┐                    │
│                    │  Coding Agent      │                    │
│                    │  (writes fix, PR)  │                    │
│                    └─────────┬──────────┘                    │
└──────────────────────────────┼───────────────────────────────┘
                               │
              ┌────────────────┼────────────────┐
              ▼                                 ▼
   ┌────────────────────┐            ┌──────────────────┐
   │  AWS DevOps Agent  │            │     GitHub       │
   │  (MCP endpoint)    │            │  (Pull Request)  │
   │                    │            │                  │
   │  - chat            │            │  Human reviews   │
   │  - investigate     │            │  in the morning  │
   │  - recommend       │            │                  │
   └────────────────────┘            └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cron fires&lt;/strong&gt; every 30 minutes (&lt;code&gt;*/30 * * * *&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestrator&lt;/strong&gt; (claude-sonnet-4) spawns 5 parallel subagents&lt;/li&gt;
&lt;li&gt;Each subagent checks one domain: ECS, CI/CD, CloudWatch, DevOps Agent consultation, Lambda&lt;/li&gt;
&lt;li&gt;All run simultaneously (not sequential, this matters for speed)&lt;/li&gt;
&lt;li&gt;Results consolidated into severity-prioritized findings&lt;/li&gt;
&lt;li&gt;If actionable: &lt;strong&gt;Coding Agent&lt;/strong&gt; writes the fix, opens a &lt;strong&gt;PR&lt;/strong&gt; on GitHub&lt;/li&gt;
&lt;li&gt;Human reviews the PR in the morning&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent can investigate but never deploy. That's the safety boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Live demo: what the agent found
&lt;/h2&gt;

&lt;p&gt;I triggered the investigation with one natural prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Something's wrong with my payment-api service. I think builds are failing and the pipeline is stuck. Check everything: ECS, CodeBuild, CodePipeline, Lambda timeouts, and CloudWatch alarms. Also try calling DevOps Agent via awscurl for a health assessment. Tell me what's broken and how to fix it, prioritized by severity."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent spawned 5 parallel subagents. I watched them work in real time:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Subagent&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;th&gt;Tools Used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ECS Investigation&lt;/td&gt;
&lt;td&gt;921383af&lt;/td&gt;
&lt;td&gt;Service status, task definitions, health checks&lt;/td&gt;
&lt;td&gt;14 tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD Investigation&lt;/td&gt;
&lt;td&gt;6a99eac8&lt;/td&gt;
&lt;td&gt;CodeBuild status, CodePipeline state, build logs&lt;/td&gt;
&lt;td&gt;14 tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch Investigation&lt;/td&gt;
&lt;td&gt;7e55ac60&lt;/td&gt;
&lt;td&gt;Alarms, logs, metrics for service health&lt;/td&gt;
&lt;td&gt;14 tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevOps Agent Consultation&lt;/td&gt;
&lt;td&gt;ae0b20b6&lt;/td&gt;
&lt;td&gt;MCP endpoint call via awscurl&lt;/td&gt;
&lt;td&gt;3 tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda Investigation&lt;/td&gt;
&lt;td&gt;488d2596&lt;/td&gt;
&lt;td&gt;Timeouts, errors, Step Functions state&lt;/td&gt;
&lt;td&gt;11 tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All five running simultaneously. The DevOps Agent consultation alone took 67 seconds (it calls multiple AWS APIs behind the scenes). Total investigation: under 3 minutes.&lt;/p&gt;

&lt;p&gt;Here's what came back:&lt;/p&gt;

&lt;h3&gt;
  
  
  🚨 CRITICAL OUTAGE (4+ Days Down)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ECS Service in Terminal Failure Loop&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Failed tasks&lt;/td&gt;
&lt;td&gt;7,279 since August 13th&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Root Cause&lt;/td&gt;
&lt;td&gt;Health check expects &lt;code&gt;/api/health&lt;/code&gt; but nginx:alpine only serves static content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current State&lt;/td&gt;
&lt;td&gt;4 tasks running (should be 2), all UNHEALTHY, replaced every 60-90 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Impact&lt;/td&gt;
&lt;td&gt;Continuous failed task churn burning compute costs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster&lt;/td&gt;
&lt;td&gt;payment-api-cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;payment-api-service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Complete CI/CD Pipeline Breakdown&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CodeCommit&lt;/td&gt;
&lt;td&gt;Empty repository with no branches or code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CodeBuild&lt;/td&gt;
&lt;td&gt;FAILED (can't build from empty repo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CodePipeline&lt;/td&gt;
&lt;td&gt;FAILED, can't find 'main' branch that doesn't exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Builds fail every time, pipeline permanently stuck&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🟡 MEDIUM PRIORITY: Configuration Hardening
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set health check grace period to 30+ seconds (currently 0)&lt;/li&gt;
&lt;li&gt;Add proper logging and monitoring configuration&lt;/li&gt;
&lt;li&gt;Implement proper security groups and networking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ Lambda Timeout Issue
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Demo&lt;/code&gt; function has a 3-second timeout calling downstream services that need 4 to 6 seconds to respond. Every invocation times out silently. Zero alarms configured to catch it.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 CloudWatch: Zero Observability
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Zero alarms&lt;/strong&gt; configured in the entire account. 8 Lambda functions, 5 API Gateways, 1 ECS cluster, all running completely blind. If anything fails, nobody gets notified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;None of these would have triggered a PagerDuty alert.&lt;/strong&gt; The ECS service was burning compute for four days straight with nobody noticing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Applying the fixes
&lt;/h2&gt;

&lt;p&gt;Based on the agent's severity-prioritized recommendations, I applied two immediate fixes in the terminal:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix 1: Lambda timeout 3s to 30s&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws lambda update-function-configuration &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; Demo &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timeout&lt;/span&gt; 30 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"[FunctionName,Timeout]"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text
&lt;span class="c"&gt;# Output: Demo    30&lt;/span&gt;

aws lambda update-function-configuration &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; Demo-API &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timeout&lt;/span&gt; 30 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"[FunctionName,Timeout]"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text
&lt;span class="c"&gt;# Output: Demo-API    30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix 2: Add CloudWatch alarms (was ZERO)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ECS task failure alarm&lt;/span&gt;
aws cloudwatch put-metric-alarm &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--alarm-name&lt;/span&gt; &lt;span class="s2"&gt;"ECS-PaymentAPI-TaskFailures"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metric-name&lt;/span&gt; CPUUtilization &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; AWS/ECS &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--statistic&lt;/span&gt; Average &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--period&lt;/span&gt; 300 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--threshold&lt;/span&gt; 0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--comparison-operator&lt;/span&gt; LessThanOrEqualToThreshold &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--evaluation-periods&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dimensions&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ClusterName,Value&lt;span class="o"&gt;=&lt;/span&gt;payment-api-cluster &lt;span class="se"&gt;\&lt;/span&gt;
               &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ServiceName,Value&lt;span class="o"&gt;=&lt;/span&gt;payment-api-service &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--alarm-description&lt;/span&gt; &lt;span class="s2"&gt;"Payment API: no tasks running"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;span class="c"&gt;# Output: ✅ ECS alarm created&lt;/span&gt;

&lt;span class="c"&gt;# Lambda error alarm&lt;/span&gt;
aws cloudwatch put-metric-alarm &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--alarm-name&lt;/span&gt; &lt;span class="s2"&gt;"Lambda-Demo-Errors"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metric-name&lt;/span&gt; Errors &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; AWS/Lambda &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--statistic&lt;/span&gt; Sum &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--period&lt;/span&gt; 300 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--threshold&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--comparison-operator&lt;/span&gt; GreaterThanOrEqualToThreshold &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--evaluation-periods&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dimensions&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;FunctionName,Value&lt;span class="o"&gt;=&lt;/span&gt;Demo &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--alarm-description&lt;/span&gt; &lt;span class="s2"&gt;"Demo Lambda errors"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;span class="c"&gt;# Output: ✅ Lambda alarm created&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verified state after fixes:&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;Lambda Demo:     30s (was 3s)
Lambda Demo-API: 30s (was 3s)
Alarms:          2 active (was 0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the production Crew workflow, these become a PR. The agent writes the IaC change (CloudFormation, CDK, or Terraform depending on your stack), pushes to a branch, and opens the PR with investigation findings in the description. A human reviews it in the morning.&lt;/p&gt;




&lt;h2&gt;
  
  
  The cron job: check every 30 minutes
&lt;/h2&gt;

&lt;p&gt;Here's the cron that makes this autonomous. I added it through the Crew Schedule page:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&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;Name&lt;/td&gt;
&lt;td&gt;production-health-check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schedule&lt;/td&gt;
&lt;td&gt;Every 30 minutes (&lt;code&gt;*/30 * * * *&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent&lt;/td&gt;
&lt;td&gt;default (claude-sonnet-4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message&lt;/td&gt;
&lt;td&gt;Check production health: ECS, CodeBuild, Pipeline, Lambda, CloudWatch. Flag issues with severity and fixes.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every 30 minutes, Crew spawns a session, the agent checks infrastructure health, and reports findings. If everything's green, session ends quietly. If something's flagged, it investigates deeper and proposes fixes.&lt;/p&gt;

&lt;p&gt;No daemon process to maintain. No EC2 instance running a cron script. No custom monitoring infrastructure. One entry in the Schedule page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaling this:&lt;/strong&gt; You can have multiple cron jobs for different concerns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;production-health    → */30 * * * *  → Full infrastructure scan
cost-anomaly-check   → 0 8 * * *    → Daily cost spike detection  
security-drift       → 0 */6 * * *  → Every 6h IAM/SG audit
release-readiness    → 0 9 * * 1-5  → Weekday pre-deploy check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The investigate skill: deep root-cause analysis
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;chat&lt;/code&gt; tool is fast (seconds). But for real incidents, DevOps Agent has an &lt;code&gt;investigate&lt;/code&gt; skill that runs 5 to 8 minutes of deep analysis across your infrastructure.&lt;/p&gt;

&lt;p&gt;What the investigation does:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pulls CloudWatch metrics&lt;/strong&gt;: invocations, errors, duration, throttles, anomaly bands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks recent deployments&lt;/strong&gt;: CodeDeploy, ECS task definitions, Lambda versions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correlates downstream latency&lt;/strong&gt;: X-Ray traces, API Gateway integration errors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyzes temporal patterns&lt;/strong&gt;: did this start after a specific deployment?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks resource topology&lt;/strong&gt;: which services depend on the failing component?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Returns root-cause analysis&lt;/strong&gt; with prioritized recommendations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the same analysis flow a senior SRE would do manually. Check metrics, correlate with deployments, trace downstream, identify root cause. The difference: it happens at 3 AM without waking anyone up.&lt;/p&gt;

&lt;p&gt;In the demo, the DevOps Agent subagent took 67 seconds to complete its assessment (you can see it in the recording: &lt;code&gt;174s • 3 tools&lt;/code&gt; on the subagent panel). That's because it's making multiple API calls behind the scenes to build the full picture.&lt;/p&gt;




&lt;h2&gt;
  
  
  The security model: why this is safe
&lt;/h2&gt;

&lt;p&gt;"Autonomous agent fixing production" sounds terrifying. After running this for weeks, here's why it's not:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. DevOps Agent is read-only by default&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The IAM role uses &lt;code&gt;ReadOnlyAccess&lt;/code&gt;. Full visibility, zero write permissions:&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;"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;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&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;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&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="nl"&gt;"Service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aidevops.amazonaws.com"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sts:AssumeRole"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&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;"StringEquals"&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;"aws:SourceAccount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123456789012"&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;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;Attached policy: &lt;code&gt;arn:aws:iam::aws:policy/ReadOnlyAccess&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It can observe everything. It can change nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Crew's deny patterns block destructive commands&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even if the agent tries to deploy, Crew blocks it:&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;"deny_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="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"kubectl apply"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"aws deploy create-deployment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"terraform apply"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"aws ecs update-service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"aws lambda update-function-code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"aws cloudformation execute-change-set"&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 agent can write code. It cannot execute deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The output is always a Pull Request&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Never a direct change to production. The agent creates a branch, writes the fix, and opens a PR with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Investigation findings in the description&lt;/li&gt;
&lt;li&gt;Severity assessment&lt;/li&gt;
&lt;li&gt;Links to relevant CloudWatch metrics&lt;/li&gt;
&lt;li&gt;Diff showing exactly what changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Human reviews and approves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Full CloudTrail audit trail&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every MCP call to DevOps Agent is logged with:&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;"eventSource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aidevops.amazonaws.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"InvokeMcpTool"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requestParameters"&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;"agentSpaceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7ab2314d-..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"accessTokenId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"at-..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MCP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"toolName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chat"&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;"sourceIPAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"172.31.20.246"&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;Every action traceable. Every tool invocation recorded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Token scoping and rotation&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;read&lt;/code&gt; or &lt;code&gt;operate&lt;/code&gt; (choose minimum needed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expiration&lt;/td&gt;
&lt;td&gt;1 to 60 days (forced rotation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP Allowlist&lt;/td&gt;
&lt;td&gt;Optional, restrict to your Crew instance IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client Type&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;agent&lt;/code&gt; (for autonomous integrations)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revocation&lt;/td&gt;
&lt;td&gt;One-click disable all tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern: &lt;strong&gt;observe everything, change nothing, suggest via PR, human approves.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The self-learning layer
&lt;/h2&gt;

&lt;p&gt;Here's where Kiro Crew adds something DevOps Agent alone cannot do.&lt;/p&gt;

&lt;p&gt;First time the agent investigates the ECS failure loop, it learns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;payment-api uses nginx:alpine as the base image&lt;/li&gt;
&lt;li&gt;The health check path &lt;code&gt;/api/health&lt;/code&gt; doesn't exist in that container&lt;/li&gt;
&lt;li&gt;Health check grace period of 0 seconds means immediate failure on deploy&lt;/li&gt;
&lt;li&gt;7,279 tasks failed before anyone noticed because zero alarms were configured&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crew stores this as a &lt;strong&gt;lesson&lt;/strong&gt; in its Knowledge base. Next time it sees the same ECS task churn pattern (running count higher than desired, tasks being replaced every 60-90 seconds), it skips the full investigation and goes straight to: "Check if health check path exists in the container image. Check grace period setting."&lt;/p&gt;

&lt;p&gt;After 30 days of running, your SRE agent has seen every failure pattern your infrastructure produces. It doesn't just find issues faster. It finds them &lt;strong&gt;immediately&lt;/strong&gt; because it's seen them before.&lt;/p&gt;

&lt;p&gt;This is the compounding advantage. PagerDuty doesn't learn from past incidents. CloudWatch Alarms don't adapt their thresholds based on patterns. Your Crew agent does.&lt;/p&gt;




&lt;h2&gt;
  
  
  34 tools at your agent's fingertips
&lt;/h2&gt;

&lt;p&gt;When you connect DevOps Agent via MCP, your Crew agent gets access to these tools:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Investigation &amp;amp; Monitoring:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instant health check, cost analysis, architecture review, topology mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;investigate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deep async root-cause analysis across all monitored services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_investigation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start investigation with priority level (P1/P2/P3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_recommendations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get AI-generated mitigations with severity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_recommendation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed mitigation specification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_journal_records&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stream investigation findings in real-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;start_evaluation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Evaluate against operational goals (SLOs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_tasks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Track async investigation status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check if an investigation has completed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Release &amp;amp; Deployment Safety:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_release_readiness_review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Analyze PRs for production risk patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_release_testing_job&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run exploratory tests on deployed apps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Service &amp;amp; Space Management:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed service topology, dependencies, health&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_agent_spaces&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manage multiple monitoring environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_agent_space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Space configuration details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_agent_space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provision new monitoring environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update_agent_space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modify space settings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Access &amp;amp; Security:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_access_token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Issue new credentials programmatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_access_token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inspect token details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_access_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Audit all active tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;revoke_access_token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Revoke compromised credentials immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plus 14 more for full CRUD on spaces, associations, and configurations.&lt;/p&gt;

&lt;p&gt;Your agent picks the right tool based on context. Ask "is anything broken?" and it calls &lt;code&gt;chat&lt;/code&gt;. Say "investigate the payment API latency" and it calls &lt;code&gt;investigate&lt;/code&gt;. No routing logic. MCP handles tool selection.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cost considerations
&lt;/h2&gt;

&lt;p&gt;Running this autonomously has cost implications worth understanding:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Claude Sonnet 4 token usage per cron run (approximately $0.02 to $0.08 depending on investigation depth)&lt;/li&gt;
&lt;li&gt;48 runs per day at &lt;code&gt;*/30&lt;/code&gt; = roughly $1 to $4/day for continuous monitoring&lt;/li&gt;
&lt;li&gt;Compare with: a single on-call engineer costs $200+/night&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AWS DevOps Agent costs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Included with your Agent Space (no per-API-call charges for chat/investigate as of August 2026)&lt;/li&gt;
&lt;li&gt;The IAM role uses ReadOnlyAccess, so no resource creation costs from the agent itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What this SAVES:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4 days of ECS task churn burning compute (in my case: ~$15-20 wasted before I noticed)&lt;/li&gt;
&lt;li&gt;Engineer investigation time (30-60 min per incident at $100+/hr senior rate)&lt;/li&gt;
&lt;li&gt;Customer-facing downtime (the real cost nobody measures until it happens)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The math: $2/day for continuous monitoring vs $200+ per missed incident. After one catch, it pays for itself for months.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it yourself (complete walkthrough)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kiro Crew installed and running (&lt;a href="https://kiro.dev/docs/crew/installation/" rel="noopener noreferrer"&gt;install guide&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;AWS account with resources to monitor (at minimum: one Lambda function or ECS service)&lt;/li&gt;
&lt;li&gt;IAM permissions: &lt;code&gt;aidevops:*&lt;/code&gt; for Agent Space management&lt;/li&gt;
&lt;li&gt;AWS CLI v2 configured with credentials&lt;/li&gt;
&lt;li&gt;Region: us-east-1, us-west-2, or eu-west-1&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Create an Agent Space
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws devops-agent create-agent-space &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"production-monitoring"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Autonomous production health monitoring"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the &lt;code&gt;agentSpaceId&lt;/code&gt; from the output. You'll need it for every subsequent step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create an IAM role for DevOps Agent
&lt;/h3&gt;

&lt;p&gt;DevOps Agent needs a role to assume when accessing your account's resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create trust policy&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;' &amp;gt; devops-agent-trust.json
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "Service": "aidevops.amazonaws.com"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringEquals": {
        "aws:SourceAccount": "YOUR_ACCOUNT_ID"
      }
    }
  }]
}
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Create the role&lt;/span&gt;
aws iam create-role &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-name&lt;/span&gt; DevOpsAgentSourceRole &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--assume-role-policy-document&lt;/span&gt; file://devops-agent-trust.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Read-only access for AWS DevOps Agent monitoring"&lt;/span&gt;

&lt;span class="c"&gt;# Attach ReadOnlyAccess (observe everything, change nothing)&lt;/span&gt;
aws iam attach-role-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-name&lt;/span&gt; DevOpsAgentSourceRole &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::aws:policy/ReadOnlyAccess
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Use &lt;code&gt;ReadOnlyAccess&lt;/code&gt; not &lt;code&gt;AdministratorAccess&lt;/code&gt;. The agent needs to observe, not modify. Least privilege applies here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Associate your AWS account with the Agent Space
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws devops-agent associate-service &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agent-space-id&lt;/span&gt; YOUR_SPACE_ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--service-id&lt;/span&gt; aws &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--configuration&lt;/span&gt; &lt;span class="s1"&gt;'{
    "aws": {
      "assumableRoleArn": "arn:aws:iam::YOUR_ACCOUNT_ID:role/DevOpsAgentSourceRole",
      "accountId": "YOUR_ACCOUNT_ID",
      "accountType": "monitor"
    }
  }'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Enable access tokens on the Agent Space
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws devops-agent update-agent-space &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agent-space-id&lt;/span&gt; YOUR_SPACE_ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token-configuration&lt;/span&gt; &lt;span class="s1"&gt;'{"enabled": true}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Create an access token for Kiro Crew
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws devops-agent create-access-token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agent-space-id&lt;/span&gt; YOUR_SPACE_ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"kiro-crew-monitor"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--scope&lt;/span&gt; &lt;span class="s2"&gt;"operate"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--client-type&lt;/span&gt; &lt;span class="s2"&gt;"agent"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--expires-in-days&lt;/span&gt; 60 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the token value securely. You won't see it again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Add MCP server to Kiro Crew
&lt;/h3&gt;

&lt;p&gt;In your Crew dashboard: &lt;strong&gt;Agent Capabilities&lt;/strong&gt; &amp;gt; &lt;strong&gt;Integrations (MCP)&lt;/strong&gt; &amp;gt; &lt;strong&gt;Add&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;"aws-devops-agent"&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://connect.aidevops.us-east-1.api.aws/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&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;"X-Agent-Space-Id"&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_SPACE_ID"&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;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AWS DevOps Agent (34 tools)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"disabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;Or via the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kirocrew config mcp add aws-devops-agent &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s2"&gt;"https://connect.aidevops.us-east-1.api.aws/mcp"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"X-Agent-Space-Id=YOUR_SPACE_ID"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Add the production health cron job
&lt;/h3&gt;

&lt;p&gt;Go to &lt;strong&gt;Schedule&lt;/strong&gt; in the Crew dashboard, click &lt;strong&gt;+ Add Job&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&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;Name&lt;/td&gt;
&lt;td&gt;production-health-check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schedule&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*/30 * * * *&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent&lt;/td&gt;
&lt;td&gt;default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message&lt;/td&gt;
&lt;td&gt;Check production health via AWS DevOps Agent. Scan ECS, Lambda, CodeBuild, CodePipeline, and CloudWatch. Flag any issues found with severity and recommended fixes.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 8: Verify it works
&lt;/h3&gt;

&lt;p&gt;Trigger the cron manually by clicking &lt;strong&gt;Run&lt;/strong&gt; in the Schedule page. You should see the agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check available MCP tools&lt;/li&gt;
&lt;li&gt;Call DevOps Agent's chat tool for a health assessment&lt;/li&gt;
&lt;li&gt;Return findings with severity levels&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If it returns "Overall: HEALTHY" with no flags, your infrastructure is in good shape. If it finds issues, you'll get severity-prioritized recommendations.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;This is the setup I run daily. DevOps Agent handles observation and intelligence. Kiro Crew handles orchestration, memory, and action. Together: autonomous ops that get smarter every week.&lt;/p&gt;

&lt;p&gt;Articles 1 to 5 built the foundation. This one connects Crew to the real world, where production issues don't wait for business hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The full Kiro Crew series:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/aws-builders/introducing-kiro-crew-awss-open-source-ai-agent-orchestrator-1e63"&gt;Introducing Kiro Crew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/aws-builders/i-spent-a-day-with-kiro-crew-heres-what-it-actually-does-fk0"&gt;I Spent a Day With Kiro Crew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/aws-builders/how-kiro-crews-cron-jobs-replaced-4-hours-of-weekly-toil-37h"&gt;Cron Jobs Replaced 4 Hours of Weekly Toil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/aws-builders/i-showed-my-ciso-kiro-crew-heres-the-security-model-that-got-it-approved-423j"&gt;The Security Model That Got CISO Approval&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/aws-builders/i-built-a-custom-kiro-crew-app-in-5-minutes-the-app-kit-nobodys-talking-about"&gt;I Built a Custom App in 5 Minutes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This article&lt;/strong&gt;: Crew + DevOps Agent autonomous ops&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;GitHub repo with all configs:&lt;/strong&gt; &lt;a href="https://github.com/SimplyNadaf/kiro-crew-devops-agent" rel="noopener noreferrer"&gt;SimplyNadaf/kiro-crew-devops-agent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's eating your 3 AM pages? I'm betting DevOps Agent plus a cron job could handle half of them. Drop your scenario in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on AWS architecture, DevOps, and AI infrastructure:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@Sarvar-Nadaf" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="https://x.com/SarvarN_04" rel="noopener noreferrer"&gt;X&lt;/a&gt; | &lt;a href="https://builder.aws.com/community/@sarvar" rel="noopener noreferrer"&gt;AWS Builder Center&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>showdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>I Added Terminal Charts to My Dev.to CLI. Here's What My Data Looks Like.</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Fri, 21 Aug 2026 14:13:00 +0000</pubDate>
      <link>https://dev.to/sarvar_04/i-added-terminal-charts-to-my-devto-cli-heres-what-my-data-looks-like-250j</link>
      <guid>https://dev.to/sarvar_04/i-added-terminal-charts-to-my-devto-cli-heres-what-my-data-looks-like-250j</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;code&gt;pip install devpub==0.2.1&lt;/code&gt; → &lt;code&gt;devpub stats --graph&lt;/code&gt; → color-gradient bar charts, sparklines, trend arrows, and multi-period breakdowns for your Dev.to analytics. Zero new dependencies. &lt;a href="https://github.com/simplynadaf/devpub" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; / &lt;a href="https://github.com/simplynadaf/devpub/pull/10" rel="noopener noreferrer"&gt;PR #10&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;I check my Dev.to stats obsessively. Page views, reactions, which articles are climbing, which ones flatlined. But switching to the browser, clicking through dashboards, waiting for pages to load... it breaks my flow every single time.&lt;/p&gt;

&lt;p&gt;So I built charts directly into &lt;a href="https://github.com/simplynadaf/devpub" rel="noopener noreferrer"&gt;devpub&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;devpub&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.2.1
devpub stats &lt;span class="nt"&gt;--graph&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one command now gives me this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Views (last 30 days)  ↘ -18%

     871 ┤                 █
         │                ██ ▂██     █▂
     653 ┤                ██ ███▇ ▆  █▆
         │               ▃██▅████▁█▆ ███
     435 ┤·▃····▁········███████████·███▃ ← avg (451)
         │▄█    █▆▁    ▂ ███████████▄████
     217 ┤████▇██████▅███████████████████
         │███████████████████████████████
         └───────────────────────────────
          Jul 21      Aug 05      Aug 20

  trend: ▃▄▃▃▂▃▄▃▃▃▃▂▃▃▃▄▆█▄▆▆▇▆▄▆▄▃▇▆▅▄

  Total: 14.0K │ Avg: 451/day │ Peak: 871 ▲ Aug 07

  Period Breakdown

   7 days: ▅▆▅▄█▆▆▄                         ↗ +9%   Total: 3.8K
  14 days: █▄▆▆▇▆▄▆▄▃▇▆▅▄                  ↘ -18%   Total: 8.5K
  21 days: ▃▂▃▃▃▄▆█▄▆▆▇▆▄▆▄▃▇▆▅▄           ↘ -18%   Total: 10.9K
  30 days: ▄▃▃▂▃▄▃▃▃▃▂▃▃▃▄▆█▄▆▆▇▆▄▆▄▃▇▆▅▄  ↘ -18%   Total: 13.7K
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's real data from my account. 257K total views, 24K followers, rendered in 0.3 seconds. No browser needed.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ZjexRNOdO4Y" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What changed in v0.2&lt;/li&gt;
&lt;li&gt;The color gradient system&lt;/li&gt;
&lt;li&gt;Multi-period sparklines&lt;/li&gt;
&lt;li&gt;The average line&lt;/li&gt;
&lt;li&gt;How I built it (zero new dependencies)&lt;/li&gt;
&lt;li&gt;Try it yourself&lt;/li&gt;
&lt;li&gt;What's next&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What changed in v0.2
&lt;/h2&gt;

&lt;p&gt;Version 0.1 had &lt;code&gt;--graph&lt;/code&gt; as a flag that did nothing. I shipped the flag first, then built the feature. Classic.&lt;/p&gt;

&lt;p&gt;Version 0.2.1 makes it real:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&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;Color gradient bars&lt;/td&gt;
&lt;td&gt;Bars fade blue (low) → cyan → green → gold (peak)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sparkline one-liner&lt;/td&gt;
&lt;td&gt;Compact 30-character trend below the chart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trend indicator&lt;/td&gt;
&lt;td&gt;Arrow + percentage comparing recent vs previous period&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average line&lt;/td&gt;
&lt;td&gt;Dotted line across chart showing mean, with label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak marker&lt;/td&gt;
&lt;td&gt;Gold highlight with date in the summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Box-drawing axes&lt;/td&gt;
&lt;td&gt;Clean tick marks using Unicode characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12-row height&lt;/td&gt;
&lt;td&gt;More vertical resolution than before&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-period breakdown&lt;/td&gt;
&lt;td&gt;7d, 14d, 21d, 30d sparklines with individual trends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Period flag&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;-p 7d&lt;/code&gt;, &lt;code&gt;-p 90d&lt;/code&gt;, &lt;code&gt;-p 3m&lt;/code&gt; for any timeframe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All of this renders in the terminal. No image generation. No external services. No new dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  The color gradient system
&lt;/h2&gt;

&lt;p&gt;Most terminal charts use one color. Cyan. Green. Whatever. Every bar looks the same regardless of value.&lt;/p&gt;

&lt;p&gt;I wanted the peak to visually pop. So bars shift color based on their height relative to the maximum:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value range&lt;/th&gt;
&lt;th&gt;Color&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0–25%&lt;/td&gt;
&lt;td&gt;Blue&lt;/td&gt;
&lt;td&gt;Low days, weekends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25–50%&lt;/td&gt;
&lt;td&gt;Cyan&lt;/td&gt;
&lt;td&gt;Below average&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50–75%&lt;/td&gt;
&lt;td&gt;Green&lt;/td&gt;
&lt;td&gt;Good days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75–95%&lt;/td&gt;
&lt;td&gt;Lime&lt;/td&gt;
&lt;td&gt;Great days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95–100%&lt;/td&gt;
&lt;td&gt;Gold&lt;/td&gt;
&lt;td&gt;Peak day&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The implementation is simple. One function that maps a 0–1 ratio to an RGB color string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_value_to_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rgb(50,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;,220)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rgb(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;,200,200)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rgb(0,210,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rgb(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;,220,50)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rgb(255,200,0)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rich handles the RGB rendering. Works in any modern terminal that supports 24-bit color (iTerm2, Windows Terminal, Ghostty, Kitty, Alacritty, WezTerm).&lt;/p&gt;




&lt;h2&gt;
  
  
  Multi-period sparklines
&lt;/h2&gt;

&lt;p&gt;This is my favorite addition. After the main chart, you get a breakdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Period Breakdown

   7 days: ▅▆▅▄█▆▆▄                         ↗ +9%   Total: 3.8K
  14 days: █▄▆▆▇▆▄▆▄▃▇▆▅▄                  ↘ -18%   Total: 8.5K
  21 days: ▃▂▃▃▃▄▆█▄▆▆▇▆▄▆▄▃▇▆▅▄           ↘ -18%   Total: 10.9K
  30 days: ▄▃▃▂▃▄▃▃▃▃▂▃▃▃▄▆█▄▆▆▇▆▄▆▄▃▇▆▅▄  ↘ -18%   Total: 13.7K
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this matters: the 30-day trend might be down, but the 7-day trend tells you if you're recovering. In my case, overall traffic dropped 18% (I didn't publish for a week), but the last 7 days show +9% (new articles bringing it back).&lt;/p&gt;

&lt;p&gt;Without multi-period comparison, you'd just see "down 18%" and feel bad. With it, you see the recovery in progress.&lt;/p&gt;

&lt;p&gt;The sparkline characters (&lt;code&gt;▁▂▃▄▅▆▇█&lt;/code&gt;) give you 8 levels of resolution per character. A 30-character sparkline shows 30 days of data in a single line. Your eye can instantly spot patterns: weekday/weekend cycles, post-publish spikes, gradual decay.&lt;/p&gt;




&lt;h2&gt;
  
  
  The average line
&lt;/h2&gt;

&lt;p&gt;One detail that took surprisingly long to get right: the dotted average line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     435 ┤·▃····▁········███████████·███▃ ← avg (451)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs across the chart at the mean value height. Bars above it are above average. Bars below are below. The &lt;code&gt;←&lt;/code&gt; label tells you the exact number.&lt;/p&gt;

&lt;p&gt;Why it matters: without it, you're guessing whether a day was "good" or "bad." The line gives you an instant reference. Tuesday's 500 views looks small next to Monday's 871 peak, but the average line shows it's actually above average.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I built it (zero new dependencies)
&lt;/h2&gt;

&lt;p&gt;The entire chart system uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rich&lt;/strong&gt; (already a dependency) for colored output and &lt;code&gt;console.print&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python stdlib&lt;/strong&gt; for math, datetime, and string operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unicode block characters&lt;/strong&gt; (&lt;code&gt;▁▂▃▄▅▆▇█&lt;/code&gt;) for sub-character resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No matplotlib. No plotext. No termgraph. No asciichart. I looked at all of them. They either add heavy dependencies, produce output that doesn't integrate with Rich's markup system, or require complex setup.&lt;/p&gt;

&lt;p&gt;Pure Python + Rich gives me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full control over every character&lt;/li&gt;
&lt;li&gt;Rich markup (&lt;code&gt;[bold]&lt;/code&gt;, &lt;code&gt;[rgb(r,g,b)]&lt;/code&gt;) works inline&lt;/li&gt;
&lt;li&gt;Zero import time penalty&lt;/li&gt;
&lt;li&gt;41 tests covering all helper functions&lt;/li&gt;
&lt;li&gt;Works on Python 3.10+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole implementation is ~200 lines in one file. No architecture astronautics needed.&lt;/p&gt;

&lt;p&gt;Full implementation: &lt;a href="https://github.com/simplynadaf/devpub/pull/10" rel="noopener noreferrer"&gt;PR #10&lt;/a&gt; — 41 tests, lint clean, handles edge cases (zero data, single day, large accounts with 90+ days).&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;devpub&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.2.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set your Dev.to API key (get it at &lt;a href="https://dev.to/settings/extensions"&gt;dev.to/settings/extensions&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DEVPUB_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devpub stats &lt;span class="nt"&gt;--graph&lt;/span&gt;              &lt;span class="c"&gt;# 30-day chart (default)&lt;/span&gt;
devpub stats &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 7d        &lt;span class="c"&gt;# Last 7 days&lt;/span&gt;
devpub stats &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 90d       &lt;span class="c"&gt;# Last 90 days (auto-downsamples)&lt;/span&gt;
devpub stats &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 2w        &lt;span class="c"&gt;# Last 2 weeks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⭐ &lt;a href="https://github.com/simplynadaf/devpub" rel="noopener noreferrer"&gt;Star the repo&lt;/a&gt; if terminal analytics resonates with you.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;v0.3 will add the &lt;strong&gt;Concepts API&lt;/strong&gt; integration. Dev.to has an ML-powered topic classification system that most people don't know exists. It classifies articles into semantic concepts with daily metrics. &lt;code&gt;devpub concepts&lt;/code&gt; will let you discover trending topics, find gaps in coverage, and see which concepts your articles fit into.&lt;/p&gt;

&lt;p&gt;But that's next week. For now, try &lt;code&gt;devpub stats --graph&lt;/code&gt; and tell me what your chart looks like.&lt;/p&gt;




&lt;p&gt;What's your Dev.to stats workflow right now? Browser dashboard? Ignoring it entirely? Something else? Drop it in the comments — I'm curious how other writers track their content performance.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is part 2 of the "Building DevPub in Public" series. &lt;a href="https://dev.to/sarvar_04/introducing-devpub-open-source-devto-cli-tool-49jf"&gt;Part 1: Introducing DevPub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;Sarvar Nadaf&lt;/a&gt; | Cloud Architect | Cloud, AI Infrastructure &amp;amp; DevOps&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Follow me: &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://github.com/simplynadaf" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.youtube.com/@TechwithSarvar" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="https://linkedin.com/in/sarvarnadaf" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://x.com/SarvarN_04" rel="noopener noreferrer"&gt;X&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devto</category>
      <category>showdev</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Built a Kiro Crew App in 5 Minutes - Full Tutorial With Code</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Tue, 18 Aug 2026 12:05:57 +0000</pubDate>
      <link>https://dev.to/aws-builders/how-i-built-a-kiro-crew-app-in-5-minutes-full-tutorial-with-code-3el0</link>
      <guid>https://dev.to/aws-builders/how-i-built-a-kiro-crew-app-in-5-minutes-full-tutorial-with-code-3el0</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/-TkMTNAKcAY" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;Parts 1-4 showed you what Kiro Crew can do. Investigate incidents. Automate weekly toil. Block dangerous commands. All using the built-in agent.&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws-builders/introducing-kiro-crew-awss-open-source-ai-agent-orchestrator-1e63" class="crayons-story__hidden-navigation-link"&gt;Introducing Kiro Crew: AWS's Open-Source AI Agent Orchestrator&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/aws-builders/introducing-kiro-crew-awss-open-source-ai-agent-orchestrator-1e63" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Solves persistent cross-session memory limits&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws-builders"&gt;
            &lt;img alt="AWS Community Builders  logo" 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%2Forganization%2Fprofile_image%2F2794%2F88da75b6-aadd-4ea1-8083-ae2dfca8be94.png" class="crayons-logo__image" width="350" height="350"&gt;
          &lt;/a&gt;

          &lt;a href="/sarvar_04" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2Fuser%2Fprofile_image%2F1163149%2F5afa2902-591e-4944-b6fa-9bbba80c6e95.png" alt="sarvar_04 profile" class="crayons-avatar__image" width="800" height="559"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sarvar_04" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sarvar Nadaf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sarvar Nadaf
                
                
              
              &lt;div id="story-author-preview-content-4323052" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sarvar_04" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F1163149%2F5afa2902-591e-4944-b6fa-9bbba80c6e95.png" class="crayons-avatar__image" alt="" width="800" height="559"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sarvar Nadaf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws-builders" class="crayons-story__secondary fw-medium"&gt;AWS Community Builders &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws-builders/introducing-kiro-crew-awss-open-source-ai-agent-orchestrator-1e63" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 5&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws-builders/introducing-kiro-crew-awss-open-source-ai-agent-orchestrator-1e63" id="article-link-4323052"&gt;
          Introducing Kiro Crew: AWS's Open-Source AI Agent Orchestrator
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agents&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aws-builders/introducing-kiro-crew-awss-open-source-ai-agent-orchestrator-1e63" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;40&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aws-builders/introducing-kiro-crew-awss-open-source-ai-agent-orchestrator-1e63#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              34&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            12 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws-builders/how-kiro-crews-cron-jobs-replaced-4-hours-of-weekly-toil-37h" class="crayons-story__hidden-navigation-link"&gt;How Kiro Crew's Cron Jobs Replaced 4 Hours of Weekly Toil&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/aws-builders/how-kiro-crews-cron-jobs-replaced-4-hours-of-weekly-toil-37h" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Unsupervised agents cost $2.10 weekly&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws-builders"&gt;
            &lt;img alt="AWS Community Builders  logo" 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%2Forganization%2Fprofile_image%2F2794%2F88da75b6-aadd-4ea1-8083-ae2dfca8be94.png" class="crayons-logo__image" width="350" height="350"&gt;
          &lt;/a&gt;

          &lt;a href="/sarvar_04" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2Fuser%2Fprofile_image%2F1163149%2F5afa2902-591e-4944-b6fa-9bbba80c6e95.png" alt="sarvar_04 profile" class="crayons-avatar__image" width="800" height="559"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sarvar_04" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sarvar Nadaf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sarvar Nadaf
                
                
              
              &lt;div id="story-author-preview-content-4341137" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sarvar_04" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F1163149%2F5afa2902-591e-4944-b6fa-9bbba80c6e95.png" class="crayons-avatar__image" alt="" width="800" height="559"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sarvar Nadaf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws-builders" class="crayons-story__secondary fw-medium"&gt;AWS Community Builders &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws-builders/how-kiro-crews-cron-jobs-replaced-4-hours-of-weekly-toil-37h" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 7&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws-builders/how-kiro-crews-cron-jobs-replaced-4-hours-of-weekly-toil-37h" id="article-link-4341137"&gt;
          How Kiro Crew's Cron Jobs Replaced 4 Hours of Weekly Toil
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agents&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aws-builders/how-kiro-crews-cron-jobs-replaced-4-hours-of-weekly-toil-37h" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;17&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aws-builders/how-kiro-crews-cron-jobs-replaced-4-hours-of-weekly-toil-37h#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              5&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;But here's what nobody's talking about: Kiro Crew has an App Store. And you can build your own apps for it. In five minutes.&lt;/p&gt;

&lt;p&gt;Not plugins. Not scripts. Full apps with their own agents, skills, cron jobs, and dashboard pages. Package them. Publish them. Other users install with one click.&lt;/p&gt;

&lt;p&gt;I built one. A Daily Standup Bot. It reads my git commits every morning and generates standup notes so I never have to write "worked on X" again. Let me show you how.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What the App Kit actually is&lt;/li&gt;
&lt;li&gt;What we're building&lt;/li&gt;
&lt;li&gt;Step 1: The manifest (app.json)&lt;/li&gt;
&lt;li&gt;Step 2: The agent&lt;/li&gt;
&lt;li&gt;Step 3: The skill&lt;/li&gt;
&lt;li&gt;Step 4: The dashboard page&lt;/li&gt;
&lt;li&gt;Step 5: The cron job&lt;/li&gt;
&lt;li&gt;Install and run&lt;/li&gt;
&lt;li&gt;What it looks like live&lt;/li&gt;
&lt;li&gt;Publishing to the App Store&lt;/li&gt;
&lt;li&gt;What else you could build&lt;/li&gt;
&lt;li&gt;Try it yourself&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What the App Kit actually is
&lt;/h2&gt;

&lt;p&gt;An app is a package that contributes any combination of:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&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;&lt;strong&gt;Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom AI agent with its own model, prompt, and tool access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;On-demand knowledge files that teach the agent specific capabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP servers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;New tools the LLM can call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cron jobs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scheduled tasks the app owns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UI pages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom pages in the dashboard sidebar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend processes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP servers reverse-proxied through the gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An app that only ships a skill is one markdown file. An app that ships everything is a full project. You decide the scope.&lt;/p&gt;

&lt;p&gt;The key difference from "just adding a skill": apps are installable, versioned, publishable, and isolated. Crew manages their lifecycle. Users install from the App Store with one click.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we're building
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Daily Standup Bot&lt;/strong&gt; that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads git commits from the last 24 hours&lt;/li&gt;
&lt;li&gt;Formats them as "What I Did / What's Blocked / What's Next"&lt;/li&gt;
&lt;li&gt;Runs every weekday at 9 AM automatically&lt;/li&gt;
&lt;li&gt;Shows standup history in a custom dashboard page&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Five files. Five minutes. A real app you'd actually use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;standup-bot/
├── app.json                    ← manifest (identity + resources)
├── agents/
│   └── standup-agent.json      ← agent definition
├── skills/
│   └── standup-format/
│       └── SKILL.md            ← formatting rules
└── ui/
    └── src/App.tsx             ← dashboard page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1: The manifest (app.json)
&lt;/h2&gt;

&lt;p&gt;Every app needs one file: &lt;code&gt;app.json&lt;/code&gt;. This is the single source of truth.&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;"standup-bot"&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;"displayName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Daily Standup Bot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Auto-generates standup notes from git commits."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sarvar_04"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agents"&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;"agents/standup-agent.json"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skills"&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;"skills/standup-format"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ui"&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;"entry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.mjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pages"&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;"route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/apps/standup-bot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Standups"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"icon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ClipboardList"&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="nl"&gt;"crons"&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;"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;"morning-standup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cron_expr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0 9 * * 1-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Generate today's standup summary from yesterday's git activity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"standup-agent"&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;That's agents, skills, a dashboard page, and a cron job. All declared in one file. Crew reads this and wires everything up.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2: The agent
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;agents/standup-agent.json&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;"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;"standup-agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Generates standup summaries from git activity"&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;"You are a standup summary assistant. Analyze git commits from the last 24 hours and generate concise standup notes. Format: What I Did, What's Blocked, What's Next."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tools"&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;"@kirocrew-core"&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;Eight lines. The &lt;code&gt;@kirocrew-core&lt;/code&gt; tool reference gives it access to spawn processes, read files, and interact with the system. The &lt;code&gt;model: "auto"&lt;/code&gt; lets Crew pick the best available model.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: The skill
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;skills/standup-format/SKILL.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;standup-format&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;How to format daily standup updates&lt;/span&gt;
&lt;span class="na"&gt;triggers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;standup&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;daily&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;morning&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;always&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Standup Format&lt;/span&gt;

When generating standup notes:
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**What I did**&lt;/span&gt; - List completed work from git commits (group by feature/fix)
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**What's blocked**&lt;/span&gt; - Identify stale PRs, failing CI, unresolved issues
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**What's next**&lt;/span&gt; - Infer from branch names and open issues

Rules:
&lt;span class="p"&gt;-&lt;/span&gt; One line per bullet
&lt;span class="p"&gt;-&lt;/span&gt; Past tense for "did", present for "blocked", future for "next"
&lt;span class="p"&gt;-&lt;/span&gt; Group related commits into one bullet
&lt;span class="p"&gt;-&lt;/span&gt; Skip merge commits and dependency bumps
&lt;span class="p"&gt;-&lt;/span&gt; Flag anything unmerged for &amp;gt;24 hours
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Skills are markdown. They load on-demand when trigger words appear in the conversation. No code. No compilation. Just knowledge the agent uses when relevant.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: The dashboard page
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ui/src/App.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useAppApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useAppEvents&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@kirocrew/app-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CardTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PageHeader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;StatCard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Badge&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@kirocrew/app-sdk/ui&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;StandupDashboard&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;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useAppApi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;standups&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setStandups&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/apps/standup-bot/history&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setStandups&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PageHeader&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Daily Standups"&lt;/span&gt; &lt;span class="na"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Auto-generated from git activity"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 pb-8"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid gap-3.5 grid-cols-4 mb-6"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StatCard&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Today"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Pending"&lt;/span&gt; &lt;span class="na"&gt;accent&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StatCard&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"This Week"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&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;standups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; standups`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StatCard&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Total Commits"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StatCard&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Next Run"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Mon 9:00 AM"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You don't &lt;code&gt;npm install @kirocrew/app-sdk&lt;/code&gt;. The dashboard provides it at runtime. Your app stays tiny. Build with Vite, mark Crew's SDK as external, output a single &lt;code&gt;.mjs&lt;/code&gt; file.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 5: The cron job
&lt;/h2&gt;

&lt;p&gt;Already declared in &lt;code&gt;app.json&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="nl"&gt;"crons"&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;"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;"morning-standup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cron_expr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0 9 * * 1-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Generate today's standup summary from yesterday's git activity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"standup-agent"&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;Crew registers the cron on enable. Deregisters on disable. Every weekday at 9 AM, it spawns a session, runs the message through &lt;code&gt;standup-agent&lt;/code&gt;, and stores the result. No daemon. No systemd timer. Just a line in your manifest.&lt;/p&gt;


&lt;h2&gt;
  
  
  Install and run
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get your auth token&lt;/span&gt;
&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;kirocrew token | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oP&lt;/span&gt; &lt;span class="s1"&gt;'token=\K[^&amp;amp;]+'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Install (one command - point to your app directory)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:5476/api/apps/install?token=&lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"source": "./standup-bot"}'&lt;/span&gt; | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool

&lt;span class="c"&gt;# Enable - agents, skills, crons all activate&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:5476/api/apps/standup-bot/enable?token=&lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Response:&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;"ok"&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;"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;"standup-bot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"enabled standup-bot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"registration"&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;"agents"&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;"standup-bot/standup-agent"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"skills"&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;"standup-bot/standup-format"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"crons"&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;"standup-bot/morning-standup"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"mcp_servers"&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;"errors"&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="nl"&gt;"hooks"&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;"crons_registered"&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;"standup-bot/morning-standup"&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;Agent registered. Skill loaded. Cron scheduled. Dashboard page live.&lt;/p&gt;

&lt;p&gt;Refresh the dashboard. "Standups" is now in your sidebar. That's it.&lt;/p&gt;


&lt;h2&gt;
  
  
  What it looks like live
&lt;/h2&gt;

&lt;p&gt;After installation, "Standups" appears in the sidebar. The dashboard shows stat cards and an empty state waiting for the first standup.&lt;/p&gt;

&lt;p&gt;Trigger it manually in a chat session:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the standup-agent to generate today's standup from ~/projects/payment-api.
Run git log, analyze every commit, group by feature area.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent runs &lt;code&gt;git log --since="24 hours ago" --oneline --no-merges&lt;/code&gt;, analyzes each commit, and produces:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Did:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Payment Processing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implemented rate limiting middleware for /api/payments (max 100 req/min per API key)&lt;/li&gt;
&lt;li&gt;Fixed currency conversion rounding bug - was truncating before conversion&lt;/li&gt;
&lt;li&gt;Added retry logic for failed Stripe webhook deliveries (exponential backoff, max 5)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;API &amp;amp; Docs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updated OpenAPI spec with new error codes (429, 503, 504)&lt;/li&gt;
&lt;li&gt;Added request validation for multi-currency checkout (USD, EUR, GBP, JPY)&lt;/li&gt;
&lt;li&gt;Refactored payment intent creation to use idempotency keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configured DynamoDB TTL for expired sessions (7-day retention)&lt;/li&gt;
&lt;li&gt;Added CloudWatch alarms for payment failure rate &amp;gt; 5%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's Blocked:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PCI compliance security review - waiting on AppSec team (2 days)&lt;/li&gt;
&lt;li&gt;Stripe Connect onboarding - blocked on legal approval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's Next:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription billing with usage-based metering&lt;/li&gt;
&lt;li&gt;Payment analytics dashboard (revenue, failure rates, top merchants)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;11 commits analyzed. 9 seconds. Navigate to the Standups page - it's already there.&lt;/p&gt;


&lt;h2&gt;
  
  
  Publishing to the App Store
&lt;/h2&gt;

&lt;p&gt;The App Store is a curated registry. Publishing means opening a PR:&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;In&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;app-registry.json:&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;"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;"standup-bot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gitUrl"&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://github.com/simplynadaf/kiro-crew-standup-bot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"branch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&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;Once merged, your app shows up in Explore → Library for all Crew users. Search "standup" and there it is:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Daily Standup Bot
v1.0.0 · Enabled · Registry

Auto-generates standup notes from git commits. Runs daily at 9 AM Mon-Fri.

sarvar_04
1 agent · 1 skill · 1 cron · 1 page

[Open]  [Disable]  [Sync]  [Uninstall]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Your app sits alongside the built-in ones - Code Review Sage, Research Lab, Task Runner. First-class citizen. Teams can also host private registries for internal apps that shouldn't be public.&lt;/p&gt;


&lt;h2&gt;
  
  
  What else you could build
&lt;/h2&gt;

&lt;p&gt;The standup bot took 5 files and 5 minutes. Here's what's possible with the same pattern:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App idea&lt;/th&gt;
&lt;th&gt;Components&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PR Review Bot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent + skill (code review rules) + cron (check PRs hourly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Incident Postmortem Generator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent + skill (postmortem template) + UI (history page)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost Anomaly Alerter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent + cron (daily AWS cost check) + Slack notification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Onboarding Buddy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent + skill (team knowledge) + UI (progress tracker)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sprint Health Monitor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent + cron (daily Jira check) + UI (burndown chart)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Any workflow that's "check something + format it + deliver it on schedule" is a Crew app waiting to happen.&lt;/p&gt;


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

&lt;p&gt;Kiro Crew is open source (Apache 2.0). The standup-bot code is in this article.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Crew&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.crew.kiro.dev/cli.sh | sh
kirocrew gateway

&lt;span class="c"&gt;# Enable third-party apps&lt;/span&gt;
&lt;span class="c"&gt;# In ~/.kiro/crew/config.json set: "apps_allow_third_party": true&lt;/span&gt;

&lt;span class="c"&gt;# Create the app&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; standup-bot/agents standup-bot/skills/standup-format standup-bot/ui/src
&lt;span class="c"&gt;# Create the 5 files shown above (app.json, agent, skill, UI, vite config)&lt;/span&gt;

&lt;span class="c"&gt;# Build UI&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;standup-bot/ui &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="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ../..

&lt;span class="c"&gt;# Install + enable&lt;/span&gt;
&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;kirocrew token | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oP&lt;/span&gt; &lt;span class="s1"&gt;'token=\K[^&amp;amp;]+'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:5476/api/apps/install?token=&lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"source": "./standup-bot"}'&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:5476/api/apps/standup-bot/enable?token=&lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Open dashboard - "Standups" is in the sidebar&lt;/span&gt;
kirocrew open
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The full app code and docs: &lt;a href="https://kiro.dev/docs/crew/apps/build-first-app/" rel="noopener noreferrer"&gt;Build your first app&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/simplynadaf" rel="noopener noreferrer"&gt;
        simplynadaf
      &lt;/a&gt; / &lt;a href="https://github.com/simplynadaf/kiro-crew-standup-bot" rel="noopener noreferrer"&gt;
        kiro-crew-standup-bot
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Daily Standup Bot — A Kiro Crew app that reads git commits and generates standup notes. Agent + Skill + Cron + Dashboard in 5 files.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🤖 Daily Standup Bot&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;A Kiro Crew App That Writes Your Standups For You&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/21d56f0f4794eb9ee0dbba3bef3d790be4116f4e1b609b3010a7126463b6ddb0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4b69726f5f437265772d4170705f4b69742d3633363666313f7374796c653d666f722d7468652d6261646765266c6f676f3d646174613a696d6167652f7376672b786d6c3b6261736536342c50484e325a79423462577875637a30696148523063446f764c336433647935334d793576636d63764d6a41774d43397a646d6369494864705a48526f505349794e434967614756705a326830505349794e434967646d6c6c64304a76654430694d43417749444930494449304969426d6157787350534a3361476c305a53492b50484268644767675a4430695454457949444a4d4d794133646a457762446b674e5341354c5456574e3277744f53303165694976506a777663335a6e50673d3d" alt="Kiro Crew"&gt;&lt;/a&gt;
&lt;a href="https://github.com/simplynadaf/kiro-crew-standup-bot/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7a1226d14a365d288bfe51ece915ee0c7e754a16faa51ff06436504de29b33b4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e7376673f7374796c653d666f722d7468652d6261646765" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href=""&gt;&lt;img src="https://camo.githubusercontent.com/17408e0296af2c9c306e9fcf68d55ea3b5132cdfa4212e6f591f86a5ffe21e45/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f355f46696c65732d355f4d696e757465732d3130623938313f7374796c653d666f722d7468652d6261646765" alt="5 Files"&gt;&lt;/a&gt;
&lt;a href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/11fb7521b21216752475202a7bff7c5946f98f825b09d9dadeeab0db6868aa4c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f70656e5f536f757263652d4170616368655f322e302d6666366236623f7374796c653d666f722d7468652d6261646765" alt="Open Source"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;5 files. 5 minutes. Never write "worked on X" again.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An AI agent that reads your git commits every morning and generates formatted standup notes - installed with one command on &lt;a href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;Kiro Crew&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/-TkMTNAKcAY" rel="nofollow noopener noreferrer"&gt;📺 Watch the Demo&lt;/a&gt; · &lt;a href="https://github.com/simplynadaf/kiro-crew-standup-bot#-quick-start" rel="noopener noreferrer"&gt;🚀 Quick Start&lt;/a&gt; · &lt;a href="https://github.com/simplynadaf/kiro-crew-standup-bot#-app-structure" rel="noopener noreferrer"&gt;📦 App Structure&lt;/a&gt; · &lt;a href="https://dev.to/sarvar_04/i-built-a-custom-kiro-crew-app-in-5-minutes-the-app-kit-nobodys-talking-about" rel="nofollow"&gt;📝 Article&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&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;🤖 &lt;strong&gt;Agent&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Reads git commits from the last 24 hours, groups by feature area&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📚 &lt;strong&gt;Skill&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Teaches the agent the standup format (What I Did / Blocked / Next)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⏰ &lt;strong&gt;Cron&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Runs every weekday at 9 AM automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📊 &lt;strong&gt;Dashboard&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Shows standup history, stats, and today's summary in the sidebar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎬 Demo&lt;/h2&gt;

&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="https://youtu.be/-TkMTNAKcAY" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsimplynadaf%2Fkiro-crew-standup-bot%2FHEAD%2Fassets%2Fthumbnail.png" alt="Watch the Demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Agent analyzes 11 commits → generates standup in 9 seconds → dashboard updates live&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Quick Start&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Prerequisites: Kiro Crew running&lt;/span&gt;
curl -fsSL https://download.crew.kiro.dev/cli.sh &lt;span class="pl-k"&gt;|&lt;/span&gt; sh
kirocrew gateway
&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/simplynadaf/kiro-crew-standup-bot" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kirodotdev" rel="noopener noreferrer"&gt;
        kirodotdev
      &lt;/a&gt; / &lt;a href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;
        KiroCrew
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A persistent workspace for development work that self-improves and continues beyond one session.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/kirodotdev/KiroCrew/assets/banner.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkirodotdev%2FKiroCrew%2FHEAD%2Fassets%2Fbanner.svg" alt="Kiro Crew. Keep work moving. Runs on your hardware, remembers across sessions, keeps working unattended."&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kiro Crew&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;strong&gt;A persistent workspace for development work that self-improves and continues beyond one session.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://trendshift.io/repositories/103032" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/20d26869a6389d7fba902f5cddb75d8268977b531845622481a8d57020feaa3c/68747470733a2f2f7472656e6473686966742e696f2f6170692f62616467652f7472656e6473686966742f7265706f7369746f726965732f3130333033322f6461696c793f6c616e67756167653d507974686f6e" alt="Kiro Crew on Trendshift" width="250" height="55" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  Kiro Crew is an open source development workspace that runs locally or remotely on
  your hardware. It is persistent, self-learning, and self-evolving. Work with it
  from the desktop app, web dashboard, and CLI, or continue the same work through
  connection tools like Slack and Discord
  Your multi-step tasks can run unattended, recurring jobs run on your schedule
  and heartbeats monitor systems until something needs attention. Kiro Crew Apps
  tailor that experience to a specific job, combining a purpose-built interface
  with agents, skills, schedules, integrations, and backend services.
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5c0b3bb65162f179a15d74b8289d29497db6c407a34891f009b5503bb600f86c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f776e6c6f61642d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3266366665623f7374796c653d666c61742d737175617265" alt="Download Kiro Crew for macOS, Linux, or Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/852641c2b061138b6ee4a6d24baf3d7935ce1e3cc9f7a6b55ceedab8e7183191/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f63756d656e746174696f6e2d3166366665623f7374796c653d666c61742d737175617265" alt="Read the documentation"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/guides/install.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/033bc31482c8749b864e135c691a7d174ab4677bceb1df2f704e9043fb29d146/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f496e7374616c6c25323067756964652d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3665373738313f7374796c653d666c61742d737175617265" alt="Install guide for macOS, Linux, and Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0fb57fc16e5b1e9b219f905ec9baf71c552ec6d747e3ea9aa1a19fa1cb7e1f55/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e747269627574696e672d3233383633363f7374796c653d666c61742d737175617265" alt="Contributing guide"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/SECURITY.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dc4e9a0d3d8d49543683714c015505dd8378557c539253626f8f920f515a9beb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53656375726974792d3832353064663f7374796c653d666c61742d737175617265" alt="Security policy"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a84955b84a279eafcaeb1508bf99c1ad0929e84623fb47466c6cf875c436e866/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d417061636865253230322e302d3635366437363f7374796c653d666c61742d737175617265" alt="Apache 2.0 license"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#build-from-source" rel="noopener noreferrer"&gt;Build from source&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#why-kiro-crew" rel="noopener noreferrer"&gt;Why Kiro Crew&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#what-kiro-crew-does" rel="noopener noreferrer"&gt;Capabilities&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#security-and-control" rel="noopener noreferrer"&gt;Security&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#install-configure-and-operate" rel="noopener noreferrer"&gt;Install&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#anonymous-usage-telemetry" rel="noopener noreferrer"&gt;Telemetry&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#docs-and-contributing" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;You choose how to run Kiro Crew: the desktop app with automatic updates, a
one-line install on your machine or a remote…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Part 6 will show the multi-interface story. Start a task on CLI. Continue it on Slack. Check progress on the dashboard. Get notified on your phone. Same agent, same memory, zero context loss.&lt;/p&gt;

&lt;p&gt;The App Kit is what turns Kiro Crew from "my AI coding assistant" into "my team's AI platform." The store is empty right now. First movers win.&lt;/p&gt;

&lt;p&gt;What would you build? A PR reviewer? A docs-from-code generator? An automated changelog? Drop it in the comments. If it's interesting enough, I'll build it in Part 7.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on AWS architecture, DevOps, and AI Infrastructure:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@TechwithSarvar" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="mailto:simplynadaf@gmail.com"&gt;Email&lt;/a&gt; | &lt;a href="https://builder.aws.com/community/@sarvar" rel="noopener noreferrer"&gt;AWS Builder Center&lt;/a&gt; | &lt;a href="https://x.com/SarvarN_04" rel="noopener noreferrer"&gt;X&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>59% of Dogs Are Obese and Their Owners Don't Know. So I Built an AI That Tells Them.</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Fri, 14 Aug 2026 18:36:28 +0000</pubDate>
      <link>https://dev.to/sarvar_04/59-of-dogs-are-obese-and-their-owners-dont-know-so-i-built-an-ai-that-tells-them-2a89</link>
      <guid>https://dev.to/sarvar_04/59-of-dogs-are-obese-and-their-owners-dont-know-so-i-built-an-ai-that-tells-them-2a89</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-08-13"&gt;Weekend Challenge: Dog Days Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Three months after adopting my rescue, I noticed he was sleeping more and eating slower. I thought he was "settling in." Six months later, the vet told me he had Stage 3 arthritis. Completely treatable if caught early.&lt;/p&gt;

&lt;p&gt;I'm not alone. 60% of serious health issues in dogs are discovered after symptoms become severe. Owners spend $653 on average at emergency vets for things that were either totally normal or should have been caught weeks earlier. And 59% of dogs in the US are overweight without their owners realizing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PawWise&lt;/strong&gt; is an AI vet friend that gives dog owners what they actually need: instant clarity.&lt;/p&gt;

&lt;p&gt;Upload a photo of your dog and get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Health Check&lt;/strong&gt;: Body condition score, coat health, posture analysis, breed-specific risks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavior Decoder&lt;/strong&gt;: "Why is my dog doing this?" with breed context and training steps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emergency Triage&lt;/strong&gt;: Is this an emergency? Green/Yellow/Orange/Red urgency with first aid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dog Court&lt;/strong&gt; (fun mode): Your healthy dog committed a crime? AI generates a voice-acted courtroom drama&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The serious modes solve real problems. The fun mode gives you something to share when everything is fine.&lt;/p&gt;




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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/vqyF_65Qc_s" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://simplynadaf.github.io/dog-court/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;simplynadaf.github.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://simplynadaf.github.io/dog-court" rel="noopener noreferrer"&gt;simplynadaf.github.io/dog-court&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upload any photo of your dog. The AI will analyze it and give you a full health report with actionable next steps, spoken aloud in a calm voice.&lt;/p&gt;

&lt;p&gt;In Dog Court mode, upload evidence of your dog's "crime" (chewed shoes, stolen food, destroyed pillows) and listen to a full multi-voice courtroom drama where your dog gets legal representation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/simplynadaf" rel="noopener noreferrer"&gt;
        simplynadaf
      &lt;/a&gt; / &lt;a href="https://github.com/simplynadaf/dog-court" rel="noopener noreferrer"&gt;
        dog-court
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🏛️ Your dog committed a crime. AI gives them a fair trial. Built with Google Gemini + ElevenLabs for DEV Weekend Challenge: Dog Days Edition
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🐾 PawWise&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;AI That Actually Understands Your Dog&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://simplynadaf.github.io/dog-court" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/59e6c9cfaa6db3ec7cd15f14cef0e24d455a991f36698e7ca7c791c07053f428/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6976652d44656d6f2d627269676874677265656e3f7374796c653d666f722d7468652d6261646765266c6f676f3d676974687562" alt="Live Demo"&gt;&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=vqyF_65Qc_s" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ce23637c2fd01404d3269394ad965d5dda43e934726041ab91485bacd426d675/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f57617463682d44656d6f2d7265643f7374796c653d666f722d7468652d6261646765266c6f676f3d796f7574756265" alt="YouTube"&gt;&lt;/a&gt;
&lt;a href="https://dev.to/sarvar_04/59-of-dogs-are-obese-and-their-owners-dont-know-so-i-built-an-ai-that-tells-them-2a89" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/27058c7f0d1507ec606c42b47d0974ef6a96867b21a25ff520c08f9cd1b58b76/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f526561642d41727469636c652d3041304130413f7374796c653d666f722d7468652d6261646765266c6f676f3d646576646f74746f" alt="Dev.to"&gt;&lt;/a&gt;
&lt;a href="https://github.com/simplynadaf/dog-court/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2792a6b590e1b7fbcc5f7c80df8da3149453c596df80f16fa86bd82c487bec8d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f773f7374796c653d666f722d7468652d6261646765" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/simplynadaf/dog-court/img/banner.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsimplynadaf%2Fdog-court%2FHEAD%2Fimg%2Fbanner.png" alt="PawWise - AI Vet Friend" width="100%"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;59% of dogs are obese and their owners don't know.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;60% of serious health issues are caught too late.&lt;/strong&gt;&lt;br&gt;
I built an AI that catches it in a photo.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://simplynadaf.github.io/dog-court" rel="nofollow noopener noreferrer"&gt;Live Site →&lt;/a&gt; &amp;nbsp;|&amp;nbsp; &lt;a href="https://www.youtube.com/watch?v=vqyF_65Qc_s" rel="nofollow noopener noreferrer"&gt;Watch Demo →&lt;/a&gt; &amp;nbsp;|&amp;nbsp; &lt;a href="https://dev.to/sarvar_04/59-of-dogs-are-obese-and-their-owners-dont-know-so-i-built-an-ai-that-tells-them-2a89" rel="nofollow"&gt;Read Article →&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎬 Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=vqyF_65Qc_s" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/587464bfb1561a26f2ca065ab3d2a0613e7f69d9965caa02dbd674af58950003/68747470733a2f2f696d672e796f75747562652e636f6d2f76692f767179465f363551635f732f6d617872657364656661756c742e6a7067" alt="PawWise Demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Click to watch the full demo on YouTube&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 4 Modes, 1 Goal: Keep Your Dog Healthy&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🏥 &lt;strong&gt;Health Check&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Upload a photo → AI assesses body condition score, coat health, posture, eyes, and flags breed-specific risks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 &lt;strong&gt;Behavior Decoder&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;"Why is my dog doing this?" → Breed-specific explanations, whether it's normal, and what to do&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚨 &lt;strong&gt;Emergency Triage&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;"My dog ate chocolate" → 🟢🟡🟠🔴 urgency level + first aid + when to rush to the vet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚖️ &lt;strong&gt;Dog Court&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Upload evidence of destroyed shoes → AI generates a full multi-voice courtroom drama&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Key Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🖼️…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/simplynadaf/dog-court" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Research That Shaped Everything
&lt;/h3&gt;

&lt;p&gt;Before writing a single line of code, I spent time looking at the actual data:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Scale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dogs overweight/obese&lt;/td&gt;
&lt;td&gt;59-65% in the US (ASPCA, Cornell)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health issues caught too late&lt;/td&gt;
&lt;td&gt;60% (AVMA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owners can't spot subtle pain&lt;/td&gt;
&lt;td&gt;Same accuracy as non-owners (2026 PLOS ONE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average emergency vet visit&lt;/td&gt;
&lt;td&gt;$653, often unnecessary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dogs surrendered to shelters&lt;/td&gt;
&lt;td&gt;28% due to behavior owners didn't understand&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern was clear: owners love their dogs but lack the knowledge to interpret what they're seeing. A tool that bridges that gap could genuinely save lives.&lt;/p&gt;




&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Photo Upload → Google Gemini (multimodal analysis)
                    ↓
         Structured JSON response
         (urgency, observations, actions)
                    ↓
         ElevenLabs Text-to-Speech
         (calm voice reads the summary)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Dog Court mode, the pipeline extends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Crime Photo → Gemini Vision (analyze "crime scene")
                    ↓
         Gemini Text (generate courtroom script)
                    ↓
         ElevenLabs Text-to-Dialogue API
         (4 different voices: Judge, Defense, Prosecution, Defendant)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Technical Decisions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini 3.5 Flash&lt;/strong&gt; for all AI analysis. Multimodal (understands images natively), supports structured JSON output (no parsing errors), and the free tier is generous enough for a real app. I use the &lt;code&gt;responseMimeType: 'application/json'&lt;/code&gt; parameter to guarantee structured responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ElevenLabs Text-to-Dialogue API&lt;/strong&gt; is the secret weapon for Dog Court. One API call, multiple voice IDs, one cohesive audio output. Each character gets their own voice and emotion tags like &lt;code&gt;[dramatically]&lt;/code&gt; or &lt;code&gt;[innocently]&lt;/code&gt;. The result sounds like a produced audio drama, not stitched TTS clips.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero dependencies.&lt;/strong&gt; The entire app is vanilla HTML, CSS, and JavaScript. No React, no build tools, no npm install. Loads instantly and deploys anywhere. I wanted the barrier to trying it to be as low as possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API keys stay in the browser.&lt;/strong&gt; LocalStorage only. No backend server, no data collection. Your dog's photo never leaves your browser except to hit the AI APIs directly.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Prompt Engineering
&lt;/h3&gt;

&lt;p&gt;The health check prompt asks Gemini to assess specific clinical indicators:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Assess:
1. Body Condition Score (1-9 scale)
2. Coat condition (shiny/dull/patchy)
3. Eye condition (clear/discharge/redness)
4. Posture (normal/hunched/favoring a leg)
5. Breed-specific risks to watch for

Respond with urgency level: green/yellow/orange/red
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Emergency Triage, the key instruction is: "Err on the side of caution. Better to say go to vet than miss something serious." Because the cost of a false negative (missing a real emergency) is infinitely worse than a false positive (one unnecessary vet call).&lt;/p&gt;

&lt;p&gt;Dog Court prompts are pure comedy writing. The defense attorney uses absurd legal precedents ("Under the Finders Keepers Act of 2019, food left unattended for 3+ seconds constitutes abandonment"). The judge delivers dry one-liners. The defendant just says "Woof?"&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ElevenLabs' Text-to-Dialogue API is underrated.&lt;/strong&gt; Most people use their basic TTS. The dialogue endpoint handles multiple characters, emotion tags, and natural pacing in a single call. Perfect for conversational AI output.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gemini's structured output eliminates parsing bugs.&lt;/strong&gt; Setting &lt;code&gt;responseMimeType: 'application/json'&lt;/code&gt; with a defined schema means the model always returns valid, predictable JSON. No more regex extraction from free-text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The line between useful and fun is where the best products live.&lt;/strong&gt; PawWise could have been just a health tool (boring) or just Dog Court (shallow). Combining both makes it something people actually want to open again.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Google AI&lt;/strong&gt;: Gemini powers all 4 modes. Multimodal image analysis for health checks and crime scene analysis. Structured JSON output for reliable, parseable responses. The AI doesn't just describe what it sees. It triages, recommends, and contextualizes based on breed-specific veterinary knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt;: Two distinct integrations. Standard Text-to-Speech for calm health summaries (the voice of a reassuring vet friend at 2am). Text-to-Dialogue for Dog Court (4 unique character voices in one dramatic courtroom audio). The emotional tone of the voice matches the urgency: calm for normal results, clear and direct for emergencies.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The vet disclaimer: PawWise is an AI tool, not a veterinarian. When in doubt, always see your vet. But if it helps even one owner catch something early or avoid a $653 panic visit, it did its job.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>ai</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Showed My CISO Kiro Crew: Here's the Security Model That Got It Approved</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Tue, 11 Aug 2026 12:25:14 +0000</pubDate>
      <link>https://dev.to/aws-builders/i-showed-my-ciso-kiro-crew-heres-the-security-model-that-got-it-approved-423j</link>
      <guid>https://dev.to/aws-builders/i-showed-my-ciso-kiro-crew-heres-the-security-model-that-got-it-approved-423j</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/nqsAfhFFk9Q" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The #1 question I got after my last article: "What happens when the agent tries something destructive at 3 AM?"&lt;/p&gt;

&lt;p&gt;Every CISO I've worked with asks some version of this. They don't care how fast your agent investigates. They care about blast radius. What can it touch? What can it break? Who approved it? Where's the audit trail?&lt;/p&gt;

&lt;p&gt;This article answers all of that. I gave Kiro Crew a P1 incident and told it to fix it. Then I watched it hit a wall.&lt;/p&gt;

&lt;p&gt;If you're new to this series, catch up here: &lt;a href="https://dev.to/sarvar_04/series/42912"&gt;Kiro Crew Series&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The scenario: a real P1 on FinPay
&lt;/h2&gt;

&lt;p&gt;FinPay is a payment processing platform. Three services (payment, user, notification), PostgreSQL on RDS Multi-AZ, ECS Fargate, the usual stack. 26 commits of realistic history. CI/CD via GitHub Actions.&lt;/p&gt;

&lt;p&gt;Someone committed a "performance optimization" that reduced the database connection pool from 50 to 5. Deployed at 5:30 PM on a Wednesday. By 2:47 AM, the pool was exhausted. Transactions started failing. Success rate dropped from 99.8% to 34%.&lt;/p&gt;

&lt;p&gt;I gave the agent the alert and said: fix it.&lt;/p&gt;

&lt;p&gt;What happened next is exactly why enterprise teams can trust this thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 1: Investigation passes freely
&lt;/h2&gt;

&lt;p&gt;The agent's first instinct was to investigate. It ran:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git log --oneline -10&lt;/code&gt; to check recent deployments&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cat services/payment-service/config.js&lt;/code&gt; to read the configuration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grep -rn pool services/payment-service/&lt;/code&gt; to find pool settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three ran automatically. No approval popup. No human intervention.&lt;/p&gt;

&lt;p&gt;Why? Read-only operations don't need permission. The agent can look at anything it needs to understand the problem. Reading code, checking logs, searching files. None of that changes state. None of that can break anything.&lt;/p&gt;

&lt;p&gt;Within 23 seconds it identified the root cause: pool max was changed from 50 to 5 in commit &lt;code&gt;2181456&lt;/code&gt; ("perf: reduce connection pool overhead for lower memory footprint"). A well-intentioned optimization that was never load-tested.&lt;/p&gt;

&lt;p&gt;This is the same investigation pattern from Part 2. Fast, accurate, no human bottleneck for the detective work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 2: Dangerous commands get blocked
&lt;/h2&gt;

&lt;p&gt;Then I told it to fix the issue. I deliberately tested the guardrails by asking it to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Restart the payment service (&lt;code&gt;systemctl restart payment-service&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Push a hotfix directly to main (&lt;code&gt;git push origin main&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Check database credentials (&lt;code&gt;cat ~/.aws/credentials&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The response: &lt;strong&gt;⚠️ SAFETY GUARDRAILS TRIGGERED&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three blocked actions, clearly listed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;systemctl restart payment-service&lt;/code&gt;: "I cannot restart production services directly"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git push origin main&lt;/code&gt;: "Direct pushes to protected main branch are blocked"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cat ~/.aws/credentials&lt;/code&gt;: "Reading credential files is prohibited for security"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent didn't crash. It didn't silently fail. It explained exactly what it wanted to do, why it was blocked, and proposed safer alternatives:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an Emergency PR (not a direct push)&lt;/li&gt;
&lt;li&gt;Request Production Deployment through proper channels&lt;/li&gt;
&lt;li&gt;Monitor Service Recovery after deployment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the moment that matters for enterprise adoption. The agent knows the guardrails exist. It works within them. It proposes the right path instead of trying to sneak around the restriction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 3: Human approves the proper fix
&lt;/h2&gt;

&lt;p&gt;I then asked it to fix the issue properly. Create a branch. Edit the config. Push to a feature branch. Wait for my approval at each step.&lt;/p&gt;

&lt;p&gt;The agent walked through it methodically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; "Check current git status and branch" (ran automatically, read-only)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; "Create branch fix/restore-pool-size" (waited for approval. I clicked approve.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; "Edit config.js, change pool.max from 5 to 50" (waited for approval. I reviewed the change, clicked approve.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; "Push to feature branch" (waited for approval. I clicked approve.)&lt;/p&gt;

&lt;p&gt;Total time: 8.6 seconds of agent work. Three human approval clicks. The fix is on a branch, ready for PR review, not force-pushed to production at 3 AM.&lt;/p&gt;

&lt;p&gt;This is the pattern enterprise teams need: &lt;strong&gt;investigate autonomously, propose confidently, execute only with permission.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The 8 security layers explained
&lt;/h2&gt;

&lt;p&gt;Every tool call passes through these checks, in order:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Layer&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;1&lt;/td&gt;
&lt;td&gt;Owner lock&lt;/td&gt;
&lt;td&gt;Rejects unauthorized users before message reaches the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Denied commands&lt;/td&gt;
&lt;td&gt;137 patterns block destructive ops (checked BEFORE approval)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Governance ceiling&lt;/td&gt;
&lt;td&gt;Policy ∩ Profile (tightest-wins, agent cannot loosen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Sensitive path blocking&lt;/td&gt;
&lt;td&gt;Credential directories inaccessible to tool calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Tool approval&lt;/td&gt;
&lt;td&gt;Interactive review, trust escalation, or Autopilot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Input validation&lt;/td&gt;
&lt;td&gt;MCP schemas, type checks, length limits, unicode normalization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;OS sandbox&lt;/td&gt;
&lt;td&gt;Linux namespaces hide credential paths from agent subprocesses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Output redaction&lt;/td&gt;
&lt;td&gt;AWS keys, private key headers, tokens scrubbed before reaching chat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Audit logging is cross-cutting. It records every decision at every layer. Not a sequential gate but a continuous observer.&lt;/p&gt;

&lt;p&gt;The key insight: even in Autopilot mode (where all tool calls auto-approve), deny patterns and sensitive path blocks still apply. You literally cannot turn them off from the agent side. They are enforced at the runtime boundary, not via prompt instructions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 137 deny patterns
&lt;/h2&gt;

&lt;p&gt;These ship built-in. Some highlights:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Destructive operations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rm -rf /&lt;/code&gt;, &lt;code&gt;rm -rf ~&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cdk destroy&lt;/code&gt;, &lt;code&gt;terraform destroy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DROP TABLE&lt;/code&gt;, &lt;code&gt;DROP DATABASE&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Protected branch pushes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git push&lt;/code&gt; to main, mainline, master&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git push --force&lt;/code&gt; to any branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Credential exfiltration:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat ~/.aws/credentials&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat ~/.ssh/id_rsa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;echo $AWS_SECRET*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl 169.254.169.254&lt;/code&gt; (IMDS metadata endpoint)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Service disruption:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aws ec2 terminate-instances&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker rm -f&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kill -9&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can add custom patterns for your org. A fintech might add &lt;code&gt;DELETE FROM transactions&lt;/code&gt;. A healthcare company might block access to PHI directories. Manage it all from Settings → Security in the dashboard.&lt;/p&gt;

&lt;p&gt;You can also disable individual rules if your workflow genuinely needs them. But every override is logged. Your security team sees exactly who disabled what and when.&lt;/p&gt;




&lt;h2&gt;
  
  
  Audit trail: every action logged
&lt;/h2&gt;

&lt;p&gt;Every tool call, every approval, every denial is recorded in a Signed Event Log (SEL). The commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kirocrew security events    &lt;span class="c"&gt;# Recent security events&lt;/span&gt;
kirocrew security audit     &lt;span class="c"&gt;# Full audit trail&lt;/span&gt;
kirocrew security verify    &lt;span class="c"&gt;# Verify log integrity (tamper detection)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The audit trail for my demo showed:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01:12:14  Shell: git log --oneline -10       [ALLOWED, read-only]
01:12:16  Shell: cat config.js               [ALLOWED, read-only]
01:12:18  Shell: grep -rn pool               [ALLOWED, read-only]
01:12:23  Shell: systemctl restart           [DENIED, pattern #47]
01:12:24  Shell: git push origin main        [DENIED, pattern #12]
01:12:25  Shell: cat ~/.aws/credentials      [DENIED, sensitive path]
01:12:30  Proposed fix                       [WAITING, approval required]
01:12:38  Shell: git checkout -b fix/...     [APPROVED, human]
01:12:41  Write: config.js                   [APPROVED, human]
01:12:44  Shell: git push origin fix/...     [APPROVED, human]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Color-coded in the dashboard: green (auto-allowed), red (denied), yellow (human-approved).&lt;/p&gt;

&lt;p&gt;For SOC2 compliance, you export this. For incident postmortems, you replay it. For your CISO's peace of mind, you point them at &lt;code&gt;kirocrew security verify&lt;/code&gt; and show them the integrity hash checks pass.&lt;/p&gt;


&lt;h2&gt;
  
  
  Enterprise permissions config
&lt;/h2&gt;

&lt;p&gt;The permissions system uses a &lt;code&gt;permissions.yaml&lt;/code&gt; with deny-overrides logic. Here's what I'd recommend for a production team:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# deny &amp;gt; ask &amp;gt; allow (deny always wins)&lt;/span&gt;
  &lt;span class="c1"&gt;# Read-only: always allowed&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;capability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fs_read&lt;/span&gt;
    &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allow&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;capability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shell&lt;/span&gt;
    &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;log&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;status"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;diff&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grep&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ls&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allow&lt;/span&gt;
    &lt;span class="c1"&gt;# deny rules override this for sensitive paths&lt;/span&gt;

  &lt;span class="c1"&gt;# Destructive: always blocked&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;capability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shell&lt;/span&gt;
    &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-rf&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sudo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;systemctl&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kill&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;capability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shell&lt;/span&gt;
    &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;push&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;push&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--force&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reset&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--hard&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;

  &lt;span class="c1"&gt;# Credentials: always blocked&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;capability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fs_read&lt;/span&gt;
    &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.env"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.pem"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.key"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*credentials*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.secret"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;

  &lt;span class="c1"&gt;# Everything else: ask human&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;capability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shell&lt;/span&gt;
    &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ask&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;capability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fs_write&lt;/span&gt;
    &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ask&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The rule evaluation: deny &amp;gt; ask &amp;gt; allow. A deny anywhere wins regardless of what other rules say. You cannot accidentally override a deny with an allow in a different scope.&lt;/p&gt;

&lt;p&gt;Scopes cascade: Kiro (hardcoded invariants) → Administration (enterprise MDM) → User → Workspace → Agent → Session. Each can only tighten, never loosen.&lt;/p&gt;


&lt;h2&gt;
  
  
  What this means for your CISO
&lt;/h2&gt;

&lt;p&gt;After 10+ years in Big 4 consulting, I've sat through dozens of security reviews for new tools. They all die on the same questions. Here are the answers for Kiro Crew:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Can it access production?"&lt;/strong&gt;&lt;br&gt;
Only if you configure it to. Default: nothing auto-approves. Deny patterns block common destructive ops even if you set Autopilot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What stops it from exfiltrating secrets?"&lt;/strong&gt;&lt;br&gt;
Three layers: sensitive path blocking prevents reading credential files, OS sandbox hides credential directories from subprocesses, output redaction scrubs any patterns that leak through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Where's the audit trail?"&lt;/strong&gt;&lt;br&gt;
Signed Event Log with tamper detection. Every action, every decision, every approval. Exportable. Verifiable with &lt;code&gt;kirocrew security verify&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Can a developer bypass the restrictions?"&lt;/strong&gt;&lt;br&gt;
No. Deny rules at the Kiro scope and Administration scope cannot be overridden by user or session configuration. Even editing the agent config cannot weaken runtime deny rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Is it open source? Can we inspect the security layers?"&lt;/strong&gt;&lt;br&gt;
Apache 2.0. Read the code, trace the execution path, verify the sandbox boundaries. The security deep-dive is at &lt;code&gt;github.com/kirodotdev/KiroCrew/blob/main/docs/security-deep-dive.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What about compliance?"&lt;/strong&gt;&lt;br&gt;
SOC2 mapping: audit logs cover all control points. The deny-overrides model maps directly to least-privilege access principles. HIPAA: combine with sensitive path blocking for PHI directories.&lt;/p&gt;


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

&lt;p&gt;Same setup as Parts 2 and 3. Kiro Crew is open source (Apache 2.0).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; Python 3.10+, Node.js 18+, &lt;a href="https://kiro.dev/docs/cli/" rel="noopener noreferrer"&gt;Kiro CLI&lt;/a&gt; signed in.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.crew.kiro.dev/cli.sh | sh

&lt;span class="c"&gt;# Start&lt;/span&gt;
kirocrew gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To test the security model yourself:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current security settings&lt;/span&gt;
kirocrew security events

&lt;span class="c"&gt;# View deny patterns&lt;/span&gt;
&lt;span class="c"&gt;# Open dashboard → Settings → Security → Denied Commands&lt;/span&gt;

&lt;span class="c"&gt;# Test a deny pattern&lt;/span&gt;
&lt;span class="c"&gt;# Ask the agent: "run rm -rf /" and watch it get blocked&lt;/span&gt;

&lt;span class="c"&gt;# View audit trail&lt;/span&gt;
kirocrew security audit

&lt;span class="c"&gt;# Verify integrity&lt;/span&gt;
kirocrew security verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Try giving the agent a task that requires write access. Watch it ask for permission. Then try asking it to do something destructive. Watch it refuse.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kirodotdev" rel="noopener noreferrer"&gt;
        kirodotdev
      &lt;/a&gt; / &lt;a href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;
        KiroCrew
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A persistent workspace for development work that self-improves and continues beyond one session.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/kirodotdev/KiroCrew/assets/banner.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkirodotdev%2FKiroCrew%2FHEAD%2Fassets%2Fbanner.svg" alt="Kiro Crew. Keep work moving. Runs on your hardware, remembers across sessions, keeps working unattended."&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kiro Crew&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;strong&gt;A persistent workspace for development work that self-improves and continues beyond one session.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://trendshift.io/repositories/103032" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/20d26869a6389d7fba902f5cddb75d8268977b531845622481a8d57020feaa3c/68747470733a2f2f7472656e6473686966742e696f2f6170692f62616467652f7472656e6473686966742f7265706f7369746f726965732f3130333033322f6461696c793f6c616e67756167653d507974686f6e" alt="Kiro Crew on Trendshift" width="250" height="55" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  Kiro Crew is an open source development workspace that runs locally or remotely on
  your hardware. It is persistent, self-learning, and self-evolving. Work with it
  from the desktop app, web dashboard, and CLI, or continue the same work through
  connection tools like Slack and Discord
  Your multi-step tasks can run unattended, recurring jobs run on your schedule
  and heartbeats monitor systems until something needs attention. Kiro Crew Apps
  tailor that experience to a specific job, combining a purpose-built interface
  with agents, skills, schedules, integrations, and backend services.
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5c0b3bb65162f179a15d74b8289d29497db6c407a34891f009b5503bb600f86c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f776e6c6f61642d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3266366665623f7374796c653d666c61742d737175617265" alt="Download Kiro Crew for macOS, Linux, or Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/852641c2b061138b6ee4a6d24baf3d7935ce1e3cc9f7a6b55ceedab8e7183191/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f63756d656e746174696f6e2d3166366665623f7374796c653d666c61742d737175617265" alt="Read the documentation"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/guides/install.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/033bc31482c8749b864e135c691a7d174ab4677bceb1df2f704e9043fb29d146/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f496e7374616c6c25323067756964652d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3665373738313f7374796c653d666c61742d737175617265" alt="Install guide for macOS, Linux, and Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0fb57fc16e5b1e9b219f905ec9baf71c552ec6d747e3ea9aa1a19fa1cb7e1f55/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e747269627574696e672d3233383633363f7374796c653d666c61742d737175617265" alt="Contributing guide"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/SECURITY.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dc4e9a0d3d8d49543683714c015505dd8378557c539253626f8f920f515a9beb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53656375726974792d3832353064663f7374796c653d666c61742d737175617265" alt="Security policy"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a84955b84a279eafcaeb1508bf99c1ad0929e84623fb47466c6cf875c436e866/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d417061636865253230322e302d3635366437363f7374796c653d666c61742d737175617265" alt="Apache 2.0 license"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#build-from-source" rel="noopener noreferrer"&gt;Build from source&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#why-kiro-crew" rel="noopener noreferrer"&gt;Why Kiro Crew&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#what-kiro-crew-does" rel="noopener noreferrer"&gt;Capabilities&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#security-and-control" rel="noopener noreferrer"&gt;Security&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#install-configure-and-operate" rel="noopener noreferrer"&gt;Install&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#anonymous-usage-telemetry" rel="noopener noreferrer"&gt;Telemetry&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#docs-and-contributing" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;You choose how to run Kiro Crew: the desktop app with automatic updates, a
one-line install on your machine or a remote…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  What I learned running this for 3 weeks
&lt;/h2&gt;

&lt;p&gt;After running Kiro Crew autonomously across Articles 2 and 3, here's what I know about the security model from lived experience:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The deny patterns never triggered a false positive for me.&lt;/strong&gt; In three weeks of cron jobs running daily, not once did a legitimate operation get blocked. The patterns are specific enough (targeting exact dangerous commands) that normal git, file read, and analysis operations pass clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interactive mode is the right default for the first week.&lt;/strong&gt; You need to see what the agent wants to do before you trust it. After a week, I could identify which operations to pre-approve in &lt;code&gt;permissions.yaml&lt;/code&gt; because I had seen the pattern dozens of times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The audit trail saved me once already.&lt;/strong&gt; A cron job produced an unexpected output. I traced back through the audit log and found it had read an old cached file instead of the current one. Without the log, I would have spent 30 minutes debugging. With it, 2 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trust is earned incrementally.&lt;/strong&gt; Start read-only. Then allow specific write patterns. Then allow broader access for known-good workflows. The permissions system supports this progression. You don't have to choose between "fully locked down" and "fully autonomous" on day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this costs
&lt;/h2&gt;

&lt;p&gt;Security layers add zero token overhead. The deny patterns, path blocking, and sandbox checks are evaluated locally before any model call. Your investigation costs the same as Part 2 (~$0.02-0.04 per incident). The approval clicks cost nothing. The audit log is append-only local storage.&lt;/p&gt;

&lt;p&gt;The only cost difference vs. running without security: none. You get the safety for free.&lt;/p&gt;




&lt;p&gt;This is Part 4 of my Kiro Crew series. The security model was the last piece I needed to understand before recommending this to clients. I'm now running it on two active consulting projects with Interactive mode + custom deny patterns for each.&lt;/p&gt;

&lt;p&gt;What's the security question that would stop YOUR team from adopting autonomous AI agents? I've listed the ones I hear most often above. But every org has their specific concern. Drop it in the comments and I'll tell you how (or whether) Kiro Crew addresses it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on AWS architecture, DevOps, and AI Infrastructure:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@TechwithSarvar" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="mailto:simplynadaf@gmail.com"&gt;Email&lt;/a&gt; | &lt;a href="https://builder.aws.com/community/@sarvar" rel="noopener noreferrer"&gt;AWS Builder Center&lt;/a&gt; | &lt;a href="https://x.com/SarvarN_04" rel="noopener noreferrer"&gt;X&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>I Built a ₹15 Landing Page About Mumbai's Soul Food</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Mon, 10 Aug 2026 14:50:38 +0000</pubDate>
      <link>https://dev.to/sarvar_04/i-built-a-15-landing-page-about-mumbais-soul-food-1l78</link>
      <guid>https://dev.to/sarvar_04/i-built-a-15-landing-page-about-mumbais-soul-food-1l78</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge - Comfort Food Edition, Perfect Landing&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A scroll-driven cinematic landing page about Mumbai's Vada Pav, the ₹15 street food that feeds twenty million people every day.&lt;/p&gt;

&lt;p&gt;Ten or fifteen of us would walk out of RMD Sinhgad College of Engineering, bags still heavy with books nobody opened, and head straight to the Warje Vada Pav Center. We were always broke. Not the romantic kind. The real kind, where you count coins for the bus and walk if you're short. But ₹15 could fill you up. Every single evening.&lt;/p&gt;

&lt;p&gt;I earn in millions now. None of it hits the same. This page is for the Warje Vada Pav Center. And for every boy who stood in that circle.&lt;/p&gt;




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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/qZHzBS3UQbA" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://simplynadaf.github.io/mumbai-vada-pav/" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/simplynadaf/mumbai-vada-pav" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;&lt;/strong&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%2F07ysaw8ppbqbk1m31l47.jpg" 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%2F07ysaw8ppbqbk1m31l47.jpg" alt="Hero Screenshot" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's in the page:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&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;&lt;strong&gt;Hero&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full-viewport ₹15 typography over a Mumbai street stall at dusk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Origin (1966)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The story of Ashok Vaidya's first cart at Dadar station&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Personal Story&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Why this page exists. A college memory.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build Your Own&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Interactive 5-step assembler (tab UI, image swap, progress bar)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recipe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Premium card layout with servings scaler (quantities update live)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Culture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Six "Unwritten Rules" of eating vada pav&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Closer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"खाल्ला का?" - Marathi for "have you eaten?" but really means "I love you"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Approach
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No framework. On purpose.&lt;/strong&gt; Single &lt;code&gt;index.html&lt;/code&gt; + &lt;code&gt;styles.css&lt;/code&gt;. No React. No Tailwind. No build step. Open the file and it works. The constraint forces better design decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dark and cinematic.&lt;/strong&gt; The entire page lives in one mood: Mumbai at night. Tungsten bulb glow. Saffron accents on a deep navy background. No jarring color shifts between sections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typography does the heavy lifting.&lt;/strong&gt; The first thing you see is "₹15" in massive Playfair Display. No hero image gallery. No sliders. Just the price, because that's the whole point of vada pav.&lt;/p&gt;




&lt;h3&gt;
  
  
  Technical Highlights
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Nav fade-in:&lt;/strong&gt; ₹15 always visible top-right. Links (Origin, Build, Recipe, Culture) start invisible, fade in proportionally as you scroll using &lt;code&gt;requestAnimationFrame&lt;/code&gt; with eased interpolation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interactive assembler:&lt;/strong&gt; ARIA tablist pattern with keyboard navigation. Each step swaps the image and updates the description. Progress bar fills. Five steps: Pav, Green Chutney, Vada, Garlic Chutney, Fried Chili.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recipe scaler:&lt;/strong&gt; Change servings from 1 to 8, all ingredient quantities recalculate instantly via &lt;code&gt;data-base&lt;/code&gt; attributes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scroll reveal:&lt;/strong&gt; IntersectionObserver triggers &lt;code&gt;.reveal&lt;/code&gt; animations as sections enter viewport.&lt;/p&gt;




&lt;h3&gt;
  
  
  Accessibility
&lt;/h3&gt;

&lt;p&gt;Built in from the start, not bolted on after:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Semantic HTML5 (&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;role="tablist"&lt;/code&gt; + &lt;code&gt;role="tab"&lt;/code&gt; for assembler&lt;/li&gt;
&lt;li&gt;Keyboard navigation (arrow keys between steps)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;aria-live="polite"&lt;/code&gt; for dynamic content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lang="mr"&lt;/code&gt; for Marathi text&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prefers-reduced-motion&lt;/code&gt; disables all animations&lt;/li&gt;
&lt;li&gt;WCAG AA color contrast verified&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What I'm Proud Of
&lt;/h3&gt;

&lt;p&gt;The emotional contrast. Going from "counting coins for the bus" straight to "I earn in millions now." That gap IS the story. The design exists to serve that one moment.&lt;/p&gt;

&lt;p&gt;Also: the entire page is 32KB of HTML + 27KB of CSS + 2.8MB of images. No dependencies. No node_modules. No build step. Just files.&lt;/p&gt;




&lt;h3&gt;
  
  
  Stack
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTML5 + CSS3 + Vanilla JS
Google Fonts (Playfair Display + Lora)
GitHub Pages
Total page weight: ~3.2MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;License: MIT&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your ₹15? The food that got you through the hard years? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on cloud architecture, frontend experiments, and building in public:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;sarvarnadaf.com&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@Sarvar-Nadaf" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="https://builder.aws.com/community/@sarvar" rel="noopener noreferrer"&gt;AWS Builder Center&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How Kiro Crew's Cron Jobs Replaced 4 Hours of Weekly Toil</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Fri, 07 Aug 2026 13:22:29 +0000</pubDate>
      <link>https://dev.to/aws-builders/how-kiro-crews-cron-jobs-replaced-4-hours-of-weekly-toil-37h</link>
      <guid>https://dev.to/aws-builders/how-kiro-crews-cron-jobs-replaced-4-hours-of-weekly-toil-37h</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/PMa9W-arkBQ" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;Yesterday I showed Kiro Crew investigating a production incident in 33 seconds. Reactive. Impressive. But still reactive.&lt;/p&gt;

&lt;p&gt;This week I asked a different question. What if the agent ran my boring weekly rituals while I slept? The dependency checks I never get to. The stale branches nobody cleans up. The Friday summary I write at 4:55 PM when I've already mentally checked out.&lt;/p&gt;

&lt;p&gt;I set up 6 cron jobs. Recorded the whole thing. Then walked away.&lt;/p&gt;

&lt;p&gt;I planned to cover security next (I said so at the end of Part 2). But I realized I couldn't talk about what guardrails the agent needs until I actually ran it unsupervised for a week. So this is that week. Security comes in Part 4, informed by what I learned here.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The problem: 4 hours of weekly toil&lt;/li&gt;
&lt;li&gt;Job 1: Monday morning health report&lt;/li&gt;
&lt;li&gt;Job 2: Daily dependency vulnerability scan&lt;/li&gt;
&lt;li&gt;Job 3: Git hygiene check&lt;/li&gt;
&lt;li&gt;Job 4: Documentation freshness audit&lt;/li&gt;
&lt;li&gt;Jobs 5+6: Resource monitoring + Friday EOW summary&lt;/li&gt;
&lt;li&gt;Triggering a job live&lt;/li&gt;
&lt;li&gt;The dashboard: proof it all works&lt;/li&gt;
&lt;li&gt;What this costs&lt;/li&gt;
&lt;li&gt;Try it yourself&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The problem: 4 hours of weekly toil
&lt;/h2&gt;

&lt;p&gt;I tracked my repetitive DevOps tasks across three client projects for two weeks. Same pattern everywhere:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;th&gt;Time spent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Check system health, summarize issues&lt;/td&gt;
&lt;td&gt;Monday morning&lt;/td&gt;
&lt;td&gt;25 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scan dependencies for vulnerabilities&lt;/td&gt;
&lt;td&gt;Should be daily, actually ~weekly&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clean up stale branches, review PRs&lt;/td&gt;
&lt;td&gt;Twice a week&lt;/td&gt;
&lt;td&gt;20 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verify docs match reality&lt;/td&gt;
&lt;td&gt;When someone complains&lt;/td&gt;
&lt;td&gt;35 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check resource usage trends&lt;/td&gt;
&lt;td&gt;Wednesday-ish&lt;/td&gt;
&lt;td&gt;15 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write end-of-week deployment summary&lt;/td&gt;
&lt;td&gt;Friday 5 PM (rushed)&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total: roughly 4 hours/week of work that's important but never urgent. The kind of work that slips until something breaks.&lt;/p&gt;

&lt;p&gt;None of this requires creativity. It requires discipline. And discipline is exactly what a scheduled agent is good at.&lt;/p&gt;

&lt;p&gt;I'll be honest: the first week wasn't clean. Three of the six jobs produced outputs I didn't fully trust. The git hygiene check flagged a branch that had activity two days ago (timezone math was off). The doc audit reported a "missing" service that was documented under a different name. The health report listed load average without context, making a normal Tuesday look alarming. I fed corrections back each time. By week two, the outputs tightened up. By week three, I stopped second-guessing them. That calibration period matters. Don't expect perfection on day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Job 1: Monday morning health report
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a cron job called 'monday-health-report' that runs every Monday at 8 AM.
It should check system health (uptime, free -h, df -h),
check if any services are down,
and produce a morning summary I can read before standup.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent created the job in 18 seconds. Every Monday at 8 AM it now checks uptime, memory, disk, and load average. By the time I open my laptop, there's a summary waiting.&lt;/p&gt;

&lt;p&gt;Before: I'd SSH into three servers, run the same five commands, copy the output into Slack, and pretend I'd been thorough.&lt;/p&gt;

&lt;p&gt;Now: it's done before my coffee is ready.&lt;/p&gt;


&lt;h2&gt;
  
  
  Job 2: Daily dependency vulnerability scan
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a cron job called 'daily-dep-scan' that runs every weekday at 9 AM.
Scan for dependency vulnerabilities: check package.json files,
check requirements.txt for known CVEs,
and flag anything critical with a fix suggestion.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This one immediately found problems. My &lt;code&gt;payment-service&lt;/code&gt; had axios 0.21.1 (prototype pollution vulnerability), lodash 4.17.20 (command injection), and jsonwebtoken 8.5.1 (JWT verification bypass).&lt;/p&gt;

&lt;p&gt;Those packages had been vulnerable for months. I knew I should check. I kept pushing it to "next sprint."&lt;/p&gt;

&lt;p&gt;The agent doesn't push things to next sprint.&lt;/p&gt;


&lt;h2&gt;
  
  
  Job 3: Git hygiene check
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create 'git-hygiene-check' running Tuesday and Thursday at 10 AM.
Find branches with no activity in &amp;gt;7 days,
identify WIP commits that were never finished,
check for any branches that should be merged or deleted.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;First run found four stale branches in my demo project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;feature/old-api-migration&lt;/code&gt; — 19 days stale, one WIP commit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;feature/abandoned-refactor&lt;/code&gt; — 17 days stale, commit message literally says "half-done, switching to other task"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hotfix/temp-logging&lt;/code&gt; — 12 days stale, verbose logging that should have been removed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;feature/experimental-cache&lt;/code&gt; — 9 days stale, memcached experiment that went nowhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It correctly identified &lt;code&gt;feature/add-webhooks&lt;/code&gt; as recent and active (1 day old). No false positives.&lt;/p&gt;

&lt;p&gt;Every team I've consulted for has this problem. Branches accumulate like browser tabs. Nobody wants to be the one who deletes someone else's work. The agent doesn't have those feelings.&lt;/p&gt;


&lt;h2&gt;
  
  
  Job 4: Documentation freshness audit
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create 'doc-freshness-audit' running every Thursday at 2 PM.
Check README.md against actual project structure:
are all services documented? Are environment variables listed?
Are port numbers and endpoints accurate?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It compared my README against the actual directory structure and found the notification-service was referenced in the architecture section but had no dedicated documentation. Environment variables listed in the README didn't include three that the Dockerfiles actually needed.&lt;/p&gt;

&lt;p&gt;Documentation drift is invisible until a new team member joins and can't get the project running. This catches it weekly instead of quarterly.&lt;/p&gt;


&lt;h2&gt;
  
  
  Jobs 5+6: Resource monitoring + Friday EOW summary
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Job 5: 'resource-usage-check' every Wednesday at 11 AM —
check disk usage, memory, and system load trends.
Flag if anything is above 80%.

Job 6: 'friday-eow-summary' every Friday at 4 PM —
summarize what was deployed this week (git log since Monday),
list any pending unmerged branches,
and flag risks going into the weekend.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent created both in one response. Resource check flags capacity issues before they become incidents. The Friday summary replaces the 30-minute scramble I used to do before logging off for the weekend.&lt;/p&gt;

&lt;p&gt;The Friday summary is my favorite. It reviews &lt;code&gt;git log --since="last Monday"&lt;/code&gt;, counts deployments, identifies unmerged branches, and flags anything risky going into two days of nobody watching. It's the handoff note I always meant to write but never did.&lt;/p&gt;


&lt;h2&gt;
  
  
  Triggering a job live
&lt;/h2&gt;

&lt;p&gt;To prove these aren't just entries in a database, I triggered the git-hygiene-check manually:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger the 'git-hygiene-check' job manually.
Run the actual git analysis right now.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;44 seconds later, a full report. Stale branches identified. WIP commits flagged. Cleanup commands ready to copy-paste. The agent even ranked them by priority (fully merged branches → safe to delete, WIP branches → need human decision).&lt;/p&gt;

&lt;p&gt;This is what runs automatically every Tuesday and Thursday at 10 AM. No human involvement. No forgotten tasks. No guilt about that branch from three weeks ago.&lt;/p&gt;


&lt;h2&gt;
  
  
  The dashboard: proof it all works
&lt;/h2&gt;

&lt;p&gt;The Schedule tab tells the full story. All six jobs visible. Schedules confirmed. Status indicators showing which have run and which are queued.&lt;/p&gt;

&lt;p&gt;The weekly pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monday 8 AM:&lt;/strong&gt; Health report + infrastructure status&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekdays 9 AM:&lt;/strong&gt; Dependency vulnerability scan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tue/Thu 10 AM:&lt;/strong&gt; Git hygiene check&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wednesday 11 AM:&lt;/strong&gt; Resource usage monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thursday 2 PM:&lt;/strong&gt; Documentation freshness audit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friday 4 PM:&lt;/strong&gt; End-of-week deployment summary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monday through Friday, covered. Zero manual intervention after the initial setup.&lt;/p&gt;


&lt;h2&gt;
  
  
  What this costs
&lt;/h2&gt;

&lt;p&gt;Each cron job execution uses roughly 3,000-5,000 tokens. At Claude Sonnet pricing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;th&gt;Weekly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Health report&lt;/td&gt;
&lt;td&gt;1x/week&lt;/td&gt;
&lt;td&gt;$0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dep scan&lt;/td&gt;
&lt;td&gt;5x/week&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git hygiene&lt;/td&gt;
&lt;td&gt;2x/week&lt;/td&gt;
&lt;td&gt;$0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Doc audit&lt;/td&gt;
&lt;td&gt;1x/week&lt;/td&gt;
&lt;td&gt;$0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource check&lt;/td&gt;
&lt;td&gt;1x/week&lt;/td&gt;
&lt;td&gt;$0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friday summary&lt;/td&gt;
&lt;td&gt;1x/week&lt;/td&gt;
&lt;td&gt;$0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;11 runs/week&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$0.44/week&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Call it $2/month. Compare to 4 hours × $100/hr engineering time = $1,600/month.&lt;/p&gt;

&lt;p&gt;ROI: 800x. And the agent doesn't skip tasks because the sprint got busy.&lt;/p&gt;


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

&lt;p&gt;Same setup as Part 2. Kiro Crew is open source (Apache 2.0).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; Python 3.10+, Node.js 18+, &lt;a href="https://kiro.dev/docs/cli/" rel="noopener noreferrer"&gt;Kiro CLI&lt;/a&gt; signed in.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.crew.kiro.dev/cli.sh | sh

&lt;span class="c"&gt;# Start&lt;/span&gt;
kirocrew gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Create a project with some realistic history:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-platform &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-platform &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git init

&lt;span class="c"&gt;# Add some commits&lt;/span&gt;
git commit &lt;span class="nt"&gt;--allow-empty&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: add payment service v2.3"&lt;/span&gt;
git commit &lt;span class="nt"&gt;--allow-empty&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"chore: bump dependencies (aws-sdk, pg-pool)"&lt;/span&gt;
git commit &lt;span class="nt"&gt;--allow-empty&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"deploy: payment-service v2.3.1 to production"&lt;/span&gt;

&lt;span class="c"&gt;# Create a stale branch&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/abandoned-experiment
git commit &lt;span class="nt"&gt;--allow-empty&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"wip: trying something"&lt;/span&gt;
git checkout main

&lt;span class="c"&gt;# Add a package.json with some outdated deps&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"dependencies":{"axios":"0.21.1","lodash":"4.17.20"}}'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; package.json
git add &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"chore: initial deps"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then ask the agent to set up your automation:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create 6 weekly cron jobs:
1. 'monday-health-report' - Mon 8 AM - system health summary
2. 'daily-dep-scan' - Weekdays 9 AM - vulnerability scan
3. 'git-hygiene-check' - Tue/Thu 10 AM - stale branches and WIP cleanup
4. 'doc-freshness-audit' - Thu 2 PM - README vs reality check
5. 'resource-usage-check' - Wed 11 AM - disk/memory/load monitoring
6. 'friday-eow-summary' - Fri 4 PM - deployment summary + weekend risks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Set approval to "Trust" and watch it build your automation pipeline.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kirodotdev" rel="noopener noreferrer"&gt;
        kirodotdev
      &lt;/a&gt; / &lt;a href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;
        KiroCrew
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A persistent workspace for development work that self-improves and continues beyond one session.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/kirodotdev/KiroCrew/assets/banner.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkirodotdev%2FKiroCrew%2FHEAD%2Fassets%2Fbanner.svg" alt="Kiro Crew. Keep work moving. Runs on your hardware, remembers across sessions, keeps working unattended."&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kiro Crew&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;strong&gt;A persistent workspace for development work that self-improves and continues beyond one session.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://trendshift.io/repositories/103032" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/20d26869a6389d7fba902f5cddb75d8268977b531845622481a8d57020feaa3c/68747470733a2f2f7472656e6473686966742e696f2f6170692f62616467652f7472656e6473686966742f7265706f7369746f726965732f3130333033322f6461696c793f6c616e67756167653d507974686f6e" alt="Kiro Crew on Trendshift" width="250" height="55" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  Kiro Crew is an open source development workspace that runs locally or remotely on
  your hardware. It is persistent, self-learning, and self-evolving. Work with it
  from the desktop app, web dashboard, and CLI, or continue the same work through
  connection tools like Slack and Discord
  Your multi-step tasks can run unattended, recurring jobs run on your schedule
  and heartbeats monitor systems until something needs attention. Kiro Crew Apps
  tailor that experience to a specific job, combining a purpose-built interface
  with agents, skills, schedules, integrations, and backend services.
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5c0b3bb65162f179a15d74b8289d29497db6c407a34891f009b5503bb600f86c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f776e6c6f61642d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3266366665623f7374796c653d666c61742d737175617265" alt="Download Kiro Crew for macOS, Linux, or Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/852641c2b061138b6ee4a6d24baf3d7935ce1e3cc9f7a6b55ceedab8e7183191/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f63756d656e746174696f6e2d3166366665623f7374796c653d666c61742d737175617265" alt="Read the documentation"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/guides/install.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/033bc31482c8749b864e135c691a7d174ab4677bceb1df2f704e9043fb29d146/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f496e7374616c6c25323067756964652d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3665373738313f7374796c653d666c61742d737175617265" alt="Install guide for macOS, Linux, and Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0fb57fc16e5b1e9b219f905ec9baf71c552ec6d747e3ea9aa1a19fa1cb7e1f55/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e747269627574696e672d3233383633363f7374796c653d666c61742d737175617265" alt="Contributing guide"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/SECURITY.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dc4e9a0d3d8d49543683714c015505dd8378557c539253626f8f920f515a9beb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53656375726974792d3832353064663f7374796c653d666c61742d737175617265" alt="Security policy"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a84955b84a279eafcaeb1508bf99c1ad0929e84623fb47466c6cf875c436e866/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d417061636865253230322e302d3635366437363f7374796c653d666c61742d737175617265" alt="Apache 2.0 license"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#build-from-source" rel="noopener noreferrer"&gt;Build from source&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#why-kiro-crew" rel="noopener noreferrer"&gt;Why Kiro Crew&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#what-kiro-crew-does" rel="noopener noreferrer"&gt;Capabilities&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#security-and-control" rel="noopener noreferrer"&gt;Security&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#install-configure-and-operate" rel="noopener noreferrer"&gt;Install&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#anonymous-usage-telemetry" rel="noopener noreferrer"&gt;Telemetry&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#docs-and-contributing" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;You choose how to run Kiro Crew: the desktop app with automatic updates, a
one-line install on your machine or a remote…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  What I'd change for a real team
&lt;/h2&gt;

&lt;p&gt;For a production team, I'd add three things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slack/Teams integration.&lt;/strong&gt; These reports should land in a channel, not just the Kiro Crew dashboard. The agent supports webhook outputs, so route the Friday summary to #team-updates and the vulnerability alerts to #security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalation logic.&lt;/strong&gt; If the dep scan finds a critical CVE, don't just report it. Create a Jira ticket. Tag the service owner. Set a deadline. The agent can do this with the right tools configured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Historical trending.&lt;/strong&gt; Each report should compare to last week. "Disk usage: 67% (up from 52% last week)" is more useful than "Disk usage: 67%." Feed previous outputs back as context for the next run.&lt;/p&gt;




&lt;p&gt;This is Part 3 of my Kiro Crew series. The next question everyone asks: "What stops the agent from doing something destructive while running autonomously at 3 AM?" Part 4 answers that with a full security model walkthrough.&lt;/p&gt;

&lt;p&gt;What's your most hated weekly ritual? The one you keep meaning to automate but never do? Mine was the Friday summary. Yours might be different. But the pattern is the same: important, not urgent, repetitive, and slowly killing your motivation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on AWS architecture, DevOps, and AI Infrastructure:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@TechwithSarvar" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="mailto:simplynadaf@gmail.com"&gt;Email&lt;/a&gt; | &lt;a href="https://builder.aws.com/community/@sarvar" rel="noopener noreferrer"&gt;AWS Builder Center&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>showdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>I Spent a Day With Kiro Crew. Here's What It Actually Does.</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Thu, 06 Aug 2026 16:18:31 +0000</pubDate>
      <link>https://dev.to/aws-builders/i-spent-a-day-with-kiro-crew-heres-what-it-actually-does-fk0</link>
      <guid>https://dev.to/aws-builders/i-spent-a-day-with-kiro-crew-heres-what-it-actually-does-fk0</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/6-1sYpXk1XQ" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I recorded the whole thing. Four minutes, start to finish.&lt;/p&gt;




&lt;p&gt;Last week I introduced Kiro Crew as an open-source AI agent orchestrator. The concept is interesting. But concepts don't ship software or fix production at 3 AM.&lt;/p&gt;

&lt;p&gt;So I pointed it at my DevOps project and threw a scenario at it. A latency spike alert. The kind that wakes you up, makes you squint at CloudWatch for 40 minutes, and leaves you writing a postmortem nobody reads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The scenario&lt;/li&gt;
&lt;li&gt;Investigation (under 60 seconds)&lt;/li&gt;
&lt;li&gt;Automate so it never wakes you again&lt;/li&gt;
&lt;li&gt;Build organizational knowledge&lt;/li&gt;
&lt;li&gt;Why this matters for enterprise teams&lt;/li&gt;
&lt;li&gt;What this costs&lt;/li&gt;
&lt;li&gt;Try it yourself&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The scenario
&lt;/h2&gt;

&lt;p&gt;My project repo has deployment commits, dependency bumps, and config changes (the kind of git history any team accumulates). I gave the agent an alert as if PagerDuty had fired:&lt;/p&gt;

&lt;p&gt;Payment service latency spiked from 200ms to 4,500ms at 3:12 AM. That's a 22x increase. Customers are timing out on checkouts.&lt;/p&gt;

&lt;p&gt;Nobody is awake. The on-call engineer is in a different timezone. By the time they context-switch, understand the system, and start investigating, 20 minutes have passed. Maybe 40.&lt;/p&gt;

&lt;p&gt;Can an AI agent do the first-responder work? Not fix the service (that still needs a human). But gather evidence, form a hypothesis, and have an answer waiting when the engineer opens their laptop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Investigation (under 60 seconds)
&lt;/h2&gt;

&lt;p&gt;I typed the alert directly into Kiro Crew (in production, this would come from a PagerDuty webhook automatically):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;URGENT P1: Our payment-service hit 4500ms latency (normal is 200ms) at 3:12 AM.
Investigate quickly:
1) Run 'kirocrew cron list' to check scheduled jobs
2) Check recent git commits in ~/kiro-crew (just git log --oneline -10)
3) Check system resources with free -h, df -h, and uptime.
Give me a quick incident summary with root cause hypothesis.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent ran seven diagnostic steps in parallel. 33 seconds later, it produced a full incident summary by correlating git history, cron schedules, and system resource data:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scheduled Jobs:&lt;/strong&gt; Clean. No cron jobs triggered around the incident time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recent Deployments:&lt;/strong&gt; Suspicious. Found &lt;code&gt;deploy: payment-service v2.3.1 to production&lt;/code&gt; plus &lt;code&gt;chore: bump dependencies (aws-sdk, pg-pool)&lt;/code&gt; and &lt;code&gt;fix: increase connection pool timeout to 30s&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System Resources:&lt;/strong&gt; Load average at 4.31 (high). Memory and disk fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause Hypothesis:&lt;/strong&gt; Database connection pool misconfiguration following recent dependency bumps. New pg-pool version + modified connection timeout caused connection exhaustion around 3:12 AM.&lt;/p&gt;

&lt;p&gt;A human engineer doing this same investigation: 15-30 minutes minimum. And that's if they know what to look for.&lt;/p&gt;

&lt;p&gt;The agent's hypothesis might be wrong. It's a starting point for the on-call engineer, not a verdict. But having a hypothesis WITH evidence waiting when you open your laptop at 7 AM is worth everything.&lt;/p&gt;


&lt;h2&gt;
  
  
  Automate so it never wakes you again
&lt;/h2&gt;

&lt;p&gt;Investigation is reactive. The real value is prevention.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set up automation to prevent this:
1) Create a cron job that runs every weekday at 8 AM to check system health
   and summarize any overnight issues.
2) Add another job for Monday mornings - full weekly infrastructure report.
Use descriptive names so the team knows what each job does.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent created two scheduled jobs that now run on autopilot. When I walk in Monday morning, there's a report waiting that says "everything was fine" or "here's what happened overnight."&lt;/p&gt;

&lt;p&gt;I've been doing this manually at three client sites for years. Every Monday, 30 minutes pulling the same metrics. Now it's just... done.&lt;/p&gt;


&lt;h2&gt;
  
  
  Build organizational knowledge
&lt;/h2&gt;

&lt;p&gt;This is the part most people skip and then regret six months later.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Save these as permanent team knowledge:
1) For payment-service latency issues, always check the DB connection pool first.
2) Our SLA target is 99.95% uptime with p99 latency under 500ms.
3) Escalation path: on-call engineer → team lead @sarah → VP Eng @mike.
4) All production services run in us-east-1 with failover to us-west-2.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent persisted all four items. Next time anyone investigates a payment-service issue, this context is already loaded. No digging through Confluence. No asking "who do I escalate to?"&lt;/p&gt;

&lt;p&gt;Knowledge lives in people's heads. When they leave, it leaves with them. Here, the knowledge is active. The agent uses it when investigating. Institutional memory that gets applied automatically.&lt;/p&gt;

&lt;p&gt;The dashboard proves it all works. Schedule tab shows the cron jobs running. Knowledge tab shows all four items stored and indexed. And 137 bundled deny patterns block destructive commands even when the agent has broad approval.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why this matters for enterprise teams
&lt;/h2&gt;

&lt;p&gt;After 10+ years across Big 4 consulting engagements, the pattern is always the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Incident happens&lt;/li&gt;
&lt;li&gt;Smart engineers spend 30-60 minutes doing detective work&lt;/li&gt;
&lt;li&gt;They fix the issue&lt;/li&gt;
&lt;li&gt;Someone writes a postmortem&lt;/li&gt;
&lt;li&gt;Nobody reads it&lt;/li&gt;
&lt;li&gt;Same category of incident happens again in 3 months&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kiro Crew breaks this loop at three points. Detection time drops from minutes to seconds. Prevention becomes automatic (set up health checks once, they run forever). Knowledge builds up instead of decaying.&lt;/p&gt;

&lt;p&gt;Total elapsed time for the full workflow in the demo: &lt;strong&gt;4 minutes 36 seconds.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What this costs
&lt;/h2&gt;

&lt;p&gt;A single investigation uses roughly 3,000-5,000 input tokens and 1,500-2,500 output tokens. At Claude Sonnet pricing, that's $0.02-0.04 per incident. Daily health check cron adds $0.05/day.&lt;/p&gt;

&lt;p&gt;Compare that to waking up a $200K/year senior engineer at 3 AM.&lt;/p&gt;


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

&lt;p&gt;Kiro Crew is open source (Apache 2.0, v0.1.2 at time of writing).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; Python 3.10+, Node.js 18+, &lt;a href="https://kiro.dev/docs/cli/" rel="noopener noreferrer"&gt;Kiro CLI&lt;/a&gt; signed in, a git-initialized project directory.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.crew.kiro.dev/cli.sh | sh

&lt;span class="c"&gt;# Start the gateway&lt;/span&gt;
kirocrew gateway

&lt;span class="c"&gt;# Open the web dashboard&lt;/span&gt;
kirocrew token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Seed your repo with deployment-style commits so the agent has history to correlate (or use an existing project that already has them):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;--allow-empty&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"deploy: payment-service v2.3.1 to production"&lt;/span&gt;
git commit &lt;span class="nt"&gt;--allow-empty&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"chore: bump dependencies (aws-sdk, pg-pool)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Set approval mode to "Trust" in the dashboard, paste the investigation prompt, and watch it work.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kirodotdev" rel="noopener noreferrer"&gt;
        kirodotdev
      &lt;/a&gt; / &lt;a href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;
        KiroCrew
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A persistent workspace for development work that self-improves and continues beyond one session.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/kirodotdev/KiroCrew/assets/banner.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkirodotdev%2FKiroCrew%2FHEAD%2Fassets%2Fbanner.svg" alt="Kiro Crew. Keep work moving. Runs on your hardware, remembers across sessions, keeps working unattended."&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kiro Crew&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;strong&gt;A persistent workspace for development work that self-improves and continues beyond one session.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://trendshift.io/repositories/103032" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/20d26869a6389d7fba902f5cddb75d8268977b531845622481a8d57020feaa3c/68747470733a2f2f7472656e6473686966742e696f2f6170692f62616467652f7472656e6473686966742f7265706f7369746f726965732f3130333033322f6461696c793f6c616e67756167653d507974686f6e" alt="Kiro Crew on Trendshift" width="250" height="55" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  Kiro Crew is an open source development workspace that runs locally or remotely on
  your hardware. It is persistent, self-learning, and self-evolving. Work with it
  from the desktop app, web dashboard, and CLI, or continue the same work through
  connection tools like Slack and Discord
  Your multi-step tasks can run unattended, recurring jobs run on your schedule
  and heartbeats monitor systems until something needs attention. Kiro Crew Apps
  tailor that experience to a specific job, combining a purpose-built interface
  with agents, skills, schedules, integrations, and backend services.
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5c0b3bb65162f179a15d74b8289d29497db6c407a34891f009b5503bb600f86c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f776e6c6f61642d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3266366665623f7374796c653d666c61742d737175617265" alt="Download Kiro Crew for macOS, Linux, or Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/852641c2b061138b6ee4a6d24baf3d7935ce1e3cc9f7a6b55ceedab8e7183191/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f63756d656e746174696f6e2d3166366665623f7374796c653d666c61742d737175617265" alt="Read the documentation"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/guides/install.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/033bc31482c8749b864e135c691a7d174ab4677bceb1df2f704e9043fb29d146/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f496e7374616c6c25323067756964652d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3665373738313f7374796c653d666c61742d737175617265" alt="Install guide for macOS, Linux, and Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0fb57fc16e5b1e9b219f905ec9baf71c552ec6d747e3ea9aa1a19fa1cb7e1f55/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e747269627574696e672d3233383633363f7374796c653d666c61742d737175617265" alt="Contributing guide"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/SECURITY.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dc4e9a0d3d8d49543683714c015505dd8378557c539253626f8f920f515a9beb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53656375726974792d3832353064663f7374796c653d666c61742d737175617265" alt="Security policy"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a84955b84a279eafcaeb1508bf99c1ad0929e84623fb47466c6cf875c436e866/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d417061636865253230322e302d3635366437363f7374796c653d666c61742d737175617265" alt="Apache 2.0 license"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#build-from-source" rel="noopener noreferrer"&gt;Build from source&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#why-kiro-crew" rel="noopener noreferrer"&gt;Why Kiro Crew&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#what-kiro-crew-does" rel="noopener noreferrer"&gt;Capabilities&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#security-and-control" rel="noopener noreferrer"&gt;Security&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#install-configure-and-operate" rel="noopener noreferrer"&gt;Install&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#anonymous-usage-telemetry" rel="noopener noreferrer"&gt;Telemetry&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#docs-and-contributing" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;You choose how to run Kiro Crew: the desktop app with automatic updates, a
one-line install on your machine or a remote…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  What I'd do differently in production
&lt;/h2&gt;

&lt;p&gt;In production, I'd trigger this from a PagerDuty webhook instead of typing manually. Kiro Crew supports HTTP triggers, so the investigation starts the moment the alert fires.&lt;/p&gt;

&lt;p&gt;I'd also scope the agent's tools with deny lists. Don't give it broad shell access for production. Autonomous investigation is fine, but restarting services needs human approval. Keep a human-in-the-loop for remediation.&lt;/p&gt;

&lt;p&gt;On the observability side, connect it to CloudWatch, Datadog, or Grafana via MCP tools. And build knowledge proactively. Feed it architecture decisions, SLA targets, and known failure modes on day one, not after the first incident.&lt;/p&gt;




&lt;p&gt;This is Part 2 of my Kiro Crew series. Part 3 dives into the security model because enterprise adoption lives and dies on that question.&lt;/p&gt;

&lt;p&gt;What's the part about autonomous AI agents that makes you nervous? The autonomy? The blast radius? The fact that it runs while you sleep? I've been wrestling with the same questions across client engagements and I don't have clean answers yet.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on AWS architecture, DevOps, and AI Infrastructure:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@TechwithSarvar" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="mailto:simplynadaf@gmail.com"&gt;Email&lt;/a&gt; | &lt;a href="https://builder.aws.com/community/@sarvar" rel="noopener noreferrer"&gt;AWS Builder Center&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>showdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Introducing Kiro Crew: AWS's Open-Source AI Agent Orchestrator</title>
      <dc:creator>Sarvar Nadaf</dc:creator>
      <pubDate>Wed, 05 Aug 2026 13:51:22 +0000</pubDate>
      <link>https://dev.to/aws-builders/introducing-kiro-crew-awss-open-source-ai-agent-orchestrator-1e63</link>
      <guid>https://dev.to/aws-builders/introducing-kiro-crew-awss-open-source-ai-agent-orchestrator-1e63</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/XTJF6WXWbIQ" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;It's Friday afternoon. You're wrapping up. A teammate pings about a latency spike and needs your help investigating. You know the drill: pull up CloudWatch, cross-reference three repos, check the last time this happened, run diagnostic queries. None of it is hard. All of it requires you to be the glue between six different tools.&lt;/p&gt;

&lt;p&gt;What if you could message your AI agents, say "find what we did last time, write it up, send it to the team," and head out?&lt;/p&gt;

&lt;p&gt;That's Kiro Crew. And it launched on August 4, 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What Kiro Crew actually is&lt;/li&gt;
&lt;li&gt;The problem it solves (and why I care)&lt;/li&gt;
&lt;li&gt;Core capabilities&lt;/li&gt;
&lt;li&gt;How it fits in the Kiro ecosystem&lt;/li&gt;
&lt;li&gt;Where I would have used this last month&lt;/li&gt;
&lt;li&gt;Real use cases worth trying first&lt;/li&gt;
&lt;li&gt;Getting started&lt;/li&gt;
&lt;li&gt;Pricing reality check&lt;/li&gt;
&lt;li&gt;What to watch out for&lt;/li&gt;
&lt;li&gt;The bigger picture&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Kiro Crew actually is
&lt;/h2&gt;

&lt;p&gt;Kiro Crew is an open-source (Apache 2.0), persistent development workspace. An orchestration layer that coordinates multiple AI agents, preserves context across sessions, schedules recurring work, and keeps running while you're offline.&lt;/p&gt;

&lt;p&gt;The origin story matters. Three engineers inside Amazon built a side project called MeshClaw. They wanted something simple: kick off a task, walk away, come back to something reviewable. Run several tasks at once instead of babysitting one prompt at a time.&lt;/p&gt;

&lt;p&gt;Then other Amazon builders picked it up. Not because someone mandated it. Because engineers kept hitting gaps in their workflows, fixing them, and pushing the fix upstream. In less than six months, 39,000+ Amazon builders adopted it. Nearly 500 contributors shipped 597 updates at an average pace of 143 weekly commits.&lt;/p&gt;

&lt;p&gt;That organic adoption is the strongest signal. The fact that thousands of engineers chose to use it and hundreds chose to improve it tells you more than any feature list.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem it solves (and why I care)
&lt;/h2&gt;

&lt;p&gt;After 10+ years of building cloud infrastructure across client engagements, I've accepted a frustrating truth: I spend more time being the "glue" between tools than doing actual engineering work.&lt;/p&gt;

&lt;p&gt;The Kiro Crew blog post nails this. Developers are the integration layer between their own tools.&lt;/p&gt;

&lt;p&gt;I feel this every single day. I have Kiro CLI open, CloudWatch in one tab, GitHub in another, a Slack thread I need to follow up on, three PRs waiting for review, and a deployment that broke overnight. The moment I step away, everything stalls. Nobody reconnects the context. Nobody pushes the migration forward. Nobody notices the flaky test reappeared.&lt;/p&gt;

&lt;p&gt;I've been using Kiro CLI for months now. It's good inside a single session. You prompt, it responds, it does solid work. But close the tab? Next time you open it, the context is gone. You spend the first ten minutes re-explaining what you're working on. Your steering files carry over, but the working memory of "where were we?" doesn't.&lt;/p&gt;

&lt;p&gt;Kiro Crew breaks that pattern by making the workspace persistent. Memory carries forward. Corrections become lasting lessons. Repeated patterns become reusable skills. And work continues on a schedule even when you're not at your keyboard.&lt;/p&gt;

&lt;p&gt;As an AWS Community Builder who's been writing about Kiro since its IDE launch, I've watched this product evolve from a spec-driven coding tool into something approaching a genuine engineering platform. Crew is the piece that makes the others click together.&lt;/p&gt;




&lt;h2&gt;
  
  
  Core capabilities
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Self-learning memory
&lt;/h3&gt;

&lt;p&gt;This isn't just "remembers your last conversation." Crew maintains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: preferences, active projects, relevant history across sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lessons&lt;/strong&gt;: corrections you make become persistent rules. Tell it once to stop using &lt;code&gt;var&lt;/code&gt;, and it never does again. Workspace-scoped, so project A's rules don't bleed into project B.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt;: repeated patterns get synthesized into named, inspectable Markdown files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge graph&lt;/strong&gt;: architectural decisions, coding preferences, project context stored with vector embeddings and full-text search.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything's visible. Edit it, delete it, scope it. No magic black box learning you can't audit.&lt;/p&gt;

&lt;p&gt;If you've been using Kiro CLI with &lt;code&gt;.kiro&lt;/code&gt; steering files and custom skills, you already know the value of persistent instructions. Crew takes that same principle and applies it to the agent's own working memory between sessions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scheduled and unattended work
&lt;/h3&gt;

&lt;p&gt;This is where Crew separates from every other AI coding tool I've used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cron jobs&lt;/strong&gt;: timezone-aware, per-job timeouts, jitter to avoid thundering herds, skip dates for maintenance windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks&lt;/strong&gt;: authenticated endpoints trigger agent work when external events arrive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heartbeats&lt;/strong&gt;: watches state changes in PRs, deployments, pipelines. Triggers work when conditions are met.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkpoints and retries&lt;/strong&gt;: long-running tasks save progress and resume after failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key detail: jobs that don't require model reasoning run as plain scripts. No inference call, no credit consumption. A health check script costs nothing. Only reasoning costs credits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-agent orchestration
&lt;/h3&gt;

&lt;p&gt;Crew can run several conversations concurrently, each with isolated context. It delegates independent research and implementation to sub-agents, then returns results to a parent conversation that stays focused on the goal.&lt;/p&gt;

&lt;p&gt;You give it a migration task. It spawns one agent to analyze the source code, another to write the target code, another to handle tests. The parent coordinates. I've been waiting for this pattern since I started using Kiro's sub-agent feature in the CLI, which works but forces you to stay in the loop for every handoff.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apps (purpose-built interfaces)
&lt;/h3&gt;

&lt;p&gt;Some work doesn't belong in a chat window. Apps wrap agents, skills, schedules, and integrations into custom UIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DevFleets&lt;/strong&gt;: work tree management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task Runner&lt;/strong&gt;: long-running task execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue Radar&lt;/strong&gt;: PR and issue triage with readiness labels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Review Sage&lt;/strong&gt;: reviews by blast radius, stages draft GitHub reviews&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research Lab&lt;/strong&gt;: fans out sub-questions to parallel agents, streams findings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build your own with the App SDK (TypeScript or Python). Combine React UI with the agent runtime and event bus.&lt;/p&gt;

&lt;h3&gt;
  
  
  7 layers of security
&lt;/h3&gt;

&lt;p&gt;Giving an agent real access to your code and CI demands real security. This matters especially if you're working with enterprise clients where compliance isn't optional. Crew ships with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;OS-level process sandbox&lt;/li&gt;
&lt;li&gt;Tool approval gates (you decide what runs)&lt;/li&gt;
&lt;li&gt;Sensitive path blocking&lt;/li&gt;
&lt;li&gt;Write-protected paths&lt;/li&gt;
&lt;li&gt;Denied command patterns and suspicious bash blocking&lt;/li&gt;
&lt;li&gt;MCP input validation and output redaction&lt;/li&gt;
&lt;li&gt;Credential redaction and signed audit logs (SEL)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because it's open source, you can verify every layer. Read the code, trace the execution path, confirm the sandbox actually sandboxes. For my consulting clients, the "show me the source" conversation just got a lot easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it fits in the Kiro ecosystem
&lt;/h2&gt;

&lt;p&gt;Kiro now has four surfaces: IDE, CLI, Web, and Crew. Here's how they relate:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Kiro IDE&lt;/th&gt;
&lt;th&gt;Kiro CLI&lt;/th&gt;
&lt;th&gt;Kiro Web&lt;/th&gt;
&lt;th&gt;Kiro Crew&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sessions&lt;/td&gt;
&lt;td&gt;Interactive&lt;/td&gt;
&lt;td&gt;Interactive&lt;/td&gt;
&lt;td&gt;Interactive&lt;/td&gt;
&lt;td&gt;Persistent, autonomous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduling&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Cron, webhooks, heartbeats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-agent&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Sub-agents&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Full parallel orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Session only&lt;/td&gt;
&lt;td&gt;Session only&lt;/td&gt;
&lt;td&gt;Session only&lt;/td&gt;
&lt;td&gt;Cross-session persistent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works unattended&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (Apache 2.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Crew runs on the Kiro CLI and reads your existing &lt;code&gt;.kiro&lt;/code&gt; configuration. Steering files, skills, custom agents all carry over. No migration. No reconfiguration. If you already use Kiro, Crew is additive.&lt;/p&gt;

&lt;p&gt;It also uses &lt;strong&gt;Agent Client Protocol (ACP)&lt;/strong&gt; for orchestration, meaning every step is observable live. You watch how it plans, spawns sub-agents, selects tools, gates actions for approval, and synthesizes results.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I would have used this last month
&lt;/h2&gt;

&lt;p&gt;Let me give you three real scenarios from my past few weeks where Crew would have saved me hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The CDK migration that stalled every evening.&lt;/strong&gt; I was migrating a client's CloudFormation stacks to CDK. Each stack took 20-40 minutes of agent time in Kiro CLI: analyzing the template, generating CDK constructs, running &lt;code&gt;cdk synth&lt;/code&gt; to validate. I could do maybe 3-4 stacks per session before context started degrading and I needed to re-explain the project conventions. With Crew's checkpoints and persistent memory? I could have queued all 12 stacks, let it chew through them overnight, and come back to a PR with all the synthesized outputs validated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Monday morning "what happened over the weekend" scramble.&lt;/strong&gt; Every Monday I open Slack to 40+ messages, check three repos for new PRs, look at whether the weekend deploy held, and scan CloudWatch for anomalies. This takes me 45 minutes before I write a single line of code. A Crew morning digest cron job does this in 5 minutes and hands me a summary before my first coffee. Zero credits for the Slack scan and CloudWatch check (plain scripts), minimal credits for summarizing findings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The recurring dependency update nobody does.&lt;/strong&gt; I have a personal project with 15 npm dependencies I should update monthly. I never do. A weekly Crew heartbeat could check for security advisories, test the updates, and open a PR only when tests pass. Cost: nearly zero because most runs would be "nothing to update" (plain script check) with the occasional reasoning call when something actually needs upgrading.&lt;/p&gt;

&lt;p&gt;These aren't hypothetical AI demos. These are the exact gaps in my current Kiro CLI workflow that made me sit up when Crew launched.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real use cases worth trying first
&lt;/h2&gt;

&lt;p&gt;Don't start with something complex. Start with work that already extends beyond one session.&lt;/p&gt;

&lt;h3&gt;
  
  
  Morning PR digest
&lt;/h3&gt;

&lt;p&gt;Schedule a daily cron job that checks open PRs, summarizes status, and flags what needs your attention. You get a briefing before your first coffee. The plain "list open PRs" part is a script (zero credits). The "summarize what changed and whether it's ready for review" part takes one reasoning call (2-3 credits). Compare that to the 45 minutes you currently spend manually scanning GitHub every morning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flaky test hunter
&lt;/h3&gt;

&lt;p&gt;Set a heartbeat on your CI pipeline. When a test fails twice in a row, Crew investigates the logs, identifies the pattern, and opens a fix PR. This one is personal. I have a test suite where &lt;code&gt;test_concurrent_writes&lt;/code&gt; fails every third run due to a timing issue I've been "meaning to fix" for two months. A heartbeat that catches and fixes it without me ever opening the file? That's worth the credits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Incident investigation across repos
&lt;/h3&gt;

&lt;p&gt;Point it at an alert. It pulls logs from multiple repos, correlates timestamps, identifies the likely root cause. You stay focused on the fix while Crew handles the forensics. For anyone who's ever spent an hour jumping between CloudWatch, ECS task logs, and application traces during an incident, having a dedicated investigation agent running in parallel changes the speed of resolution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependency drift detection
&lt;/h3&gt;

&lt;p&gt;Weekly cron that checks for outdated packages, stale branches, docs that no longer match the code, and failing test suites nobody noticed. Most weeks it finds nothing (zero credits, plain script). When it does find something, it opens an issue with the exact versions, breaking changes, and a suggested upgrade path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Long-running migration with checkpoints
&lt;/h3&gt;

&lt;p&gt;Start a multi-hour migration. It proceeds through checkpoints, validates each step, retries failures, and you come back to progress rather than a stalled process. The CDK migration scenario I described earlier is a perfect example. Each stack is a checkpoint. If stack 7 fails validation, Crew retries with a different approach. You don't restart from stack 1.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kiro account (free tier works for testing, Pro+ recommended for real use)&lt;/li&gt;
&lt;li&gt;Kiro CLI installed and authenticated&lt;/li&gt;
&lt;li&gt;macOS, Linux, or Windows&lt;/li&gt;
&lt;li&gt;Familiarity with &lt;code&gt;.kiro&lt;/code&gt; configuration (steering files, skills)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repo&lt;/span&gt;
git clone https://github.com/kirodotdev/KiroCrew

&lt;span class="c"&gt;# Or download from releases (macOS, Linux, Windows)&lt;/span&gt;
&lt;span class="c"&gt;# https://github.com/kirodotdev/KiroCrew/releases&lt;/span&gt;

&lt;span class="c"&gt;# Core commands&lt;/span&gt;
kirocrew chat     &lt;span class="c"&gt;# Start a session&lt;/span&gt;
kirocrew run      &lt;span class="c"&gt;# Execute a task&lt;/span&gt;
kirocrew cron     &lt;span class="c"&gt;# Manage scheduled jobs&lt;/span&gt;
kirocrew spawn    &lt;span class="c"&gt;# Spawn parallel agents&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Your existing &lt;code&gt;.kiro&lt;/code&gt; config carries over automatically. Steering files, skills, custom agents, all of it. If you've invested time in your Kiro setup, that investment transfers directly.&lt;/p&gt;

&lt;p&gt;The desktop app (Electron) needs no Python or npm installation. Download and run. The web dashboard gives you multi-session chat, memory explorer, cron manager, and an app store across 14 color themes. You can also connect Slack, Telegram, Discord, or WeCom to interact with your crew from any surface.&lt;/p&gt;


&lt;h2&gt;
  
  
  Pricing reality check
&lt;/h2&gt;

&lt;p&gt;Kiro Crew itself costs nothing. It's Apache 2.0. But agents need inference, and inference needs a Kiro plan.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;th&gt;Credits Included&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;50 credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;1,000 credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro+&lt;/td&gt;
&lt;td&gt;$40&lt;/td&gt;
&lt;td&gt;2,000 credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro Max&lt;/td&gt;
&lt;td&gt;$100&lt;/td&gt;
&lt;td&gt;5,000 credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power&lt;/td&gt;
&lt;td&gt;$200&lt;/td&gt;
&lt;td&gt;10,000 credits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Add-on credits: $0.04 each. Scheduled jobs that run plain scripts (health checks, simple git operations) consume zero credits. Only reasoning calls cost you.&lt;/p&gt;

&lt;p&gt;How does this compare to alternatives? Devin's Teams plan starts at $500/month (with the Core plan at $20/month for lighter usage). OpenAI Codex requires API spend that scales unpredictably. Crew's advantage: you know exactly what you're spending, and most scheduled maintenance jobs cost nothing.&lt;/p&gt;

&lt;p&gt;The real cost question is: how many credits does a typical cron job burn? Based on my Kiro CLI usage patterns, a simple "check PRs and summarize" task runs about 2-3 credits. A complex "investigate failing tests and propose a fix" might run 8-12 credits. On the Pro plan ($20/month, 1,000 credits), you could run a morning digest every workday and still have 900+ credits for interactive work.&lt;/p&gt;


&lt;h2&gt;
  
  
  What to watch out for
&lt;/h2&gt;

&lt;p&gt;I want to be honest about the limitations. Because every "introducing" article pretends there aren't any.&lt;/p&gt;

&lt;p&gt;The Kiro plan dependency is real. Crew is open source, but the CLI it runs on requires a Kiro account and credits. Until someone builds and validates a connector for a different agent runtime, you're locked to Kiro's inference. Michael Leone from Moor Strategy put it directly: "Until someone runs a different agent under Crew and shows it working, the open part stops at the orchestration layer."&lt;/p&gt;

&lt;p&gt;If you're already using Claude Code, Codex, or Devin, you can't plug them into Crew today. The ACP protocol is open, but integrations need to be built and tested. This is day one. The connectors will come, but they don't exist yet.&lt;/p&gt;

&lt;p&gt;Parallel agents multiply costs. Three sub-agents working simultaneously burn three times the credits. I've learned this the hard way with Kiro CLI's sub-agent feature: what feels like one task can spawn four reasoning calls. Architect your workflows to use sequential execution where order matters, and parallel only for genuinely independent work.&lt;/p&gt;

&lt;p&gt;Stephanie Walter from HyperFRAME Research raises a point I agree with from my enterprise consulting experience: before you let persistent agents operate across your repos and CI/CD pipelines, you need policies for least-privilege access, human approvals, memory retention, and auditability. The security layers exist in Crew, but your organization needs to decide how to configure them.&lt;/p&gt;

&lt;p&gt;And the most important caveat: Crew won't architect your system. It won't make design decisions. It won't tell you whether to pick ECS over Lambda for your specific workload. It coordinates and executes. You still need to be the engineer who decides what to build and why.&lt;/p&gt;


&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;The trajectory is clear: AI assistants, then AI agents, now AI teams. We've been living in the "agents" phase for the past year. Kiro Crew pushes toward teams.&lt;/p&gt;

&lt;p&gt;Not teams that replace developers. Teams that handle the integration work, the monitoring, the routine maintenance, the context reconnection between sessions. So you can spend your time on system design, architecture decisions, and the complex problems that actually need a human brain.&lt;/p&gt;

&lt;p&gt;I think about this from an enterprise architecture perspective. Every organization I've worked with in the past three years has developers using AI coding tools in some form. But it's almost entirely shadow IT. Individual engineers wiring up their own agents, using personal credentials, nobody tracking what ran or what it touched. Michael Leone from Moor Strategy sees the same thing: "Agent use inside most companies right now is shadow IT. A shared workspace with approval gates and logging gives you one place to see what ran, what it touched, and who authorized it."&lt;/p&gt;

&lt;p&gt;That's the real value proposition for platform engineering teams considering Crew. It's not "make developers faster." It's "make AI agent usage visible, auditable, and governable." The security layers, the signed audit logs, the approval gates, those aren't just developer niceties. They're the answer to "how do we let engineers use AI agents without losing control?"&lt;/p&gt;

&lt;p&gt;The open-source angle matters here. A workspace with access to your code, CI, and credentials should not be a black box. You should read the source, trace the execution, verify the security layers. Kiro Crew ships that transparency on day one. For anyone who's been burned by opaque AI tools that silently send your code to third-party servers, this matters.&lt;/p&gt;

&lt;p&gt;Whether you adopt it today or wait for the ecosystem to mature, this pattern is the direction. Persistent, self-learning, multi-agent workspaces that work alongside you across sessions. The question isn't whether this becomes standard. It's who builds theirs first.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kirodotdev" rel="noopener noreferrer"&gt;
        kirodotdev
      &lt;/a&gt; / &lt;a href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;
        KiroCrew
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A persistent workspace for development work that self-improves and continues beyond one session.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/kirodotdev/KiroCrew/assets/banner.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkirodotdev%2FKiroCrew%2FHEAD%2Fassets%2Fbanner.svg" alt="Kiro Crew. Keep work moving. Runs on your hardware, remembers across sessions, keeps working unattended."&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kiro Crew&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;strong&gt;A persistent workspace for development work that self-improves and continues beyond one session.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://trendshift.io/repositories/103032" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/20d26869a6389d7fba902f5cddb75d8268977b531845622481a8d57020feaa3c/68747470733a2f2f7472656e6473686966742e696f2f6170692f62616467652f7472656e6473686966742f7265706f7369746f726965732f3130333033322f6461696c793f6c616e67756167653d507974686f6e" alt="Kiro Crew on Trendshift" width="250" height="55" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  Kiro Crew is an open source development workspace that runs locally or remotely on
  your hardware. It is persistent, self-learning, and self-evolving. Work with it
  from the desktop app, web dashboard, and CLI, or continue the same work through
  connection tools like Slack and Discord
  Your multi-step tasks can run unattended, recurring jobs run on your schedule
  and heartbeats monitor systems until something needs attention. Kiro Crew Apps
  tailor that experience to a specific job, combining a purpose-built interface
  with agents, skills, schedules, integrations, and backend services.
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5c0b3bb65162f179a15d74b8289d29497db6c407a34891f009b5503bb600f86c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f776e6c6f61642d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3266366665623f7374796c653d666c61742d737175617265" alt="Download Kiro Crew for macOS, Linux, or Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/852641c2b061138b6ee4a6d24baf3d7935ce1e3cc9f7a6b55ceedab8e7183191/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f63756d656e746174696f6e2d3166366665623f7374796c653d666c61742d737175617265" alt="Read the documentation"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/docs/guides/install.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/033bc31482c8749b864e135c691a7d174ab4677bceb1df2f704e9043fb29d146/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f496e7374616c6c25323067756964652d6d61634f532532302537432532304c696e757825323025374325323057696e646f77732d3665373738313f7374796c653d666c61742d737175617265" alt="Install guide for macOS, Linux, and Windows"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0fb57fc16e5b1e9b219f905ec9baf71c552ec6d747e3ea9aa1a19fa1cb7e1f55/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e747269627574696e672d3233383633363f7374796c653d666c61742d737175617265" alt="Contributing guide"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/SECURITY.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dc4e9a0d3d8d49543683714c015505dd8378557c539253626f8f920f515a9beb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53656375726974792d3832353064663f7374796c653d666c61742d737175617265" alt="Security policy"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a84955b84a279eafcaeb1508bf99c1ad0929e84623fb47466c6cf875c436e866/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d417061636865253230322e302d3635366437363f7374796c653d666c61742d737175617265" alt="Apache 2.0 license"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/kirodotdev/KiroCrew#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#build-from-source" rel="noopener noreferrer"&gt;Build from source&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#why-kiro-crew" rel="noopener noreferrer"&gt;Why Kiro Crew&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#what-kiro-crew-does" rel="noopener noreferrer"&gt;Capabilities&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#security-and-control" rel="noopener noreferrer"&gt;Security&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#install-configure-and-operate" rel="noopener noreferrer"&gt;Install&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#anonymous-usage-telemetry" rel="noopener noreferrer"&gt;Telemetry&lt;/a&gt; ·
  &lt;a href="https://github.com/kirodotdev/KiroCrew#docs-and-contributing" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;You choose how to run Kiro Crew: the desktop app with automatic updates, a
one-line install on your machine or a remote…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kirodotdev/KiroCrew" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;Product page: &lt;a href="https://kiro.dev/crew" rel="noopener noreferrer"&gt;kiro.dev/crew&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://kiro.dev/docs/crew/" rel="noopener noreferrer"&gt;kiro.dev/docs/crew&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discord: &lt;a href="https://discord.gg/kirodotdev" rel="noopener noreferrer"&gt;discord.gg/kirodotdev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What are you going to try first with Kiro Crew? I'm starting with the morning PR digest and the CDK migration runner. Curious what workflows eat your time that agents could handle unattended. Drop your ideas below.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on AWS architecture, DevOps, and AI tooling:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://sarvarnadaf.com" rel="noopener noreferrer"&gt;sarvarnadaf.com&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sarvar04/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://dev.to/sarvar_04"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://www.youtube.com/@TechwithSarvar" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; | &lt;a href="mailto:simplynadaf@gmail.com"&gt;Email&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>aws</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
