<?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: Dumindu Rathnayake</title>
    <description>The latest articles on DEV Community by Dumindu Rathnayake (@dumindu_rathnayake_3fd9fa).</description>
    <link>https://dev.to/dumindu_rathnayake_3fd9fa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3984121%2F65251544-06aa-4366-87e1-aac5bfc1bfa9.png</url>
      <title>DEV Community: Dumindu Rathnayake</title>
      <link>https://dev.to/dumindu_rathnayake_3fd9fa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dumindu_rathnayake_3fd9fa"/>
    <language>en</language>
    <item>
      <title>Your README lies. So I built a bot that opens a docs PR every time you merge.</title>
      <dc:creator>Dumindu Rathnayake</dc:creator>
      <pubDate>Sun, 14 Jun 2026 16:22:07 +0000</pubDate>
      <link>https://dev.to/dumindu_rathnayake_3fd9fa/your-readme-lies-so-i-built-a-bot-that-opens-a-docs-pr-every-time-you-merge-4gbm</link>
      <guid>https://dev.to/dumindu_rathnayake_3fd9fa/your-readme-lies-so-i-built-a-bot-that-opens-a-docs-pr-every-time-you-merge-4gbm</guid>
      <description>&lt;p&gt;The README lies.&lt;/p&gt;

&lt;p&gt;Not on purpose. It was true the day someone wrote it. Then the function got renamed, the flag got removed, the env var changed, the endpoint moved — and nobody touched the docs, because nobody's &lt;em&gt;job&lt;/em&gt; is the docs. So the README quietly drifts away from the code, and the first person to find out is whoever copy-pastes the snippet that no longer works.&lt;/p&gt;

&lt;p&gt;If you've ever opened a doc page, scrolled to a code block, and thought &lt;em&gt;"...is this still real?"&lt;/em&gt; — you already know the failure mode. Docs don't rot because people are lazy. They rot because keeping them in sync is manual work that lives &lt;em&gt;outside&lt;/em&gt; the loop where the change actually happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The insight: docs are a side effect of merging code
&lt;/h2&gt;

&lt;p&gt;The diff already knows everything. When you merge a PR, the change is right there — the renamed function, the new param, the deleted flag. That's the exact moment the docs &lt;em&gt;should&lt;/em&gt; update, and it's the exact moment everyone is busy doing literally anything else.&lt;/p&gt;

&lt;p&gt;So the fix isn't "write better docs." It's: &lt;strong&gt;make a docs update fall out of merging code, the same way CI falls out of pushing.&lt;/strong&gt; Treat documentation as an event-driven side effect of the merge, not a separate chore you'll get to later (you won't).&lt;/p&gt;

&lt;p&gt;That's what I built. It's called &lt;strong&gt;docs-keeper&lt;/strong&gt;, and it just launched.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;docs-keeper installs as a &lt;strong&gt;GitHub App&lt;/strong&gt;. No new dashboard to babysit, no docs platform to migrate to — it lives in the PR flow you already use.&lt;/p&gt;

&lt;p&gt;When you merge a code PR, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads the diff of what you just merged.&lt;/li&gt;
&lt;li&gt;Drafts grounded documentation + changelog updates from that diff.&lt;/li&gt;
&lt;li&gt;Runs the draft through &lt;strong&gt;7 validation gates&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Opens a &lt;strong&gt;docs PR&lt;/strong&gt; for you to review.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. It &lt;strong&gt;never auto-merges.&lt;/strong&gt; You get a normal PR, you read it, you hit merge or you close it. Same muscle memory as reviewing a teammate's branch.&lt;/p&gt;

&lt;p&gt;Here's roughly what shows up in your repo after a merge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ merged: #482 "rename authClient → sessionClient"
  └─ docs-keeper triggered on merge
     reading diff… 6 files
     drafting docs + changelog…
     running 7 validation gates:
       [1/7] grounding ........ pass
       [2/7] structure ........ pass
       [3/7] links ............ pass
       [4/7] code-fences ...... pass
       [5/7] changelog ........ pass
       [6/7] style ............ pass
       [7/7] safety ........... pass

→ opened PR #483  "docs: update for #482"
     CHANGELOG.md  | 4 ++
     docs/auth.md  | 12 +++---
     ~27s from merge → opened PR
     review required · no auto-merge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You open #483, you read the diff, you decide. docs-keeper doesn't get a vote on your main branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The grounding gate is the whole point
&lt;/h2&gt;

&lt;p&gt;The reason most people don't trust an LLM near their docs is hallucination — it'll confidently document a &lt;code&gt;retryPolicy&lt;/code&gt; option that does not exist. So the most important of the 7 gates is the &lt;strong&gt;grounding gate&lt;/strong&gt;: if the generated docs mention any identifier that isn't present in the diff, the draft gets &lt;strong&gt;rejected&lt;/strong&gt;. No mystery functions, no invented params, no flags that were never shipped.&lt;/p&gt;

&lt;p&gt;It's the difference between "AI wrote some docs" and "the docs only describe what actually changed." Grounded, not vibes.&lt;/p&gt;

&lt;p&gt;To be clear about what I'm &lt;em&gt;not&lt;/em&gt; claiming: this isn't magic and it isn't perfect or absolute. It can draft something you'll want to edit. That's exactly why the output is a &lt;strong&gt;PR you review&lt;/strong&gt; and not a commit straight to main. The grounding gate raises the floor; &lt;em&gt;you&lt;/em&gt; are still the ceiling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest unit economics
&lt;/h2&gt;

&lt;p&gt;Here's the part I think devs actually care about, so no hand-waving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;~$0.004&lt;/strong&gt; average LLM cost per doc PR. Fractions of a cent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~27s&lt;/strong&gt; from merge to an opened PR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7 validation gates&lt;/strong&gt; run before that PR ever appears.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free for public repos.&lt;/strong&gt; If you're shipping in the open, this costs you nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You review every change.&lt;/strong&gt; Always a PR, never an auto-merge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That cost number is real because the whole thing is designed to be cheap and transparent — you can see the usage and what it cost. A doc PR that costs less than half a cent is a doc PR you can afford to get on &lt;em&gt;every&lt;/em&gt; merge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where docs-keeper fits (and where it doesn't)
&lt;/h2&gt;

&lt;p&gt;If you're using &lt;strong&gt;Mintlify&lt;/strong&gt; or &lt;strong&gt;ReadMe.com&lt;/strong&gt; — those give you lovely docs hosting and an AI writer, but &lt;em&gt;you&lt;/em&gt; still drive the updates by hand; they're not wired to your merges. docs-keeper isn't a hosting platform; it's the thing that notices you merged and drafts the update.&lt;/p&gt;

&lt;p&gt;If you're on &lt;strong&gt;docs-as-code&lt;/strong&gt; (Docusaurus, MkDocs), that's fully manual today — docs-keeper opens the PR you'd otherwise have to remember to write.&lt;/p&gt;

&lt;p&gt;And if your plan is "I'll just ask Copilot / paste the diff into an LLM" — sure, but that's not merge-triggered, there's no grounding gate rejecting invented identifiers, and there's no review-PR workflow. docs-keeper is the boring, automatic version of the thing you keep meaning to do.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(There's also a security angle: on Pro+, docs-keeper runs a pre-merge scan — OWASP Top 10 + secret detection — on incoming PRs and can open a review-only fix PR. Same philosophy: it opens a PR, you decide. More on that another day.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on a public repo
&lt;/h2&gt;

&lt;p&gt;If you've got an open-source repo with a slightly-too-honest &lt;code&gt;# TODO: docs out of date&lt;/code&gt;, this is the lowest-risk way to kick the tires:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the docs-keeper GitHub App on a public repo (free for public repos).&lt;/li&gt;
&lt;li&gt;Merge a PR like you normally would.&lt;/li&gt;
&lt;li&gt;Watch a grounded docs PR show up in ~27s.&lt;/li&gt;
&lt;li&gt;Review it. Merge it or close it. You're in control either way.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start here → &lt;strong&gt;&lt;a href="https://docs-keeper.com" rel="noopener noreferrer"&gt;https://docs-keeper.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It just launched — tell me where it breaks
&lt;/h2&gt;

&lt;p&gt;Real talk: docs-keeper is brand new. There are no testimonials, no logo wall, no "trusted by thousands" — because none of that exists yet, and I'm not going to invent it. What exists is a working bot that's been verified end-to-end in production: a merged code PR auto-opened a grounded docs PR, gates and all.&lt;/p&gt;

&lt;p&gt;So I'd genuinely rather you try to break it than tell me it's great. Point it at a gnarly diff. See if the grounding gate holds. Tell me where the draft was wrong, where 27s wasn't enough, where a gate should've caught something and didn't. Drop it in the comments — that feedback is worth more to me right now than any star count.&lt;/p&gt;

&lt;p&gt;The README's been lying long enough. Let's make the truth a side effect of merging.&lt;/p&gt;

</description>
      <category>github</category>
      <category>documentation</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
