<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ship Guard]]></title><description><![CDATA[Articles on engineering, AI, and code quality from the creators of Ship Guard. Our mission is to help teams stop shipping the same bugs twice.]]></description><link>https://blog.shipguard.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1761137051256/8d5b6bf0-f4d0-4a3e-9287-1c6a92a731c4.png</url><title>Ship Guard</title><link>https://blog.shipguard.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 03:02:02 GMT</lastBuildDate><atom:link href="https://blog.shipguard.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Introducing Ship Guard: The Only Code Reviewer With a Memory]]></title><description><![CDATA[I built Ship Guard for one simple reason: a team I was on shipped the exact same SQL injection vulnerability to production twice in six months.
The first time was an incident. The second time was a failure not of a person, but of our process.
We did ...]]></description><link>https://blog.shipguard.dev/introducing-ship-guard-the-only-code-reviewer-with-a-memory</link><guid isPermaLink="true">https://blog.shipguard.dev/introducing-ship-guard-the-only-code-reviewer-with-a-memory</guid><category><![CDATA[ship guard]]></category><category><![CDATA[RAG ]]></category><category><![CDATA[incident management software]]></category><category><![CDATA[AI]]></category><category><![CDATA[#ai-tools]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[ProductHunt]]></category><category><![CDATA[peerlist]]></category><category><![CDATA[code review]]></category><dc:creator><![CDATA[Edet Asuquo]]></dc:creator><pubDate>Mon, 27 Oct 2025 10:19:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761556786689/4a60db5b-b3c4-4e0c-853b-9f60e8dda802.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I built <strong>Ship Guard</strong> for one simple reason: a team I was on shipped the <strong>exact same SQL injection vulnerability to production twice in six months.</strong></p>
<p>The first time was an incident. The second time was a failure not of a person, but of our process.</p>
<p>We did everything by the book. We ran a blameless post-mortem. We wrote action items. We documented the root cause. The document was beautifully structured —and utterly useless. Because a few months later, a new developer made the same logical mistake in a different file, and history repeated itself.</p>
<p>The truth hit me hard: our post-mortems were not broken; our <strong>system of memory</strong> was.</p>
<p>We had the knowledge, but it was trapped in a Confluence folder titled <em>“Post-Mortems 2025.”</em><br />A knowledge graveyard.</p>
<p>And that’s when it clicked the problem wasn’t that developers forget. It’s that <strong>our tools don’t remember.</strong></p>
<h2 id="heading-the-aha-moment-what-if-our-tools-could-remember">The “Aha” Moment — What If Our Tools Could Remember?</h2>
<p>I started asking myself: What if our tools could <em>remember</em> for us?<br />What if every lesson from a production incident could automatically resurface when we’re about to repeat it?<br />What if post-mortems weren’t static documents, but <em>active safeguards</em> that scanned our pull requests in real time?</p>
<p>I looked for a tool that could do this. None existed. So, I built it.  </p>
<p>And today, I’m incredibly proud to launch it on <a target="_blank" href="https://www.producthunt.com/products/ship-guard"><strong>Product Hunt</strong></a> <strong>and</strong> <a target="_blank" href="https://peerlist.io/eddy1759/project/ship-guard"><strong>Peerlist</strong></a>  </p>
<p><a target="_blank" href="https://www.producthunt.com/products/ship-guard?embed=true&amp;utm_source=badge-featured&amp;utm_medium=badge&amp;utm_source=badge-ship-guard"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761559994854/c23d1c24-4817-4be4-807e-9a53127098a9.png" alt class="image--center mx-auto" /></a></p>
<p><a target="_blank" href="https://peerlist.io/eddy1759/project/ship-guard"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761559766964/ef062b37-e175-4981-af4e-53af37dbacff.png" alt class="image--center mx-auto" /></a></p>
<h2 id="heading-introducing-ship-guard-the-ai-code-reviewer-that-learns-from-your-mistakes">Introducing Ship Guard : The AI Code Reviewer That Learns From Your Mistakes</h2>
<p>Ship Guard is the <strong>AI code reviewer with a memory.</strong><br />It doesn’t just review your code it remembers your incidents, learns from them, and prevents you from shipping the same bug twice.</p>
<h3 id="heading-the-core-feature-incident-memory">The Core Feature: Incident Memory</h3>
<p>Here’s how it works:</p>
<ol>
<li><p>You experience a production incident say, an unhandled <code>NullReferenceException</code>.</p>
</li>
<li><p>You summarize the incident and add it to <strong>Ship Guard’s Incident Memory</strong>.</p>
</li>
<li><p>Weeks later, when a new PR introduces semantically similar code (like another missing validation), Ship Guard’s <strong>RAG-based system</strong> automatically retrieves that memory.</p>
</li>
<li><p>It then posts a detailed comment directly on the PR:</p>
<blockquote>
<p>⚠️ <em>“This code looks similar to INC-042, which caused a production outage in April. Here’s what we learned from that incident and how it was fixed.”</em></p>
</blockquote>
</li>
</ol>
<p>No shaming. No guesswork. Just context right when it matters.</p>
<p>Your team doesn’t have to <em>remember</em> what went wrong last quarter.<br />Ship Guard does that for you.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761559569487/a91a759c-4312-4643-8319-798865a7d0ca.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-more-than-one-feature-a-full-platform">More Than One Feature: A Full Platform</h3>
<p>Incident Memory is the heart, but Ship Guard is a complete platform for intelligent, automated reviews:</p>
<ul>
<li><p><strong>AI-Powered Reviews:</strong> High-signal, low-noise PR reviews that catch logical bugs, anti-patterns, and risky changes.</p>
</li>
<li><p><strong>Deterministic Rules</strong>: Simple YAML-based rules to block TODOs, enforce changelogs, or require tests.</p>
</li>
<li><p><strong>Secure &amp; Async Architecture</strong>: Built as a <strong>multi-tenant app</strong> with <strong>BullMQ + Redis</strong> for async job handling, ensuring performance even under high webhook volumes.</p>
</li>
<li><p><strong>Private by Design:</strong> All code is processed securely; your repository data never leaves your workspace.</p>
</li>
</ul>
<p>Ship Guard plugs directly into your GitHub workflow, it’s like adding an engineer who never forgets.</p>
<h3 id="heading-ia"> </h3>
<p>The Proof — Why You Should Trust This</p>
<p>I didn’t just build Ship Guard for fun I built it because I was tired of the same post-mortem déjà vu that every engineering team lives through.</p>
<p>We’ve been testing it with a few early pilot teams over the last few months, and the results have blown me away:</p>
<ul>
<li><p><strong>40% fewer repeat bug incidents</strong> across their repos.</p>
</li>
<li><p><strong>PR review turnaround time cut in half.</strong></p>
</li>
<li><p>Engineers reporting fewer “false alarms” and more <em>trust</em> in their AI reviewer.</p>
</li>
</ul>
<p>One lead engineer put it perfectly:</p>
<blockquote>
<p>“Ship Guard doesn’t just review code — it remembers who we’ve been.”</p>
</blockquote>
<p>That’s the point. We don’t need smarter reviewers; we need <em>remembering</em> ones.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761559708058/d37d0a2c-6b33-4ba0-8b4f-d511eff86dfc.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-the-launch-and-a-personal-ask">The Launch — And a Personal Ask</h2>
<p>After months of late nights, false starts, and too much caffeine, I’m thrilled to finally share <strong>Ship Guard</strong> with you.</p>
<p>👉 <strong>Try it today:</strong> <a target="_blank" href="https://shipguard.dev/">shipguard.dev</a><br />You can start a <strong>14-day free trial — no credit card required.</strong></p>
<p>I built Ship Guard because I believe <strong>our tools should carry our institutional memory for us.</strong> Not in docs. Not in wikis. But in the actual systems that guard our code.</p>
<p>If you’ve ever shipped the same bug twice this one’s for you.<br />Come say hi, give feedback, or tell me what you’d love to see next:<br />👉 <a target="_blank" href="https://www.producthunt.com/products/ship-guard"><strong>Join the conversation on Product Hunt</strong></a> <strong><em>or</em></strong> <a target="_blank" href="https://peerlist.io/eddy1759/project/ship-guard"><strong>Join the conversation</strong></a> <a target="_blank" href="https://peerlist.io/eddy1759/project/ship-guard"><strong><em>on Peerlist</em></strong></a></p>
<p>See you there.<br />— <strong>Edet</strong>, Founder &amp; Principal Engineer <a class="user-mention" href="https://hashnode.com/@shipguard">Ship Guard</a></p>
]]></content:encoded></item><item><title><![CDATA[Your Post-Mortems Are Useless (Unless You Automate Them)]]></title><description><![CDATA[It’s 3 AM and PagerDuty is screaming. The coffee is gone. The war room is a chorus of half-formed sentences and console logs. We push a hotfix, traffic calms, and the on call engineer gets a well earned sigh of relief. Then we do the civilized thing:...]]></description><link>https://blog.shipguard.dev/your-post-mortems-are-useless-unless-you-automate-them</link><guid isPermaLink="true">https://blog.shipguard.dev/your-post-mortems-are-useless-unless-you-automate-them</guid><category><![CDATA[engineering]]></category><category><![CDATA[SRE]]></category><category><![CDATA[Devops]]></category><category><![CDATA[postmortem]]></category><dc:creator><![CDATA[Edet Asuquo]]></dc:creator><pubDate>Wed, 22 Oct 2025 13:57:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761138564406/28622521-f8b5-478b-b628-a8a1f38ae891.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It’s 3 AM and PagerDuty is screaming. The coffee is gone. The war room is a chorus of half-formed sentences and console logs. We push a hotfix, traffic calms, and the on call engineer gets a well earned sigh of relief. Then we do the civilized thing: a blameless post-mortem. We gather, we 5-Why it, we map the timeline, we write down <em>Action Item</em> and <em>Lessons Learned.</em> We publish the doc. We feel like grownups.</p>
<blockquote>
<p>Good process. Good intent. Zero guarantee we won't ship the same bug again.</p>
</blockquote>
<p>Let’s be honest. The modern blameless post-mortem is one of the proudest rituals in engineering. We’ve moved away from finger-pointing. We document timelines. We identify root causes a <code>NullReferenceException</code>, un-validated config, a race condition in the dispatcher. We produce a tidy list of actions: a new test here, a code review guideline there, an alert tuned in PagerDuty.</p>
<p>Then that document quietly dies.</p>
<h2 id="heading-the-knowledge-graveyard">The Knowledge Graveyard</h2>
<p>Where is that post-mortem a month later? In Confluence, in a Google Drive, in a wiki with a dozen other post-mortem documents. A knowledge graveyard. Someone might skim it before an annual audit. Maybe an engineer links it in a Slack thread and we all feel virtuous for 2 hours. Mostly, it sits. Passive. Waiting for someone to remember it when the next incident comes along.</p>
<p>That’s the real problem. We treat institutional knowledge like osmosis: hire more people, create more docs, and assume lessons will soak in. They don’t. New hires don't magically inherit your team's failure history. The person who introduces the same bug six months later has read the handbook the same amount as the rest of us: not enough.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761139441620/163e6f29-4fbd-42fb-a0a1-c679d72a296f.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-the-inevitable-repeat">The Inevitable Repeat</h2>
<p>And then it happens. A fresh pull request lands. Different developer. Different file. Different microservice. But the <em>same bug pattern</em>: the same unchecked input, the same race window, the same edge case that previously brought your system to its knees.</p>
<p>The first time you face it, you learn. The second time, you get angry. The third time, you start to doubt your processes.</p>
<p>This isn’t a human failing. It's a process failing. The post-mortem document is a passive artifact.</p>
<blockquote>
<p>A lesson that sits in a doc is indistinguishable, for practical purposes, from a lesson that was never learned.</p>
</blockquote>
<p>We measure success by whether the doc exists, not whether the failure class is prevented. If you want to prevent repeat incidents, the value of a post-mortem is not its prose. The value is the lesson. And a lesson only counts if it changes behavior <em>before</em> the next deploy.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761139640882/c987c65b-f61b-4e06-bfd3-fa33145e54b6.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-from-passive-history-to-active-safeguards">From Passive History to Active Safeguards</h2>
<p>So what does that look like? Let me be provocative: <strong>stop treating post-mortems as history, and start treating them as code.</strong></p>
<p>Imagine moving the lesson from a page into the places where code actually changes.</p>
<ul>
<li><p>What if your CI/CD pipeline could <em>remember</em> that incident?</p>
</li>
<li><p>What if your code review process could surface relevant past failures the moment a pull request touches similar logic?</p>
</li>
<li><p>What if, during a review, a developer could instantly see: “Heads up this block looks like the code that caused INC-245 in Q2. Here’s the root cause and the mitigation that worked.”</p>
</li>
</ul>
<p>That’s not magic. It’s making lessons active and programmatic instead of passive and archival.</p>
<p>This would change incentives immediately. Action items listed in a doc would no longer be checkboxes for compliance; they’d become enforcement points in the workflow. When a past failure is represented as something the pipeline can reason about, a new engineer gets protection from day one. The system carries institutional memory for the team.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761139968793/4c487977-5409-4fe1-9fd7-454370d669dd.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-stop-documenting-start-enforcing">Stop Documenting, Start Enforcing</h2>
<p>I’m not arguing we stop writing post-mortems. Write them. They’re invaluable for analysis and growth. But don't stop at the doc. Treat the post-mortem like a spec: extract the invariant that caused the incident, codify it into checks, and push those checks as early as possible in your delivery chain.</p>
<blockquote>
<p>A lesson is only learned if it prevents a repeat failure. Anything else is vanity.</p>
</blockquote>
<p>We’ve perfected blameless post-mortems as a cultural practice. Now let's perfect them as a technical practice.</p>
<p>Ask yourself honestly: how many bugs has your team shipped more than once? Not how many have we documented, but how many have we prevented the second time?</p>
<p><strong>What's a bug your team has shipped more than once?</strong></p>
]]></content:encoded></item></channel></rss>