<?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: Aviad Shakargy</title>
    <description>The latest articles on DEV Community by Aviad Shakargy (@shakargy).</description>
    <link>https://dev.to/shakargy</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%2F3944913%2Fd149c8a2-52c2-4ab1-95ca-78577227792b.png</url>
      <title>DEV Community: Aviad Shakargy</title>
      <link>https://dev.to/shakargy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shakargy"/>
    <language>en</language>
    <item>
      <title>I built DevTime - a local-first CLI that helps a repo explain itself from evidence</title>
      <dc:creator>Aviad Shakargy</dc:creator>
      <pubDate>Tue, 23 Jun 2026 17:25:41 +0000</pubDate>
      <link>https://dev.to/shakargy/i-built-devtime-a-local-first-cli-that-helps-a-repo-explain-itself-from-evidence-b58</link>
      <guid>https://dev.to/shakargy/i-built-devtime-a-local-first-cli-that-helps-a-repo-explain-itself-from-evidence-b58</guid>
      <description>&lt;p&gt;Git remembers code.&lt;/p&gt;

&lt;p&gt;It remembers what changed, who changed it, and when.&lt;/p&gt;

&lt;p&gt;But it does not remember &lt;em&gt;understanding&lt;/em&gt;. It does not tell you why a behavior exists, what evidence supports it, what nobody has decided yet, or where a risky change may be touching an important concept.&lt;/p&gt;

&lt;p&gt;That is the problem I started working on with &lt;strong&gt;DevTime&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DevTime is a local-first Engineering Intelligence CLI that scans a repository and helps it explain itself from evidence.&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/Shakargy" rel="noopener noreferrer"&gt;
        Shakargy
      &lt;/a&gt; / &lt;a href="https://github.com/Shakargy/devtime" rel="noopener noreferrer"&gt;
        devtime
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local-first Engineering Intelligence for software repositories.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;DevTime&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Local-first Engineering Intelligence for software repositories.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DevTime helps a repository explain itself from evidence. It scans code, tests
configs, routes, and decisions to identify the concepts inside a codebase, show the
evidence behind them, surface uncertainty, and warn about risky changes.&lt;/p&gt;
&lt;p&gt;It does not execute your code. It does not send your code anywhere. It does not
require AI. It does not pretend to know things without evidence.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No cloud. No telemetry. No code execution. No AI required.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Git remembers &lt;em&gt;code&lt;/em&gt;. It does not remember &lt;em&gt;understanding&lt;/em&gt; - why a behavior exists,
what evidence supports it, or what nobody has decided yet. As AI tools generate code
faster than teams can review it, that missing understanding becomes the bottleneck.&lt;/p&gt;
&lt;p&gt;DevTime builds &lt;strong&gt;evidence-backed repository memory&lt;/strong&gt;: a local layer that says what a
repository can prove, and - just as importantly - what it cannot prove yet.&lt;/p&gt;
&lt;div class="markdown-heading"&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/Shakargy/devtime" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/1Hiu3Y9J_SI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  What DevTime Does
&lt;/h2&gt;

&lt;p&gt;DevTime creates local repository memory. You can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dtc init
dtc scan
dtc concepts
dtc explain &lt;span class="s2"&gt;"Billing Webhooks"&lt;/span&gt;
dtc risk &lt;span class="nt"&gt;--diff&lt;/span&gt;
dtc context &lt;span class="s2"&gt;"Authentication"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It scans the repo locally, stores memory in &lt;code&gt;.devtime/&lt;/code&gt;, detects known software concepts, links claims to evidence, and shows uncertainty when evidence is missing or weak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For example, it can say:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This repo appears to have Billing Webhooks.&lt;/li&gt;
&lt;li&gt;Here are the files that support that claim.&lt;/li&gt;
&lt;li&gt;Here is what is still uncertain.&lt;/li&gt;
&lt;li&gt;No decision was found explaining retry strategy.&lt;/li&gt;
&lt;li&gt;This diff changed retry behavior without duplicate-delivery test changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;That last part matters because DevTime should not pretend to know more than the repository can prove.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  What DevTime Does Not Do
&lt;/h2&gt;

&lt;p&gt;V0 is intentionally narrow. DevTime does &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload your code&lt;/li&gt;
&lt;li&gt;Send telemetry&lt;/li&gt;
&lt;li&gt;Execute repository code during scan&lt;/li&gt;
&lt;li&gt;Require AI&lt;/li&gt;
&lt;li&gt;Claim to understand every repository&lt;/li&gt;
&lt;li&gt;Replace code review&lt;/li&gt;
&lt;li&gt;Act as a security scanner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is a heuristic tool with a closed set of supported concept families in V0.&lt;/p&gt;

&lt;p&gt;The goal is not magic. The goal is &lt;strong&gt;evidence-backed repository memory&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;AI coding tools are making code generation faster. But faster code generation creates a new problem: teams can produce changes faster than they can understand the system around those changes.&lt;/p&gt;

&lt;p&gt;DevTime is built around one idea:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI writes. EI remembers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Engineering Intelligence (EI), at least the way I am thinking about it, means a repository should be able to explain what it knows, what evidence supports that knowledge, and what is still uncertain.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Rule I Care About Most
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No claim without evidence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If evidence is weak, DevTime should not sound confident. It should show uncertainty. That is why one of the main product principles is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Uncertainty is a feature, not a bug.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If DevTime says "I cannot prove this yet", that is not a failure. That is the product being honest.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is in v0.1.0?
&lt;/h2&gt;

&lt;p&gt;The first public release includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local SQLite repository memory&lt;/li&gt;
&lt;li&gt;Local scan &amp;amp; concept detection&lt;/li&gt;
&lt;li&gt;Evidence-backed explanations&lt;/li&gt;
&lt;li&gt;Understanding Score and Understanding Debt&lt;/li&gt;
&lt;li&gt;Context Packs for humans and agents&lt;/li&gt;
&lt;li&gt;Narrow advisory &lt;code&gt;risk --diff&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Issue template for "DevTime got this wrong"&lt;/li&gt;
&lt;li&gt;Apache-2.0 license&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Current V0 concept families include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Billing Webhooks&lt;/li&gt;
&lt;li&gt;Background Jobs&lt;/li&gt;
&lt;li&gt;Data Export&lt;/li&gt;
&lt;li&gt;Admin Permissions&lt;/li&gt;
&lt;li&gt;File Uploads&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Quick Install
&lt;/h2&gt;

&lt;p&gt;Clone the repo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Shakargy/devtime.git
&lt;span class="nb"&gt;cd &lt;/span&gt;devtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Create a virtual environment:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Activate it on macOS/Linux:&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;source&lt;/span&gt; .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Activate it on Windows PowerShell:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;venv&lt;/span&gt;&lt;span class="n"&gt;\Scripts\Activate.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Install DevTime:&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="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[dev]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run the demo repo:&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;cd &lt;/span&gt;examples/demo-saas
dtc init
dtc scan
dtc concepts
dtc explain &lt;span class="s2"&gt;"Billing Webhooks"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  What I Want Feedback On
&lt;/h2&gt;

&lt;p&gt;The most useful feedback is not "nice project". The most useful feedback is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DevTime got this concept wrong&lt;/li&gt;
&lt;li&gt;This claim is too strong&lt;/li&gt;
&lt;li&gt;This uncertainty is missing&lt;/li&gt;
&lt;li&gt;This evidence is weak&lt;/li&gt;
&lt;li&gt;This repo structure confused it&lt;/li&gt;
&lt;li&gt;The install flow failed&lt;/li&gt;
&lt;li&gt;The wording is misleading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That kind of feedback can become a fixture and make the tool more trustworthy.&lt;/p&gt;
&lt;h2&gt;
  
  
  Links
&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/Shakargy" rel="noopener noreferrer"&gt;
        Shakargy
      &lt;/a&gt; / &lt;a href="https://github.com/Shakargy/devtime" rel="noopener noreferrer"&gt;
        devtime
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local-first Engineering Intelligence for software repositories.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;DevTime&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Local-first Engineering Intelligence for software repositories.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DevTime helps a repository explain itself from evidence. It scans code, tests
configs, routes, and decisions to identify the concepts inside a codebase, show the
evidence behind them, surface uncertainty, and warn about risky changes.&lt;/p&gt;
&lt;p&gt;It does not execute your code. It does not send your code anywhere. It does not
require AI. It does not pretend to know things without evidence.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No cloud. No telemetry. No code execution. No AI required.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Git remembers &lt;em&gt;code&lt;/em&gt;. It does not remember &lt;em&gt;understanding&lt;/em&gt; - why a behavior exists,
what evidence supports it, or what nobody has decided yet. As AI tools generate code
faster than teams can review it, that missing understanding becomes the bottleneck.&lt;/p&gt;
&lt;p&gt;DevTime builds &lt;strong&gt;evidence-backed repository memory&lt;/strong&gt;: a local layer that says what a
repository can prove, and - just as importantly - what it cannot prove yet.&lt;/p&gt;
&lt;div class="markdown-heading"&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/Shakargy/devtime" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/1Hiu3Y9J_SI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you try it on a repo and it gets something wrong, please open an issue. That is exactly the feedback I am looking for!&lt;/p&gt;

</description>
      <category>cli</category>
      <category>git</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>I Monitored 15 Popular APIs for 7 Days. 73% Changed While Nobody Was Watching.</title>
      <dc:creator>Aviad Shakargy</dc:creator>
      <pubDate>Thu, 21 May 2026 22:40:39 +0000</pubDate>
      <link>https://dev.to/shakargy/i-monitored-15-popular-apis-for-7-days-73-changed-while-nobody-was-watching-8ij</link>
      <guid>https://dev.to/shakargy/i-monitored-15-popular-apis-for-7-days-73-changed-while-nobody-was-watching-8ij</guid>
      <description>&lt;p&gt;Every backend depends on a graveyard of third-party APIs. Stripe for billing, Twilio for SMS, OpenAI for inference, that internal auth service from two teams over that nobody remembers who owns.&lt;/p&gt;

&lt;p&gt;Ask any backend engineer to list every external HTTP call their service makes and you'll get half the list. The other half lives in a forgotten cron job, a legacy integration, or a vendor your predecessor added and never documented.&lt;/p&gt;

&lt;p&gt;I wanted to know: &lt;strong&gt;how often do these APIs actually change?&lt;/strong&gt; Not the big announcements that hit Hacker News - the quiet ones. The field that becomes required. The header that gets renamed. The deprecation notice buried in page 4 of a changelog.&lt;/p&gt;

&lt;p&gt;So I built a system to find out.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;I pointed my monitoring engine at the changelogs and release notes of 15 widely-used APIs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stripe&lt;/strong&gt; · &lt;strong&gt;OpenAI&lt;/strong&gt; · &lt;strong&gt;Twilio&lt;/strong&gt; · &lt;strong&gt;GitHub&lt;/strong&gt; · &lt;strong&gt;Auth0&lt;/strong&gt; · &lt;strong&gt;SendGrid&lt;/strong&gt; · &lt;strong&gt;Slack&lt;/strong&gt; · &lt;strong&gt;Shopify&lt;/strong&gt; · &lt;strong&gt;Cloudflare&lt;/strong&gt; · &lt;strong&gt;Vercel&lt;/strong&gt; · &lt;strong&gt;Supabase&lt;/strong&gt; · &lt;strong&gt;Notion&lt;/strong&gt; · &lt;strong&gt;Firebase&lt;/strong&gt; · &lt;strong&gt;HubSpot&lt;/strong&gt; · &lt;strong&gt;Datadog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every 6 hours, a worker fetches each changelog URL, extracts the text, computes a content hash, diffs it against the previous snapshot, and runs the diff through a severity classifier that scans for keywords like &lt;code&gt;breaking change&lt;/code&gt;, &lt;code&gt;deprecated&lt;/code&gt;, &lt;code&gt;removed&lt;/code&gt;, &lt;code&gt;security&lt;/code&gt;, &lt;code&gt;end of life&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I let it run for a week with zero manual intervention. No tweaking, no hand-holding. Just the pipeline doing its job.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;7 days. 15 APIs. 58 change events detected.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;11 out of 15 APIs - &lt;strong&gt;73%&lt;/strong&gt; - shipped at least one change to their changelog or docs during a single week.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Changes Detected&lt;/th&gt;
&lt;th&gt;Risk Keywords Found&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;security, deprecated, removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;security, deprecated, beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;security, vulnerability, removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopify&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;deprecated, removed, beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datadog&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;shutdown, breaking change, vulnerability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;breaking change, deprecated, renamed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firebase&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;breaking change, vulnerability, renamed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;breaking change, deprecated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;end of life, breaking change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;breaking change, deprecated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HubSpot&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stripe&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let that sink in. In one week, the classifier flagged entries containing high-risk terms like &lt;code&gt;breaking change&lt;/code&gt;, &lt;code&gt;deprecated&lt;/code&gt;, &lt;code&gt;removed&lt;/code&gt;, and &lt;code&gt;end of life&lt;/code&gt; across 11 different APIs. Cloudflare, Datadog, and Firebase had &lt;code&gt;vulnerability&lt;/code&gt; mentions. Auth0 had an &lt;code&gt;end of life&lt;/code&gt; notice. Datadog's changelog contained &lt;code&gt;shutdown&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Not every flagged entry means something broke. But each one is the kind of change worth reviewing before your next deploy - and in a normal week, most teams probably would not have seen them in time.&lt;/p&gt;

&lt;p&gt;And this is just what's in the public changelogs. This is vendors doing the responsible thing and documenting their changes. How many don't?&lt;/p&gt;

&lt;h3&gt;
  
  
  Methodology note
&lt;/h3&gt;

&lt;p&gt;This experiment tracked visible changes in public changelog and release-note pages. It does not prove that every detected change was breaking, only that the monitored source changed and contained risk-related language worth reviewing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Surprised Me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  During this week, GitHub changed almost every 12 hours
&lt;/h3&gt;

&lt;p&gt;14 change events in 7 days. During this monitoring period, GitHub's blog changelog updated almost twice a day with deprecations, security patches, and feature removals. If your CI/CD pipeline, your auth flow, or your webhook integrations depend on GitHub's API - and they probably do - things are moving under your feet constantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "stable" APIs really are stable
&lt;/h3&gt;

&lt;p&gt;Stripe, Twilio, SendGrid, and Notion had &lt;strong&gt;zero&lt;/strong&gt; detected changes all week. That's not boring - that's a signal. These teams invest heavily in API stability. When you're choosing between vendors, this kind of data matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Most detected changes carried high-risk keywords
&lt;/h3&gt;

&lt;p&gt;A large share of the 58 events contained keywords like &lt;code&gt;security&lt;/code&gt;, &lt;code&gt;deprecated&lt;/code&gt;, or &lt;code&gt;removed&lt;/code&gt;. That doesn't mean every change was production-breaking - it means these were the changes most worth reviewing. Changelog entries tend to cluster around consequential updates. Nobody updates their changelog to say "we fixed a typo in an error message." When an entry appears, it usually matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auth0 dropped an "end of life" notice
&lt;/h3&gt;

&lt;p&gt;One event, one week, but the keywords were: &lt;code&gt;end of life&lt;/code&gt;, &lt;code&gt;breaking change&lt;/code&gt;, &lt;code&gt;deprecated&lt;/code&gt;, &lt;code&gt;removed&lt;/code&gt;, &lt;code&gt;renamed&lt;/code&gt;. If you integrate with Auth0 and you didn't read their changelog this week, you might have missed a deprecation that affects your auth flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works Under The Hood
&lt;/h2&gt;

&lt;p&gt;This isn't a cron job running &lt;code&gt;curl&lt;/code&gt; and &lt;code&gt;diff&lt;/code&gt;. It's the same detection engine that powers &lt;a href="https://www.api-graveyard.com" rel="noopener noreferrer"&gt;API Graveyard&lt;/a&gt;, my API dependency intelligence platform, running against real vendor data in production.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Celery Beat&lt;/strong&gt; dispatches fetch jobs every 6 hours for each monitored source&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker&lt;/strong&gt; fetches the changelog URL, extracts text, and computes a content hash&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diff engine&lt;/strong&gt; compares against the previous snapshot - if the hash changed, it generates a diff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity classifier&lt;/strong&gt; scans the diff for risk keywords and assigns a severity level (critical / high / medium / low)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk events&lt;/strong&gt; are created and surfaced on the dashboard with severity, timestamp, and source attribution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public API&lt;/strong&gt; serves the data through unauthenticated read-only endpoints - no login, no paywall&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole thing runs on a single Docker Compose stack: FastAPI backend, React frontend, PostgreSQL, Redis, Celery workers. Deployed to a GCP Compute Engine instance via GitHub Actions. Total infra cost: less than the price of one Datadog alert channel.&lt;/p&gt;

&lt;p&gt;Some engineering choices that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hash-based change detection&lt;/strong&gt; means we don't store raw changelog HTML (copyright-safe) - we only store diffs when something actually changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyword classifier&lt;/strong&gt; is intentionally simple (pattern matching, not ML) because false negatives are worse than false positives here - I'd rather flag something that isn't breaking than miss something that is&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each vendor is an isolated adapter&lt;/strong&gt; (~40 lines each). When Stripe redesigns their docs site - and they will - only the Stripe adapter breaks. The other 14 keep running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSRF protection&lt;/strong&gt; on the fetch layer blocks private IP ranges and localhost - because this system fetches arbitrary URLs from a database, and that's exactly the kind of thing that gets you in trouble if you're not careful&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Most teams find out about breaking API changes one of three ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A deploy breaks in production.&lt;/strong&gt; The Slack channel lights up at 2 AM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Someone happens to read the changelog.&lt;/strong&gt; Usually the one person who's subscribed to the vendor's blog, and they mention it casually in standup two days later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A quarterly dependency audit catches it.&lt;/strong&gt; Three months late, during a sprint nobody wanted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these are good. The first one costs you an incident. The second one depends on luck. The third one is always too late.&lt;/p&gt;

&lt;p&gt;What I learned from this week of data is that &lt;strong&gt;the problem is worse than most people think&lt;/strong&gt;. 73% of the APIs we commonly depend on are changing every single week. Not every change is breaking, but the ones that are? They're buried in changelogs that nobody reads, mixed in with dozens of other entries.&lt;/p&gt;

&lt;p&gt;For teams that depend on multiple external APIs, automated monitoring is quickly becoming less of a nice-to-have and more of a safety net. It's the difference between catching a deprecation notice on Tuesday and debugging a production outage on Saturday.&lt;/p&gt;




&lt;h2&gt;
  
  
  See It Live
&lt;/h2&gt;

&lt;p&gt;The public dashboard is running right now at &lt;strong&gt;&lt;a href="https://www.api-graveyard.com/api-health" rel="noopener noreferrer"&gt;www.api-graveyard.com/api-health&lt;/a&gt;&lt;/strong&gt; - no login, no signup, no paywall. Real data from real APIs, updated every 6 hours.&lt;/p&gt;

&lt;p&gt;The source code for the case study (architecture diagrams, screenshots, SDK links) is on GitHub: &lt;a href="https://github.com/Shakargy/api-graveyard-case-study" rel="noopener noreferrer"&gt;github.com/Shakargy/api-graveyard-case-study&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This case study only monitors public changelogs. The full product goes one layer deeper: discovering the actual APIs your services call from live traffic, mapping dependency risk across your entire stack, and alerting when something changes. One-line SDK integration for &lt;a href="https://github.com/Shakargy/api-graveyard-python" rel="noopener noreferrer"&gt;Python&lt;/a&gt;, &lt;a href="https://github.com/Shakargy/api-graveyard-go" rel="noopener noreferrer"&gt;Go&lt;/a&gt;, and &lt;a href="https://github.com/Shakargy/api-graveyard-node" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; - check it out at &lt;a href="https://www.api-graveyard.com" rel="noopener noreferrer"&gt;www.api-graveyard.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by the solo developer behind &lt;a href="https://www.api-graveyard.com" rel="noopener noreferrer"&gt;API Graveyard&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
