<?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: Alisa Hester</title>
    <description>The latest articles on DEV Community by Alisa Hester (@alisa_hester_1).</description>
    <link>https://dev.to/alisa_hester_1</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%2F3770936%2Fb5e6a116-20ae-4101-8980-76892ae31c65.png</url>
      <title>DEV Community: Alisa Hester</title>
      <link>https://dev.to/alisa_hester_1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alisa_hester_1"/>
    <language>en</language>
    <item>
      <title>How to keep Fumadocs docs in sync with your code</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Mon, 12 Oct 2026 15:43:01 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/how-to-keep-fumadocs-docs-in-sync-with-your-code-239c</link>
      <guid>https://dev.to/alisa_hester_1/how-to-keep-fumadocs-docs-in-sync-with-your-code-239c</guid>
      <description>&lt;p&gt;To keep Fumadocs docs in sync with a Next.js app and its API, let Fumadocs generate every page it can from code (OpenAPI reference pages and TypeScript props tables), then give the hand-written guides around those pages an update loop of their own. A generated page changes when its source changes. A guide, a migration note, or a usage example changes only when someone edits it.&lt;/p&gt;

&lt;p&gt;Take one change: an engineer removes a prop from a TypeScript component. On the next build, Auto Type Table renders the props table without it, while the quickstart's usage example still passes the removed prop. API pages built with &lt;code&gt;generateFiles()&lt;/code&gt; stay stale until someone runs the generation script again.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Fumadocs builds from your source
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://fumadocs.dev/docs/mdx" rel="noopener noreferrer"&gt;Fumadocs MDX compiles Markdown and MDX from a directory you configure (&lt;code&gt;content/docs&lt;/code&gt; in its examples) and works with Next.js or Vite&lt;/a&gt;, so your docs can live in the same repository as the app they describe. Two parts of its toolkit go further and write pages straight from code.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://fumadocs.dev/docs/integrations/openapi" rel="noopener noreferrer"&gt;fumadocs-openapi integration&lt;/a&gt; gives you two ways to turn a spec into pages. &lt;code&gt;generateFiles()&lt;/code&gt; writes MDX files to disk, and you refresh them by running a script again. &lt;code&gt;staticSource()&lt;/code&gt; writes no files: it "generates pages directly to your &lt;code&gt;loader()&lt;/code&gt;, hence it allows dynamic content generation, such as re-generating page tree as schema changes."&lt;/p&gt;

&lt;p&gt;For components, &lt;a href="https://fumadocs.dev/docs/ui/components/auto-type-table" rel="noopener noreferrer"&gt;Auto Type Table&lt;/a&gt; "generates a table for your docs based on TypeScript definitions." It comes from the &lt;a href="https://fumadocs.dev/docs/integrations/typescript" rel="noopener noreferrer"&gt;fumadocs-typescript integration&lt;/a&gt;, and it "relies on the file system, hence, the page referencing this component must be built in build time."&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%2Fic55mxl18zwkb26yh0d3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fic55mxl18zwkb26yh0d3.png" alt="Diagram: pages generated from code (Auto Type Table, OpenAPI pages) are true by construction, while hand-written guides and usage examples need an update loop, where EkLine drafts updates as pull requests" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a Fumadocs site still drifts
&lt;/h2&gt;

&lt;p&gt;Test it with your own history: find the latest merged pull request that removed a prop or changed an endpoint. Did anything flag the guide that still uses the old one? Here is what each tool reads:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Native check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;th&gt;What it does not see&lt;/th&gt;
&lt;th&gt;Where EkLine fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://fumadocs.dev/docs/ui/components/auto-type-table" rel="noopener noreferrer"&gt;Auto Type Table&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Props tables built from TypeScript types at build time&lt;/td&gt;
&lt;td&gt;Usage examples typed into MDX&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; reads the code pull request and can draft the example fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://fumadocs.dev/docs/integrations/openapi" rel="noopener noreferrer"&gt;fumadocs-openapi&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;API pages from the spec, live with &lt;code&gt;staticSource()&lt;/code&gt; or on rerun with &lt;code&gt;generateFiles()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Guides that call those endpoints&lt;/td&gt;
&lt;td&gt;Docs Agent edits that hand-written MDX in your &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;docs repository&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://fumadocs.dev/docs/mdx" rel="noopener noreferrer"&gt;Fumadocs MDX&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;That your Markdown and MDX compile&lt;/td&gt;
&lt;td&gt;Whether a compiled sentence is still true&lt;/td&gt;
&lt;td&gt;Docs Agent drafts the correction, and Docs Reviewer checks the MDX in CI, without a &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;Fumadocs framework value&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Generated files are only as fresh as their last run. In March 2026, piersonmarks opened a &lt;a href="https://github.com/fuma-nama/fumadocs/issues/3155" rel="noopener noreferrer"&gt;feature request for an OpenAPI watch mode&lt;/a&gt; and described the gap: "The &lt;code&gt;fumadocs-mdx&lt;/code&gt; bundler watches for MDX file changes, but nothing watches the upstream OpenAPI spec that &lt;em&gt;produces&lt;/em&gt; those MDX files." The maintainer closed the request and replied that, because schemas can also come from URLs and custom functions, a watcher written in your own project is simpler and more flexible than a built-in wrapper. On a &lt;code&gt;generateFiles()&lt;/code&gt; setup, keeping the reference current is your job.&lt;/p&gt;

&lt;p&gt;Auto Type Table has its own failure case: the docs warn that "Rendering the component on serverless runtime may cause problems," and its setup example sets a cache for serverless platforms.&lt;/p&gt;

&lt;p&gt;The bigger gap sits outside generation. In the removed-prop example, the table corrects itself and the usage example does not, because a person typed it. The same holds for the quickstart prose about the prop and the migration note that should name its replacement. The Fumadocs MDX documentation describes no built-in AI writer that would draft those edits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not generate everything?
&lt;/h2&gt;

&lt;p&gt;The strongest answer to drift is to generate more, and on Fumadocs it goes far. If an endpoint or a prop can be described from the spec or the type, generate it and stop maintaining it by hand.&lt;/p&gt;

&lt;p&gt;Generation still stops at the type. A type says which props exist. It does not say which two props you combine for a common layout, why the removed prop went away, or what a reader on the old version should change before upgrading. Guides, migration notes, and worked examples carry that knowledge, and none of it can be generated from types.&lt;/p&gt;

&lt;p&gt;So generation plus a same-PR rule is enough when the docs sit in the app repository and every fact the guide needs is in that pull request. It falls short when the facts come from a ticket, Slack, a spec, or another repository; in an &lt;a href="https://news.ycombinator.com/item?id=48825447" rel="noopener noreferrer"&gt;Ask HN thread&lt;/a&gt; on the subject, practitioners write docs first or script nightly passes.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Fumadocs sync checklist for this week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prefer &lt;code&gt;staticSource()&lt;/code&gt; when your spec changes often, so the page tree follows the schema instead of a file someone forgot to regenerate.&lt;/li&gt;
&lt;li&gt;Where you need &lt;code&gt;generateFiles()&lt;/code&gt; (for example, to edit the generated MDX), run the generation script in CI on every change to the spec, and fail the job when the committed files differ from fresh output.&lt;/li&gt;
&lt;li&gt;Use Auto Type Table for every public component, build those pages at build time, and set the cache the docs ask for if you deploy to a serverless host.&lt;/li&gt;
&lt;li&gt;Keep a list of hand-written pages that mention a generated thing (a prop, an endpoint, a type name), and review that list as part of every release.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Adding EkLine to a Fumadocs repository
&lt;/h2&gt;

&lt;p&gt;EkLine adds the update loop for the hand-written half.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;On a Fumadocs site&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where your content lives&lt;/td&gt;
&lt;td&gt;MDX in &lt;code&gt;content/docs&lt;/code&gt;, inside the Next.js app repository or in a separate docs repository, on GitHub or GitLab.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What EkLine watches&lt;/td&gt;
&lt;td&gt;The &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;GitHub App&lt;/a&gt; separates documentation repositories, where you set the docs path, from code repositories, which it "reviews for documentation impact." Your app repository can be the code repository.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where the pull request lands&lt;/td&gt;
&lt;td&gt;A docs pull request (a merge request on GitLab) that edits hand-written MDX. Generated pages stay with Fumadocs; say so in &lt;a href="https://docs.ekline.io/agent/custom-instructions/" rel="noopener noreferrer"&gt;custom instructions&lt;/a&gt;, which hold up to 5,000 characters and apply to every new session.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which CI check runs&lt;/td&gt;
&lt;td&gt;Docs Reviewer checks MDX for style, consistency, links, and accuracy. Its &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;framework values&lt;/a&gt; cover mintlify, astro, fern, docusaurus, and gitbook, with no Fumadocs value, and the &lt;a href="https://docs.ekline.io/reviewer/integrations/cli-integration/" rel="noopener noreferrer"&gt;CLI docs&lt;/a&gt; note that "Without framework awareness, EkLine might skip content inside these components."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which Scheduled Agents check fits&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/scheduled-agents/" rel="noopener noreferrer"&gt;Code Sample Review&lt;/a&gt;, which "Verifies that code samples in your docs are accurate and runnable."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What stays in Fumadocs&lt;/td&gt;
&lt;td&gt;OpenAPI pages, Auto Type Table, the page tree, and your Next.js build and deploy.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In the removed-prop example, when the engineer opens the pull request (or moves it out of draft), &lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;automatic PR review&lt;/a&gt; reads the diff, title, and description once. A low-confidence result stays silent, a medium one posts a suggestion comment, and a high one opens a docs pull request that rewrites the quickstart example without the prop. The props table needs no edit, because the next build regenerates it. GitLab merge requests get the same review &lt;a href="https://docs.ekline.io/changelog/" rel="noopener noreferrer"&gt;since May 2026&lt;/a&gt;. If the change merged before EkLine was connected or scored below the threshold, the weekly &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; audits the last 30 days of GitHub activity and fixes the highest-priority gap. Someone on your team reviews and merges every one of these pull requests.&lt;/p&gt;

&lt;p&gt;Will engineers review docs instead of writing them? P0 Security, whose docs are hosted on GitBook, reports "15 integration guides shipped, zero new headcount" with EkLine, and its engineers spent their time &lt;a href="https://ekline.io/case-study/how-p0-securitys-engineering-team-stopped-writing-docs-and-started-shipping-faster" rel="noopener noreferrer"&gt;"reviewing documentation instead of writing it."&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  If you move off Fumadocs one day
&lt;/h2&gt;

&lt;p&gt;Keep the docs as MDX in Git, and the move costs the least of your accuracy work: the update loop for hand-written pages keeps working. &lt;a href="https://potluck.ekline.io" rel="noopener noreferrer"&gt;Potluck Docs&lt;/a&gt;, which EkLine maintains, is one option: an &lt;a href="https://github.com/ekline-io/potluck-docs" rel="noopener noreferrer"&gt;MIT-licensed Astro + Starlight template&lt;/a&gt; whose OpenAPI references are rendered by Scalar with a client for sending real requests. It adds private and org-scoped docs, and it generates a sitemap and &lt;code&gt;llms.txt&lt;/code&gt; on every build. It calls itself "a template, not a hosted product."&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does EkLine replace your docs platform?
&lt;/h3&gt;

&lt;p&gt;No. Fumadocs keeps generating your OpenAPI pages and type tables, and your Next.js or Vite build keeps rendering and deploying the site. EkLine works on the MDX you write by hand: Docs Agent drafts updates as pull requests when code changes, Docs Reviewer checks the MDX in CI, and Scheduled Agents review code samples. Your team merges every change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Fumadocs regenerate OpenAPI pages automatically?
&lt;/h3&gt;

&lt;p&gt;With &lt;code&gt;staticSource()&lt;/code&gt;, yes: the fumadocs-openapi docs say it generates pages directly to your &lt;code&gt;loader()&lt;/code&gt;, which allows re-generating the page tree as the schema changes. With &lt;code&gt;generateFiles()&lt;/code&gt;, you run the generation script again after each spec change. A March 2026 request for a built-in watch mode was closed, and the maintainer suggested a watcher in your own project, so most teams also run the script in CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Auto Type Table work on serverless hosting like Vercel?
&lt;/h3&gt;

&lt;p&gt;Build the pages that use it at build time. The Auto Type Table docs say the component relies on the file system, warn that rendering it on a serverless runtime may cause problems, and its setup example sets a cache for serverless platforms such as Vercel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't we script this ourselves?
&lt;/h3&gt;

&lt;p&gt;For the generated half, the maintainer's answer to the watch-mode request was a watcher in your own project. For the hand-written half, cyanydeez described "a for loop that runs nightly on any files updated the prior day," letting local AI revise the Markdown file next to each one. A quickstart in content/docs sits apart from the component it uses. Every rewrite still needs checking, the part rstagi called hard: "it's hard to fact-check everything all the time." EkLine drafts the guide edit as a pull request from the code change, and your team decides.&lt;/p&gt;

&lt;p&gt;Pick the last pull request that removed a prop or changed an endpoint, and bring it. Docs Agent is available on all plans, with access granted on request. &lt;a href="https://ekline.io" rel="noopener noreferrer"&gt;Book a demo to see what EkLine drafts for the hand-written half of your Fumadocs site&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>nextjs</category>
      <category>typescript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to keep Docusaurus docs in sync with your source code</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:23:00 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/how-to-keep-docusaurus-docs-in-sync-with-your-source-code-4f03</link>
      <guid>https://dev.to/alisa_hester_1/how-to-keep-docusaurus-docs-in-sync-with-your-source-code-4f03</guid>
      <description>&lt;p&gt;Docusaurus keeps docs in sync with source code through the repository. It gives you three real sync tools: a monorepo, code blocks imported from files, and a build that fails on broken links. All three assume the code lives next to the docs. Answering that exact question in &lt;a href="https://github.com/facebook/docusaurus/discussions/3722" rel="noopener noreferrer"&gt;Docusaurus discussion #3722&lt;/a&gt; in November 2020, a maintainer said that with docs and code in separate repositories, keeping them in sync is your job.&lt;/p&gt;

&lt;p&gt;Your Docusaurus site lives in its own docs repository, and your SDK lives in another. An engineer renames a configuration option in the SDK. Every guide that names the old option is now wrong, and no Docusaurus tool flags it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Docusaurus already does to keep docs and code together
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://docusaurus.io/docs/installation" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt; suggests a monorepo when you document an existing project: "Then, your contributors can update the docs as they implement features."&lt;/p&gt;

&lt;p&gt;Inside one repository, you can import a source file as raw text with &lt;a href="https://docusaurus.io/docs/markdown-features/react" rel="noopener noreferrer"&gt;raw-loader and render it with Docusaurus's CodeBlock component&lt;/a&gt;. The docs add a warning: "This feature is experimental and might be subject to breaking API changes in the future."&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://docusaurus.io/docs/api/docusaurus-config" rel="noopener noreferrer"&gt;configuration reference&lt;/a&gt;, &lt;code&gt;onBrokenLinks&lt;/code&gt; defaults to &lt;code&gt;throw&lt;/code&gt;, so a link to a moved or deleted page fails the build. It has two limits: "The broken links detection is only available for a production build (&lt;code&gt;docusaurus build&lt;/code&gt;)." And &lt;code&gt;onBrokenAnchors&lt;/code&gt; defaults to &lt;code&gt;warn&lt;/code&gt;, so a dead heading link ships with a warning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docusaurus.io/docs/versioning" rel="noopener noreferrer"&gt;Versioning&lt;/a&gt; copies the full &lt;code&gt;docs/&lt;/code&gt; folder into &lt;code&gt;versioned_docs/version-[versionName]/&lt;/code&gt; when you create a version, and each copy is edited independently. The docs advise against versioning unless you need it, because it adds build time and complexity.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/PaloAltoNetworks/docusaurus-openapi-docs" rel="noopener noreferrer"&gt;docusaurus-openapi-docs plugin&lt;/a&gt; generates MDX "using the OpenAPI specification as the source." Palo Alto Networks maintains it under the MIT license, outside the official Docusaurus project.&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%2Fazyychlyddmsrdxv56wr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazyychlyddmsrdxv56wr.png" alt="Diagram: an SDK repo with a renamed option and a separate Docusaurus docs repo whose code imports and broken-link check stop at the repo edge; EkLine bridges the two by reading the change and opening a docs pull request" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the renamed option slips through
&lt;/h2&gt;

&lt;p&gt;Try it on your own site. Open the last merged SDK pull request that renamed an option. Did anything flag the guide that still names the old one? Each Docusaurus check answers a narrower question:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Native check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;th&gt;What it does not see&lt;/th&gt;
&lt;th&gt;Where EkLine fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docusaurus.io/docs/api/docusaurus-config" rel="noopener noreferrer"&gt;&lt;code&gt;onBrokenLinks&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Links to moved or deleted pages, in production builds&lt;/td&gt;
&lt;td&gt;A guide that names a renamed option with every link intact&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; treats "renamed configuration" as a high-confidence case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docusaurus.io/docs/markdown-features/react" rel="noopener noreferrer"&gt;raw-loader imports&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Code blocks that match a file in the docs checkout&lt;/td&gt;
&lt;td&gt;Code in a separate SDK repository&lt;/td&gt;
&lt;td&gt;The &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;GitHub App&lt;/a&gt; watches the SDK repository and writes to the docs repository&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/PaloAltoNetworks/docusaurus-openapi-docs" rel="noopener noreferrer"&gt;docusaurus-openapi-docs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Reference MDX generated from your spec&lt;/td&gt;
&lt;td&gt;Guides and samples written around it&lt;/td&gt;
&lt;td&gt;The Code Sample Review agent in &lt;a href="https://docs.ekline.io/agent/scheduled-agents/" rel="noopener noreferrer"&gt;Scheduled Agents&lt;/a&gt; checks those samples&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The raw-loader example imports a relative path such as &lt;code&gt;./myComponent&lt;/code&gt;, so the file has to be reachable from the docs project, which in practice means it sits in the same checkout. A renamed option breaks no link, so &lt;code&gt;onBrokenLinks&lt;/code&gt; has nothing to throw on. The build passes, and the guide still tells readers to set the old name.&lt;/p&gt;

&lt;p&gt;With versioning on, the page in &lt;code&gt;docs/&lt;/code&gt; belongs to the current version, the frozen copy under &lt;code&gt;versioned_docs/&lt;/code&gt; also names the old option, and each copy changes only when someone edits it.&lt;/p&gt;

&lt;p&gt;A build can also fail without failing your deploy. In a &lt;a href="https://github.com/facebook/docusaurus/issues/11890" rel="noopener noreferrer"&gt;Docusaurus 3.9.2 issue&lt;/a&gt; about an &lt;code&gt;.md&lt;/code&gt; and an &lt;code&gt;.mdx&lt;/code&gt; file sharing one name, josh-wong reported that "a site with build errors still goes live instead of failing the deployment." The maintainer traced it to a custom &lt;code&gt;build&lt;/code&gt; script whose pipe to &lt;code&gt;tee&lt;/code&gt; made it exit with code 0.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Docusaurus sync checklist for this week
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Move the docs into the code repository if your team can, so the guide edit rides in the same pull request as the rename.&lt;/li&gt;
&lt;li&gt;Replace pasted snippets with raw-loader imports wherever the code shares the docs repository, and treat the experimental label as an upgrade risk.&lt;/li&gt;
&lt;li&gt;Run a full &lt;code&gt;docusaurus build&lt;/code&gt; on every docs pull request, since link checks run only in production builds, and consider setting &lt;code&gt;onBrokenAnchors&lt;/code&gt; to &lt;code&gt;throw&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Confirm that your build script exits non-zero on a Docusaurus error (a pipe to &lt;code&gt;tee&lt;/code&gt; can hide the exit code), so your deploy job stops.&lt;/li&gt;
&lt;li&gt;After each SDK release, search &lt;code&gt;docs/&lt;/code&gt; and every &lt;code&gt;versioned_docs/&lt;/code&gt; folder for renamed options, and decide per version whether the frozen copy changes.&lt;/li&gt;
&lt;li&gt;Generate API reference pages from your OpenAPI spec with the community plugin, so review time goes to the guides.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Should you move the docs into the SDK monorepo?
&lt;/h2&gt;

&lt;p&gt;For most teams it is the best native answer, and the Docusaurus installation guide suggests it for documenting an existing project: the guide sits in the same pull request as the rename. It still leaves the prose to whoever opens the pull request. The Docusaurus docs we reviewed describe no check that compares a guide's sentences with the code, and a rename's reason often sits in a ticket or Slack thread outside the pull request.&lt;/p&gt;

&lt;p&gt;Here is the line. A monorepo plus a same-PR rule is enough when the pull request carries every fact the guide needs; that is the shared-repository case the maintainer described in &lt;a href="https://github.com/facebook/docusaurus/discussions/3722" rel="noopener noreferrer"&gt;discussion #3722&lt;/a&gt;. It stops being enough once a fact lives in a ticket, a Slack thread, a spec, or the separate SDK repository. Docs-first habits and nightly scripts are what practitioners describe in an &lt;a href="https://news.ycombinator.com/item?id=48825447" rel="noopener noreferrer"&gt;Ask HN thread&lt;/a&gt; on keeping docs current.&lt;/p&gt;

&lt;h2&gt;
  
  
  How EkLine plugs into a Docusaurus repository
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;On a Docusaurus site&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where your content lives&lt;/td&gt;
&lt;td&gt;Your docs repository, added in the &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;EkLine GitHub App&lt;/a&gt; as a Documentation Repository, with paths such as &lt;code&gt;docs/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What EkLine watches&lt;/td&gt;
&lt;td&gt;Your SDK and service repositories, added separately as Code Repositories: "Source code repositories that EkLine reviews for documentation impact"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When it reads a change&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; assesses each pull request once, when it opens or leaves draft; a weekly &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; audits the last 30 days of GitHub activity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where its pull request lands&lt;/td&gt;
&lt;td&gt;Your docs repository, opened by &lt;a href="https://docs.ekline.io/agent/update-review/" rel="noopener noreferrer"&gt;Docs Agent&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which CI check runs&lt;/td&gt;
&lt;td&gt;Docs Reviewer, through the &lt;a href="https://docs.ekline.io/reviewer/quickstart/github-action/" rel="noopener noreferrer"&gt;EkLine GitHub Action&lt;/a&gt;, posts inline comments on the pull request, covering style, consistency, links, and accuracy; Docs Reviewer accepts a &lt;code&gt;docusaurus&lt;/code&gt; &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;framework value&lt;/a&gt;, and "Support for other frameworks is expanding."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What stays in Docusaurus&lt;/td&gt;
&lt;td&gt;The build, theme, plugins, versioning, previews, and hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When the engineer opens the SDK pull request, automatic PR review lists "renamed configuration" among its high-confidence cases, which "Posts a comment that automatically triggers the docs update flow." Docs Agent drafts the update as a pull request in the docs repository, where your build runs as usual and a reviewer merges or closes it. The assessment reads only the diff, title, and description; when the reason for the rename sits in a Jira ticket or a Slack thread, you can &lt;a href="https://docs.ekline.io/agent/combine-sources/" rel="noopener noreferrer"&gt;combine those sources&lt;/a&gt; in a Docs Agent session and get one pull request.&lt;/p&gt;

&lt;p&gt;For snippets that raw-loader cannot reach, use the Code Sample Review agent in &lt;a href="https://docs.ekline.io/agent/scheduled-agents/" rel="noopener noreferrer"&gt;Scheduled Agents&lt;/a&gt;, which "Verifies that code samples in your docs are accurate and runnable." Docs Agent works with GitHub and GitLab and is available to all plans, with access granted on request.&lt;/p&gt;

&lt;p&gt;Worried about engineering time? At &lt;a href="https://ekline.io/case-study/how-p0-securitys-engineering-team-stopped-writing-docs-and-started-shipping-faster" rel="noopener noreferrer"&gt;P0 Security&lt;/a&gt;, which hosts its docs on GitBook, "In 6 months, engineers reclaimed 150+ hours of product development time by reviewing documentation instead of writing it."&lt;/p&gt;

&lt;h2&gt;
  
  
  If you are starting fresh or leaving Docusaurus
&lt;/h2&gt;

&lt;p&gt;If you do leave, the target that puts the least of your accuracy work at risk keeps your docs as Markdown in Git, because the same pull request loop then works on the new repository. &lt;a href="https://potluck.ekline.io" rel="noopener noreferrer"&gt;Potluck Docs&lt;/a&gt; is one such target: an &lt;a href="https://github.com/ekline-io/potluck-docs" rel="noopener noreferrer"&gt;MIT-licensed Astro + Starlight template&lt;/a&gt; maintained by EkLine, with OpenAPI references "rendered by Scalar with a built-in client for sending real requests," private docs behind your SSO, org-scoped docs, and a sitemap and &lt;code&gt;llms.txt&lt;/code&gt; generated on every build. It is "a template, not a hosted product." Nothing about EkLine requires the move. Compare &lt;a href="https://ekline.io/blog/ekline-vs-docusaurus" rel="noopener noreferrer"&gt;EkLine vs Docusaurus&lt;/a&gt;, or see &lt;a href="https://ekline.io/blog/docusaurus-alternatives" rel="noopener noreferrer"&gt;Docusaurus alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does EkLine replace your docs platform?
&lt;/h3&gt;

&lt;p&gt;No. Docusaurus keeps building, versioning, and hosting your site. EkLine adds Docs Agent pull requests in your Docusaurus repository, drafted from changes in your SDK repositories, and Docs Reviewer comments in CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Docusaurus sync with the source code?
&lt;/h3&gt;

&lt;p&gt;Through a shared repository. In discussion #3722, a maintainer replied that code and docs in the same Git repository "remain in sync automatically," and that with separate repositories "you have the responsibility to maintain sync." He linked an example of importing a code block from a source file. EkLine covers that separate-repository case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Docusaurus import code from a file?
&lt;/h3&gt;

&lt;p&gt;Yes, from a file the build can reach. Import it as raw text with raw-loader and render it with Docusaurus's CodeBlock component. The feature is marked experimental, and the import is a relative path, so in practice the file sits in the docs checkout.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't we script this ourselves?
&lt;/h3&gt;

&lt;p&gt;You can script part of it. In the Ask HN thread, cyanydeez described "a for loop that runs nightly on any files updated the prior day," and has local AI rewrite the Markdown file that sits next to each one. That pairing assumes the doc sits beside the code, the shared-repository case from discussion #3722; your guides live in a separate Docusaurus repository, and versioned copies multiply them. rstagi named the remaining cost: "it's hard to fact-check everything all the time." EkLine reads the SDK pull request and, when the impact is clear, opens a docs pull request your team reviews.&lt;/p&gt;

&lt;p&gt;Bring the last SDK pull request that renamed an option. &lt;a href="https://ekline.io" rel="noopener noreferrer"&gt;Book a demo and walk an SDK change through to a Docusaurus pull request.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to keep VitePress docs in sync with your code</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:20:01 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/how-to-keep-vitepress-docs-in-sync-with-your-code-16b2</link>
      <guid>https://dev.to/alisa_hester_1/how-to-keep-vitepress-docs-in-sync-with-your-code-16b2</guid>
      <description>&lt;p&gt;To keep VitePress docs in sync with your code, import every code sample from your source files and leave dead-link checking on, so the build fails when a linked page goes missing and, on the VitePress 2.0 alpha line, when an imported file goes missing. Then review the sentences next to those samples on each release, because no VitePress setting checks that prose against the code.&lt;/p&gt;

&lt;p&gt;Say a function's default value changes. The snippet you import with VitePress's code-snippet directive shows the new code on the next build. The paragraph above it still explains the old default, and the page's last-updated date looks recent because someone fixed a typo last week.&lt;/p&gt;

&lt;h2&gt;
  
  
  What VitePress keeps in sync for you
&lt;/h2&gt;

&lt;p&gt;Its &lt;a href="https://vitepress.dev/guide/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt; says "Markdown files outside the &lt;code&gt;.vitepress&lt;/code&gt; directory are considered source files." These tools act on those files, as described in the 2.0.0-alpha.20 docs. The stable release on npm is still the 1.6.x line, and missing-file handling differs between the two, as noted below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code snippet imports. The &lt;a href="https://vitepress.dev/guide/markdown" rel="noopener noreferrer"&gt;Markdown guide&lt;/a&gt; shows how its code-snippet directive pulls a code block from a file, where "The value of &lt;code&gt;@&lt;/code&gt; corresponds to the source root." Import one VS Code &lt;code&gt;#region&lt;/code&gt; instead of the whole file, and the page shows only the lines that matter.&lt;/li&gt;
&lt;li&gt;Markdown includes. The Markdown include directive inserts one Markdown file into another, with line ranges or a region, so shared steps live in one file.&lt;/li&gt;
&lt;li&gt;Missing-file errors. According to the same guide, "Importing a file or region that does not exist throws a build error," and "Including a missing file, region, heading anchor, or an out-of-range line selection throws a build error." On 2.0 alpha releases, rename a source file or delete a region marker and the build stops; setting &lt;code&gt;markdown.snippet.silent&lt;/code&gt; or &lt;code&gt;markdown.include.silent&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; turns that error into a warning. The &lt;a href="https://github.com/vuejs/vitepress/blob/main/CHANGELOG.md" rel="noopener noreferrer"&gt;VitePress changelog&lt;/a&gt; for 2.0.0-alpha.17 notes that includes previously "silently ignored errors when files did not exist," so on the stable 1.6.x line, check the rendered output.&lt;/li&gt;
&lt;li&gt;Dead links. In the &lt;a href="https://vitepress.dev/reference/site-config" rel="noopener noreferrer"&gt;site config reference&lt;/a&gt;, &lt;code&gt;ignoreDeadLinks&lt;/code&gt; defaults to false, and the description reads: "When set to &lt;code&gt;true&lt;/code&gt;, VitePress will not fail builds due to dead links."&lt;/li&gt;
&lt;li&gt;Last-updated dates. &lt;code&gt;lastUpdated&lt;/code&gt; controls "Whether to get the last updated timestamp for each page using Git," and with the default theme, "enabling this option will display each page's last updated time."&lt;/li&gt;
&lt;/ul&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%2Fnxmziqvrt4oi15fug9f8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnxmziqvrt4oi15fug9f8.png" alt="Diagram: a docs page where the code block imported from source is current but the paragraph above it explains the old default, with a recent last-updated date; a recent date does not mean an accurate page" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the prose falls behind
&lt;/h2&gt;

&lt;p&gt;Run this check against your repository. Open the newest merged pull request that changed a default, a parameter, or a return value. Did anything flag the paragraph that explains it? The import did its job, and the build passes because every file and region it references still exists. Nothing in that pipeline compares the sentence that names the default with the code below it, so the page now contradicts itself.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Native check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;th&gt;What it does not see&lt;/th&gt;
&lt;th&gt;Where EkLine fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://vitepress.dev/guide/markdown" rel="noopener noreferrer"&gt;Code-snippet imports&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The code block matches a file the build can read&lt;/td&gt;
&lt;td&gt;The sentence above the block, and code in another repository&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; reads the code pull request and can draft the prose fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://vitepress.dev/reference/site-config" rel="noopener noreferrer"&gt;&lt;code&gt;ignoreDeadLinks&lt;/code&gt; left off&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Markdown links point at pages that exist&lt;/td&gt;
&lt;td&gt;Sidebar entries, per &lt;a href="https://github.com/vuejs/vitepress/issues/3244" rel="noopener noreferrer"&gt;issue 3244&lt;/a&gt;, and prose that went stale&lt;/td&gt;
&lt;td&gt;Docs Reviewer checks links and writing rules on each pull request through the &lt;a href="https://docs.ekline.io/reviewer/quickstart/github-action/" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://vitepress.dev/reference/site-config" rel="noopener noreferrer"&gt;&lt;code&gt;lastUpdated&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;When a commit last touched the page&lt;/td&gt;
&lt;td&gt;Whether the page still matches the product&lt;/td&gt;
&lt;td&gt;A weekly &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; audits changes that merged without docs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sidebar entries are a second gap. In a &lt;a href="https://github.com/vuejs/vitepress/issues/3244" rel="noopener noreferrer"&gt;VitePress issue titled "Dead links in sidebar not reported,"&lt;/a&gt; koebi wrote in November 2023 that a sidebar link to a missing page "builds even if Bar doesn't exist." The issue was still open when we checked in October 2026, so treat sidebar entries as unchecked.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;@&lt;/code&gt; alias resolves to the source root, so a snippet stays current only when the build can read the file; code in a separate repository is outside that build unless you check it out or copy it in. A sample pasted by hand from a separate SDK repository is a copy that nothing in the build compares with its original.&lt;/p&gt;

&lt;p&gt;That sets the boundary. Imports, the dead-link check, and a same-PR rule are enough when the code sits inside the docs build and every fact the paragraph needs is in the pull request. When the facts live in tickets, Slack threads, specs, or a separate SDK repository, nothing ties them to the page; an &lt;a href="https://news.ycombinator.com/item?id=48825447" rel="noopener noreferrer"&gt;Ask HN thread&lt;/a&gt; on keeping docs current collects docs-first habits and nightly scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does lastUpdated tell readers a page is current?
&lt;/h2&gt;

&lt;p&gt;A fair objection: &lt;code&gt;lastUpdated&lt;/code&gt; shows when a page last changed, so readers can judge its age for themselves. The date comes from Git, so it reflects a real commit and is honest metadata.&lt;/p&gt;

&lt;p&gt;But it records that a commit touched the file, which is a different fact from the page matching the product. In the example, the typo fix moved the date forward while the paragraph about the default stayed wrong. Show the date to readers, and keep it out of how you decide which pages need review.&lt;/p&gt;

&lt;h2&gt;
  
  
  A VitePress sync checklist for this week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Find every hand-pasted code block that has a source file in the repository, and replace it with a VitePress code-snippet import of a &lt;code&gt;#region&lt;/code&gt; in code your tests already exercise.&lt;/li&gt;
&lt;li&gt;Confirm that &lt;code&gt;ignoreDeadLinks&lt;/code&gt; is unset or false in your site config, and, on 2.0 alpha, that no one has set &lt;code&gt;markdown.snippet.silent&lt;/code&gt; or &lt;code&gt;markdown.include.silent&lt;/code&gt;; on 1.6.x, open the rendered pages that import code.&lt;/li&gt;
&lt;li&gt;Check sidebar entries on their own: after any page rename or deletion, open each sidebar link in a local build or preview.&lt;/li&gt;
&lt;li&gt;Turn on &lt;code&gt;lastUpdated&lt;/code&gt; for readers, and track review status somewhere else.&lt;/li&gt;
&lt;li&gt;On each release, list the code changes that alter defaults, parameters, or behavior, and read the paragraphs around every imported snippet for those files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last item costs the most, because someone has to connect each code change to the right page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding EkLine to a VitePress repository
&lt;/h2&gt;

&lt;p&gt;EkLine works on that last item, and VitePress keeps building the site.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;On a VitePress site&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where your content lives&lt;/td&gt;
&lt;td&gt;Markdown outside &lt;code&gt;.vitepress&lt;/code&gt;, in a GitHub or GitLab repository&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What EkLine watches&lt;/td&gt;
&lt;td&gt;Code repositories, which the &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;GitHub App&lt;/a&gt; lists apart from documentation repositories; GitLab merge requests too, per the &lt;a href="https://docs.ekline.io/changelog/" rel="noopener noreferrer"&gt;May 2026 changelog&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When it reads a change&lt;/td&gt;
&lt;td&gt;Each pull request &lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;when it opens or leaves draft&lt;/a&gt;, once; a weekly &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; sweeps what already merged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where its pull request lands&lt;/td&gt;
&lt;td&gt;Your docs repository, as a &lt;a href="https://docs.ekline.io/agent/update-review/" rel="noopener noreferrer"&gt;pull request&lt;/a&gt; your team reviews&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which CI check runs&lt;/td&gt;
&lt;td&gt;Docs Reviewer, which checks each docs change for style, consistency, links, and accuracy, through the &lt;a href="https://docs.ekline.io/reviewer/quickstart/github-action/" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;; its &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;framework list&lt;/a&gt; has no VitePress value, so it reviews the Markdown without VitePress-specific handling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Samples that are not imported&lt;/td&gt;
&lt;td&gt;The Code Sample Review agent in &lt;a href="https://docs.ekline.io/agent/scheduled-agents/" rel="noopener noreferrer"&gt;Scheduled Agents&lt;/a&gt;, which "Verifies that code samples in your docs are accurate and runnable"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What stays in VitePress&lt;/td&gt;
&lt;td&gt;The build, imports and includes, the dead-link check, &lt;code&gt;lastUpdated&lt;/code&gt;, theme, and hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In the example, the engineer opens the code pull request that changes the default. Docs Agent assesses it from the diff, title, and description; at high confidence it starts a docs pull request, and at medium confidence it leaves a suggestion comment. The draft rewrites the paragraph about the default and leaves the import line alone. You review and merge it, and the VitePress build runs as today. Automatic review reads the pull request alone, so for a change decided in a ticket, start a Docs Agent session from that ticket.&lt;/p&gt;

&lt;p&gt;Do reviewers end up rewriting what it drafts? At ContextQA, whose docs are hosted on GitBook, the team reviewed EkLine's updates from April 7 to July 6, 2026, and "Two-thirds merged as a single commit," which the &lt;a href="https://ekline.io/case-study/how-contextqas-engineers-merge-97-percent-of-what-an-ai-agent-writes" rel="noopener noreferrer"&gt;ContextQA case study&lt;/a&gt; reads as "the page was right the first time."&lt;/p&gt;

&lt;h2&gt;
  
  
  If your team leaves VitePress
&lt;/h2&gt;

&lt;p&gt;Should you move, pick a target that keeps the docs as Markdown in Git, because that way the pull request loop you build here keeps working after the move. &lt;a href="https://potluck.ekline.io" rel="noopener noreferrer"&gt;Potluck Docs&lt;/a&gt; is one such target, an &lt;a href="https://github.com/ekline-io/potluck-docs" rel="noopener noreferrer"&gt;open-source Astro + Starlight template&lt;/a&gt; under the MIT license that EkLine maintains. Its OpenAPI references render with Scalar and include a client for real requests; private docs and org-scoped docs are built in; and each build writes a sitemap and &lt;code&gt;llms.txt&lt;/code&gt;. The project describes itself as "a template, not a hosted product."&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does EkLine replace your docs platform?
&lt;/h3&gt;

&lt;p&gt;No. VitePress still builds and serves your site, and its imports and link checks keep working. EkLine adds the prose check: Docs Agent drafts Markdown updates from code pull requests and opens them in your docs repository for your team to approve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does VitePress fail the build on dead links?
&lt;/h3&gt;

&lt;p&gt;Yes, for links in your Markdown. &lt;code&gt;ignoreDeadLinks&lt;/code&gt; defaults to false, and setting it to true stops VitePress from failing builds on dead links. Sidebar links are a separate case: a 2023 issue reports one to a missing page that still builds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't we script this ourselves?
&lt;/h3&gt;

&lt;p&gt;Partly, since the imports already keep code blocks current. For the prose, cyanydeez described "a for loop that runs nightly on any files updated the prior day," and has local AI update the Markdown file beside it. On VitePress, the paragraph that explains a default sits on a page that imports the source file, not beside it. Each nightly rewrite needs a reader, which rstagi summed up as "it's hard to fact-check everything all the time." EkLine drafts that paragraph fix as a pull request from the code change, and your team approves it.&lt;/p&gt;

&lt;p&gt;Choose one pull request from your last release that changed a default, and bring it. To see Docs Agent draft prose fixes on your own VitePress repository, &lt;a href="https://ekline.io" rel="noopener noreferrer"&gt;book a demo&lt;/a&gt;. Docs Agent is available to all plans, and access is granted on request.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>vue</category>
      <category>vite</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Material for MkDocs maintenance mode: keep your docs accurate now</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:46:01 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/material-for-mkdocs-maintenance-mode-keep-your-docs-accurate-now-5ck3</link>
      <guid>https://dev.to/alisa_hester_1/material-for-mkdocs-maintenance-mode-keep-your-docs-accurate-now-5ck3</guid>
      <description>&lt;p&gt;"Material for MkDocs is in maintenance mode and MkDocs 2.0 won't support it. What do I do with my docs now?" As of October 8, 2026, you can stay on MkDocs 1.x for now, wait for Zensical, or move. None of those choices makes a stale page true, so audit and fix accuracy first: stale pages migrate with you, and the fixes count under any choice.&lt;/p&gt;

&lt;p&gt;An engineer renames an argument on a Python function. mkdocstrings regenerates the API reference from the docstring, but the tutorial that calls the function with the old argument stays wrong. The same week, someone moves a file that a pymdownx snippet pulls from; the build passes and the snippet is gone from the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the MkDocs stack stands on October 8, 2026
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Material for MkDocs: on November 5, 2025, its team announced that &lt;a href="https://squidfunk.github.io/mkdocs-material/blog/2025/11/05/zensical" rel="noopener noreferrer"&gt;"Material for MkDocs is in maintenance mode,"&lt;/a&gt; with support "for at least the next 12 months, fixing critical bugs and security vulnerabilities as needed."&lt;/li&gt;
&lt;li&gt;MkDocs 2.0: the Material team's post (February 18, 2026, updated October 2, 2026) says MkDocs 2.0 was &lt;a href="https://squidfunk.github.io/mkdocs-material/blog/2026/02/18/mkdocs-2.0/" rel="noopener noreferrer"&gt;"published as a pre-release on PyPI"&lt;/a&gt; in August 2026, that "No official release date has been announced yet," and that "MkDocs 2.0 won't have a plugin system." Of its own theme, the team writes that "it will cease to work with MkDocs 2.0."&lt;/li&gt;
&lt;li&gt;Zensical: &lt;a href="https://github.com/zensical/zensical/releases/tag/v0.0.68" rel="noopener noreferrer"&gt;version 0.0.68&lt;/a&gt; shipped on October 5 and &lt;a href="https://pypi.org/project/zensical/" rel="noopener noreferrer"&gt;0.0.69 followed on October 8&lt;/a&gt;, both classified as alpha on PyPI. Its &lt;a href="https://zensical.org/roadmap/" rel="noopener noreferrer"&gt;roadmap&lt;/a&gt; banner announces a "November 5 Zensical 0.1.0, Studio, and Spark Community launch," and the roadmap says "Our roadmap is directional and does not promise delivery dates." Its &lt;a href="https://zensical.org/compatibility/" rel="noopener noreferrer"&gt;compatibility page&lt;/a&gt; says "Zensical can build existing MkDocs projects without requiring changes."&lt;/li&gt;
&lt;li&gt;mkdocstrings: the &lt;a href="https://mkdocstrings.github.io/" rel="noopener noreferrer"&gt;project homepage&lt;/a&gt;, checked October 8, 2026, warns "mkdocstrings is in maintenance mode!"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To stay on 1.x is one team's choice; FeldrinH wrote on April 6, 2026, &lt;a href="https://github.com/squidfunk/mkdocs-material/issues/8581" rel="noopener noreferrer"&gt;"We are using MkDocs 1.6 and for the time being have no plans or bandwidth to migrate."&lt;/a&gt; Waiting for Zensical trades an alpha release and a directional roadmap for keeping your &lt;code&gt;mkdocs.yml&lt;/code&gt; and Markdown, with plugins checked against Zensical's replacement list. If you move, the target that risks least of your accuracy work keeps your docs as Markdown in Git, because the fixes you make now, and the pull request loop around them, move with the files. &lt;a href="https://github.com/ekline-io/potluck-docs" rel="noopener noreferrer"&gt;Potluck Docs&lt;/a&gt; is one: an MIT-licensed Astro and Starlight template maintained by EkLine. &lt;a href="https://potluck.ekline.io" rel="noopener noreferrer"&gt;Its site&lt;/a&gt; lists "Three example OpenAPI references, rendered by Scalar with a built-in client for sending real requests," private docs for signed-in readers and org-scoped docs for one org's members, and a sitemap and &lt;code&gt;llms.txt&lt;/code&gt; "generated on every build." It describes itself as "a template, not a hosted product," so hosting stays with you. For the side-by-side platform comparison, read our &lt;a href="https://ekline.io/blog/material-for-mkdocs-maintenance-mode" rel="noopener noreferrer"&gt;guide to Material for MkDocs maintenance mode&lt;/a&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%2F2rjuf18fud6cylqw3w34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2rjuf18fud6cylqw3w34.png" alt="Diagram: three paths, stay on MkDocs 1.x, wait for Zensical, or move (for example to Potluck Docs), all resting on one foundation: accurate pages, audit and fix first" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What MkDocs and its extensions already check
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://www.mkdocs.org/user-guide/configuration/" rel="noopener noreferrer"&gt;&lt;code&gt;strict&lt;/code&gt; setting&lt;/a&gt;: "Set to &lt;code&gt;true&lt;/code&gt; to halt processing when a warning is raised." It defaults to false. In MkDocs 1.6, a missing file reports as a warning and a missing anchor only as info, so a strict build fails on a deleted page but passes a dead heading link until you raise anchor validation to warn.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://facelessuser.github.io/pymdown-extensions/extensions/snippets/" rel="noopener noreferrer"&gt;pymdownx Snippets&lt;/a&gt;: "an extension to insert markdown or HTML snippets into another markdown file." With line ranges, a page can show selected lines of a real file. With &lt;code&gt;check_paths&lt;/code&gt; at its default of off, a missing file means "the markup will be removed"; with it on, the build fails.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mkdocstrings.github.io/" rel="noopener noreferrer"&gt;mkdocstrings&lt;/a&gt;: "Automatic documentation from sources, for MkDocs." Reference pages are rebuilt from docstrings, so signatures follow the code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plugins lose their home in MkDocs 2.0. Snippets is, by our reading, a Markdown extension instead, but neither source says whether MkDocs 2.0 supports it, so test it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What still drifts on a Material site
&lt;/h2&gt;

&lt;p&gt;Run a test on your own site. Open the last merged pull request that renamed an argument or changed what a function does. Did anything flag the tutorial that calls it? On the next build, mkdocstrings shows the new signature, the strict build is green, and the tutorial still passes the old argument.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Native check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;th&gt;What it does not see&lt;/th&gt;
&lt;th&gt;Where EkLine fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.mkdocs.org/user-guide/configuration/" rel="noopener noreferrer"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Links to missing files, and anchors once you raise their level&lt;/td&gt;
&lt;td&gt;A tutorial whose links all resolve but whose call is out of date&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; assesses the code pull request that renamed it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://facelessuser.github.io/pymdown-extensions/extensions/snippets/" rel="noopener noreferrer"&gt;Snippets&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Lines pulled from a real file, and with &lt;code&gt;check_paths&lt;/code&gt; on, that the file exists&lt;/td&gt;
&lt;td&gt;The prose around the snippet, and code in another repository&lt;/td&gt;
&lt;td&gt;Docs Agent drafts the prose fix as a &lt;a href="https://docs.ekline.io/agent/update-review/" rel="noopener noreferrer"&gt;Markdown pull request&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://mkdocstrings.github.io/" rel="noopener noreferrer"&gt;mkdocstrings&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Reference pages rebuilt from docstrings&lt;/td&gt;
&lt;td&gt;Tutorials and how-tos that call the function&lt;/td&gt;
&lt;td&gt;A weekly &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; sweeps changes that merged without docs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The moved snippet is quieter. With &lt;code&gt;check_paths&lt;/code&gt; off, Snippets removes the include and the page publishes with a hole where the example was.&lt;/p&gt;

&lt;p&gt;When is that enough? If your Python code and docs share a repository and the pull request holds every fact a tutorial needs, mkdocstrings plus a same-PR rule keeps pages right. If the facts sit in a ticket, a Slack thread, a spec, or another repository, the rule runs on memory, and the &lt;a href="https://news.ycombinator.com/item?id=48825447" rel="noopener noreferrer"&gt;Ask HN thread&lt;/a&gt; on keeping documentation current shows commenters relying on docs-first habits and nightly scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four checks to run on your MkDocs site this week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Turn on &lt;code&gt;strict&lt;/code&gt; and raise anchor validation from info to warn, so broken headings fail the build alongside missing pages.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;check_paths&lt;/code&gt; to true for Snippets, so a moved source file stops the build instead of leaving a blank.&lt;/li&gt;
&lt;li&gt;List every plugin your site depends on: plugins don't carry to MkDocs 2.0, and each one needs a match in Zensical or in the framework you would move to.&lt;/li&gt;
&lt;li&gt;Audit your most-visited pages for accuracy before any move, starting with tutorials that call functions whose signatures changed recently.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why not fix accuracy during the migration?
&lt;/h2&gt;

&lt;p&gt;A migration touches every page, so cleaning up then feels efficient. But migration work competes with accuracy work: Redocly's &lt;a href="https://redocly.com/blog/documentation-migration-tips" rel="noopener noreferrer"&gt;tips for documentation migration&lt;/a&gt; include a rollback plan: "Rolling back early is better than rolling back late." The migration date may also never come: MkDocs 2.0 is undated, and Zensical is in alpha.&lt;/p&gt;

&lt;h2&gt;
  
  
  How EkLine plugs into a Material for MkDocs repo
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;On a Material for MkDocs site&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where your content lives&lt;/td&gt;
&lt;td&gt;Markdown in &lt;code&gt;docs/&lt;/code&gt; next to &lt;code&gt;mkdocs.yml&lt;/code&gt;, as the &lt;a href="https://squidfunk.github.io/mkdocs-material/creating-your-site" rel="noopener noreferrer"&gt;Material setup guide&lt;/a&gt; lays out, in a GitHub or GitLab repository&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What EkLine watches&lt;/td&gt;
&lt;td&gt;Code repositories you select in the &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;GitHub App&lt;/a&gt;, listed apart from documentation repositories; &lt;a href="https://docs.ekline.io/changelog/" rel="noopener noreferrer"&gt;GitLab merge requests&lt;/a&gt; too&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When it reads a change&lt;/td&gt;
&lt;td&gt;Docs Agent reads &lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;each pull request as it opens&lt;/a&gt;; a weekly &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; audits the last 30 days of GitHub activity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where its pull request lands&lt;/td&gt;
&lt;td&gt;Your docs repository, as &lt;a href="https://docs.ekline.io/agent/update-review/" rel="noopener noreferrer"&gt;Markdown edits in a pull request&lt;/a&gt; under the configured documentation path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which CI check runs&lt;/td&gt;
&lt;td&gt;Docs Reviewer, which checks each docs change for style, consistency, links, and accuracy, through the &lt;a href="https://docs.ekline.io/reviewer/quickstart/github-action/" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;. Its &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;framework values&lt;/a&gt; are mintlify, astro, fern, docusaurus, and gitbook, so on MkDocs it reviews your Markdown without framework-specific component handling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What stays in MkDocs&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;mkdocs.yml&lt;/code&gt;, the Material theme, your plugins, your build, and your hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Follow the rename through it. The engineer opens the pull request in the code repository, and automatic PR review assesses it once, from "the PR diff, title, and description." A high-confidence result triggers a docs pull request; a medium one posts a suggestion comment and leaves the call to you. The fix to look for is the tutorial line that still passes the old argument; your team merges it, and your MkDocs build publishes it. If the reason for the rename lives in a Jira ticket, the PR review won't read it, so open a Docs Agent session and &lt;a href="https://docs.ekline.io/agent/combine-sources/" rel="noopener noreferrer"&gt;combine the pull request with the ticket&lt;/a&gt;. Docs Agent is available to all plans, but we grant access on request.&lt;/p&gt;

&lt;p&gt;Docs Agent works on Markdown in a GitHub or GitLab repository, so after a move, point the documentation path at the new content folder.&lt;/p&gt;

&lt;p&gt;Can an accuracy pass cover most of a site before you decide on a move? ContextQA, whose docs are hosted on GitBook rather than MkDocs, used EkLine over one quarter, April 7 to July 6, 2026, and &lt;a href="https://ekline.io/case-study/how-contextqas-engineers-merge-97-percent-of-what-an-ai-agent-writes" rel="noopener noreferrer"&gt;"brought about 80% of the documentation set, 90 of 113 pages, up to date."&lt;/a&gt; Finish a pass like that before you move, and the new site starts from true pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does EkLine replace your docs platform?
&lt;/h3&gt;

&lt;p&gt;No. MkDocs, the Material theme, &lt;code&gt;mkdocs.yml&lt;/code&gt;, your plugins, and your hosting stay where they are. EkLine reads pull requests in your code repositories, opens Markdown pull requests in your docs repository, and adds Docs Reviewer as a CI check on that Markdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does EkLine still work if we move off MkDocs later?
&lt;/h3&gt;

&lt;p&gt;It should, as long as the new site keeps its Markdown or MDX in a GitHub or GitLab repository, because Docs Agent works on repositories and pull requests. On an Astro and Starlight site such as Potluck Docs, Docs Reviewer's astro framework value applies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't we script this ourselves?
&lt;/h3&gt;

&lt;p&gt;A script covers some ground. In the Ask HN thread, cyanydeez described "a for loop that runs nightly on any files updated the prior day," pointing local AI at the Markdown beside each changed file. On MkDocs, docstrings already play that role through mkdocstrings, while the tutorials that call a function sit elsewhere in the docs folder. Someone still checks every rewrite, the half rstagi flagged: "it's hard to fact-check everything all the time." EkLine drafts tutorial fixes as pull requests for review, and because they are plain Markdown, they carry over if you move.&lt;/p&gt;

&lt;p&gt;Bring one recent pull request that changed a Python signature. To see what EkLine would change in your tutorials, &lt;a href="https://ekline.io" rel="noopener noreferrer"&gt;book a demo with EkLine&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>python</category>
      <category>opensource</category>
      <category>markdown</category>
    </item>
    <item>
      <title>How to keep ReadMe docs in sync with your code and OpenAPI spec</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:31:02 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/how-to-keep-readme-docs-in-sync-with-your-code-and-openapi-spec-5aae</link>
      <guid>https://dev.to/alisa_hester_1/how-to-keep-readme-docs-in-sync-with-your-code-and-openapi-spec-5aae</guid>
      <description>&lt;p&gt;"How do I keep ReadMe docs in sync with my code and my OpenAPI spec?" ReadMe handles half of that job. When you re-sync an OpenAPI file, ReadMe &lt;a href="https://docs.readme.com/main/docs/openapi-resyncing" rel="noopener noreferrer"&gt;updates the spec-derived parts of each API page in place and leaves the Markdown you wrote alone&lt;/a&gt;. Your guides, recipes, and examples are that Markdown, so they need an update path of their own.&lt;/p&gt;

&lt;p&gt;Follow one change: your API adds a new required request parameter. You run &lt;code&gt;rdme openapi upload&lt;/code&gt;, and the reference page for that operation shows the parameter in an updated request panel. The getting-started guide and the recipe that call the same endpoint still show a request without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;When you re-sync the spec, ReadMe updates the reference pages and keeps your hand-written Markdown exactly as you left it.&lt;/li&gt;
&lt;li&gt;Use bi-directional sync or rdme for Markdown, never both, and keep every &lt;code&gt;operationId&lt;/code&gt; stable.&lt;/li&gt;
&lt;li&gt;Guides, recipes, and samples need a review step tied to code changes, which EkLine adds from GitHub or GitLab.&lt;/li&gt;
&lt;/ul&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%2Fjz0rsvhe4gq91jh31q7y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjz0rsvhe4gq91jh31q7y.png" alt="Diagram: a ReadMe API page split in two; the top half from the OpenAPI spec (parameters, request panel) updates on every re-sync, the hand-written bottom half (guide, recipe example) is kept as is and is the half EkLine keeps current" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What ReadMe keeps current when you re-sync
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.readme.com/main/docs/bi-directional-sync" rel="noopener noreferrer"&gt;Bi-directional sync&lt;/a&gt; connects your project to "a GitHub, GitLab, or Bitbucket repository so content stays in step whether you edit in ReadMe or in your repo," and "All content types sync, including guides, API reference pages, custom pages, recipes, and changelogs." The repository "must be empty" before you connect it, with "no commits or files," so it cannot be your existing API codebase. Your code and your docs end up in separate repositories.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/readmeio/rdme" rel="noopener noreferrer"&gt;rdme&lt;/a&gt; is "ReadMe's official command-line interface (CLI) and GitHub Action," and it "&lt;a href="https://docs.readme.com/main/docs/rdme" rel="noopener noreferrer"&gt;pushes one way, from your files to ReadMe&lt;/a&gt;, so edits made in the ReadMe editor don't flow back to your repository."&lt;/p&gt;

&lt;p&gt;ReadMe matches pages on &lt;code&gt;operationId&lt;/code&gt; and "updates the existing API Reference pages in place rather than creating a second set." "The parts of the page that come from the document, such as the summary, parameters, and request and response panels, update to match the new definition." The new required parameter appears on the reference page with no edit from you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where hand-written ReadMe pages drift
&lt;/h2&gt;

&lt;p&gt;Test it on your own hub. Open the last merged pull request that added or changed a request parameter. Did anything flag the guide or recipe that calls that endpoint? Each native tool did its own job:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Native check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;th&gt;What it does not see&lt;/th&gt;
&lt;th&gt;Where EkLine fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.readme.com/main/docs/openapi-resyncing" rel="noopener noreferrer"&gt;OpenAPI re-sync&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Spec-derived parts of each reference page, matched on &lt;code&gt;operationId&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Your hand-written Markdown, which it keeps as is&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; assesses the API pull request and can start a guide edit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.readme.com/main/docs/bi-directional-sync" rel="noopener noreferrer"&gt;Bi-directional sync&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The repository and the hub hold the same pages&lt;/td&gt;
&lt;td&gt;Whether a recipe's request still matches the API&lt;/td&gt;
&lt;td&gt;Docs Agent opens its pull request in that &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;documentation repository&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.readme.com/main/docs/rdme" rel="noopener noreferrer"&gt;rdme&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Files in Git reach ReadMe, one way&lt;/td&gt;
&lt;td&gt;Whether the files it pushes are still true&lt;/td&gt;
&lt;td&gt;Docs Reviewer checks the Markdown in CI, without a &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;ReadMe framework value&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same re-sync page says your Markdown "is kept through every kind of re-sync." That protects your writing, and it also means no ReadMe process updates it. Three places still hold the old request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The getting-started guide that walks a reader through a first call.&lt;/li&gt;
&lt;li&gt;The recipe for that endpoint.&lt;/li&gt;
&lt;li&gt;Any prose or sample you added to the reference page itself, now sitting beside refreshed panels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Third-party sync glue brings failure modes of its own. In May 2026, JohnRDOrazio found his project's old &lt;code&gt;github-readme-sync&lt;/code&gt; action "no longer maintained" and filed "&lt;a href="https://github.com/BibleGet-I-O/endpoint/issues/100" rel="noopener noreferrer"&gt;Replace broken ReadMe.io sync workflow with self-hosted docs (OntoKit pattern)&lt;/a&gt;." davidt99 reported that "&lt;a href="https://github.com/readmeio/rdme/issues/1355" rel="noopener noreferrer"&gt;Docs upload format are incompatible with bi-directional sync&lt;/a&gt;"; ReadMe closed it as not fixable. An &lt;code&gt;operationId&lt;/code&gt; change is worse than a rename: to ReadMe, "a changed ID is a deleted endpoint plus a new one. The old page, its URL, and any edits made to it are removed."&lt;/p&gt;

&lt;h2&gt;
  
  
  Does the GitHub AI Writer close the gap?
&lt;/h2&gt;

&lt;p&gt;For some teams, yes. ReadMe's &lt;a href="https://docs.readme.com/main/docs/github-ai-writer" rel="noopener noreferrer"&gt;GitHub AI Writer&lt;/a&gt; "Proposes documentation updates when pull requests change your codebase." When a pull request opens in a connected repository, it "analyzes the diff, identifies new endpoints that need documentation or setup steps that have changed, and drafts the update on a review branch in ReadMe." It is "Available on Pro plans and above." If your API code is on GitHub and the pull request holds everything the guide needs, it covers the example change.&lt;/p&gt;

&lt;p&gt;Its docs describe only a GitHub integration, so GitLab code has no documented path. Its docs describe it reading the diff and describe no input from tickets, Slack threads, or specs. It starts when a pull request opens, so work that merged before you connected it waits for someone to notice.&lt;/p&gt;

&lt;p&gt;When is ReadMe's tooling enough on its own? When the guide edit can ride in the same pull request as the code and that pull request carries every fact, as with Markdown kept beside the code and pushed by rdme. Bi-directional sync needs an empty repository when you connect it, so in practice the guides start in a repository of their own. Once facts sit there, or in a ticket, a Slack thread, or a spec, the same-PR rule leans on memory; commenters in an &lt;a href="https://news.ycombinator.com/item?id=48825447" rel="noopener noreferrer"&gt;Ask HN thread&lt;/a&gt; on the topic rely on docs-first rules and nightly scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  A ReadMe sync checklist for this week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pick one path for Markdown pages. ReadMe says "If your project has Bi-Directional Sync enabled, you don't need rdme," though you still need the CLI for OpenAPI files.&lt;/li&gt;
&lt;li&gt;Check every synced branch's rules: "your Git provider can reject the commits ReadMe pushes to it" when protection rules or rulesets apply.&lt;/li&gt;
&lt;li&gt;Name branches exactly after your ReadMe versions, as ReadMe requires, so the branch a change merges into is the version it updates.&lt;/li&gt;
&lt;li&gt;Give every operation an explicit, stable &lt;code&gt;operationId&lt;/code&gt;, because a generated ID changes with the path and takes the old page with it.&lt;/li&gt;
&lt;li&gt;When the spec changes, search your guides, recipes, and reference-page prose for the changed operation before you close the release.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How EkLine plugs into a ReadMe setup
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part of the workflow&lt;/th&gt;
&lt;th&gt;Where it sits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Your Markdown pages&lt;/td&gt;
&lt;td&gt;The GitHub or GitLab repository ReadMe syncs, or the repository your CI runs rdme from.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What EkLine watches&lt;/td&gt;
&lt;td&gt;Your API code. The &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;GitHub App&lt;/a&gt; separates Code Repositories from Documentation Repositories, and Docs Agent also reviews &lt;a href="https://docs.ekline.io/changelog/" rel="noopener noreferrer"&gt;GitLab merge requests&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where the Docs Agent pull request lands&lt;/td&gt;
&lt;td&gt;Your docs repository, on the branch for the ReadMe version it documents.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How the change reaches your hub&lt;/td&gt;
&lt;td&gt;ReadMe's sync, or your rdme step, after your team merges.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI check&lt;/td&gt;
&lt;td&gt;Docs Reviewer checks the Markdown for style, consistency, links, and accuracy. Its &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;framework support page&lt;/a&gt; lists no ReadMe value, so it works without ReadMe-specific component handling.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bitbucket&lt;/td&gt;
&lt;td&gt;Docs Reviewer only, as a &lt;a href="https://docs.ekline.io/reviewer/integrations/bitbucket-integration/" rel="noopener noreferrer"&gt;Bitbucket Pipelines&lt;/a&gt; check.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What stays in ReadMe&lt;/td&gt;
&lt;td&gt;Hosting, the editor, versions, and the reference generated from your spec.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An engineer opens a pull request in the API repository that adds the required parameter. &lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; assesses its diff, title, and description once, when it opens. A high-confidence result starts a docs pull request editing existing pages such as the guide and the recipe; a medium result posts a suggestion comment. You merge it, ReadMe's sync or your rdme step carries the guide to the hub, and the reference updates from the spec. If the review stayed silent, the weekly &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; audits the last 30 days of GitHub activity. When the parameter came from a ticket or spec, a Docs Agent session can &lt;a href="https://docs.ekline.io/agent/combine-sources/" rel="noopener noreferrer"&gt;combine that source&lt;/a&gt; with the pull request. &lt;a href="https://docs.ekline.io/agent/scheduled-agents/" rel="noopener noreferrer"&gt;Code Sample Review&lt;/a&gt; "Verifies that code samples in your docs are accurate and runnable."&lt;/p&gt;

&lt;p&gt;Can one writer keep pace with a busy API? At &lt;a href="https://ekline.io/case-study/how-socure-built-developer-experience-into-a-moat-with-ekline" rel="noopener noreferrer"&gt;Socure&lt;/a&gt;, an identity intelligence company, one technical writer merged 348 documentation updates in seven weeks with no added headcount. The case study does not say which docs platform Socure uses.&lt;/p&gt;

&lt;p&gt;If you are weighing a self-hosted move, &lt;a href="https://potluck.ekline.io" rel="noopener noreferrer"&gt;Potluck Docs&lt;/a&gt;, EkLine's open-source Astro and Starlight template, renders OpenAPI references with Scalar and a built-in client for sending real requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does EkLine replace your docs platform?
&lt;/h3&gt;

&lt;p&gt;No. ReadMe keeps hosting your hub, generating the reference from your spec, and running sync or rdme. EkLine covers the pages ReadMe leaves to you: it reads code changes as pull requests open, sweeps merged work on a schedule, and opens pull requests against your guides and recipes for review. For a side-by-side view, read &lt;a href="https://ekline.io/blog/ekline-vs-readme" rel="noopener noreferrer"&gt;EkLine vs ReadMe&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use rdme or bi-directional sync?
&lt;/h3&gt;

&lt;p&gt;Use one for Markdown pages. Bi-directional sync fits a team that edits in both the ReadMe editor and Git, and it needs an empty repository, branch names that match versions, and branch rules that let ReadMe push. rdme fits a team that treats Git as the only source, because it pushes one way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does EkLine work if ReadMe syncs to Bitbucket?
&lt;/h3&gt;

&lt;p&gt;Partly. Docs Agent works with GitHub and GitLab, so it does not open pull requests in a Bitbucket repository. Docs Reviewer runs as a Bitbucket Pipelines check on your Markdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't we script this ourselves?
&lt;/h3&gt;

&lt;p&gt;Some teams do. In the Ask HN thread, cyanydeez described "a for loop that runs nightly on any files updated the prior day," handing the Markdown file next to each changed file to local AI to revise. With bi-directional sync, guides start in their own repository, so a recipe has no file beside the API code to pair with. Each rewrite also needs checking, which rstagi called hard: "it's hard to fact-check everything all the time." EkLine starts from the API pull request and drafts guide edits as a pull request in the repository ReadMe syncs, where a person approves them.&lt;/p&gt;

&lt;p&gt;Take the last pull request that added a parameter to your API, and bring it to the call. To see what Docs Agent would change in your ReadMe guides after your next spec update, &lt;a href="https://ekline.io" rel="noopener noreferrer"&gt;book a demo&lt;/a&gt;. Docs Agent is available to all plans, with access granted on request.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>api</category>
      <category>restapi</category>
      <category>github</category>
    </item>
    <item>
      <title>How to keep Mintlify docs up to date when code changes</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:16:01 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/how-to-keep-mintlify-docs-up-to-date-when-code-changes-40bf</link>
      <guid>https://dev.to/alisa_hester_1/how-to-keep-mintlify-docs-up-to-date-when-code-changes-40bf</guid>
      <description>&lt;p&gt;Mintlify already automates the structural half of keeping docs current: it builds API reference pages from your OpenAPI spec, checks links, validates builds, syncs with GitHub, and can draft pull requests when code merges. The half that slips is the prose and the examples whose facts live in other repositories, tickets, and threads. That half needs a review step, and it is where an EkLine pull request fits.&lt;/p&gt;

&lt;p&gt;Follow one change through this post: an endpoint's auth header changes. The reference page generated from your spec updates. The quickstart and a guide still show the old header, and &lt;code&gt;mint broken-links&lt;/code&gt; passes, because every link on those pages still resolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mintlify regenerates API reference pages from your OpenAPI spec; a spec hosted at a URL needs a Trigger deployment call.&lt;/li&gt;
&lt;li&gt;The Mintlify CLI checks links and build warnings, so an outdated header in valid MDX passes.&lt;/li&gt;
&lt;li&gt;Mintlify automations draft pull requests after code merges, and Mintlify's own guidance still keeps review and sign-offs.&lt;/li&gt;
&lt;li&gt;EkLine reads each code pull request as it opens and lands its docs pull request in the repository Mintlify deploys from.&lt;/li&gt;
&lt;/ul&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%2Fb32tqim9exn6jbv4449d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb32tqim9exn6jbv4449d.png" alt="Diagram: after one API change, the Mintlify API reference page generated from OpenAPI updates itself and link checks pass, while the quickstart and auth guide still show the old header; EkLine drafts the fix as a pull request and Mintlify deploys on merge" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Mintlify already keeps current
&lt;/h2&gt;

&lt;p&gt;Generated API pages. Mintlify's &lt;a href="https://www.mintlify.com/docs/api-playground/openapi-setup" rel="noopener noreferrer"&gt;OpenAPI setup&lt;/a&gt; lets you "Reference any number of OpenAPI specifications in the navigation element of your &lt;code&gt;docs.json&lt;/code&gt; to create pages for your API endpoints." When the spec lives in your repository, a spec change is a Git push and the site redeploys. When you host the spec at a URL, Mintlify warns that "changes to the spec don't trigger a Git push, so your docs won't redeploy automatically," and tells you to call the Trigger deployment API endpoint in the same CI action that generates or updates the spec.&lt;/p&gt;

&lt;p&gt;Link and build checks. In the &lt;a href="https://www.mintlify.com/docs/cli/commands" rel="noopener noreferrer"&gt;Mintlify CLI&lt;/a&gt;, &lt;code&gt;mint broken-links&lt;/code&gt; checks internal links; &lt;code&gt;--check-anchors&lt;/code&gt; also validates anchor links against heading slugs, and &lt;code&gt;--check-external&lt;/code&gt; also checks external URLs. &lt;code&gt;mint validate&lt;/code&gt; "Validate[s] your documentation build in strict mode. Exits with an error if there are any warnings or errors."&lt;/p&gt;

&lt;p&gt;Git sync. Mintlify "uses a GitHub App to automatically sync your documentation with your GitHub repository" and &lt;a href="https://www.mintlify.com/docs/deploy/github" rel="noopener noreferrer"&gt;deploys when you push&lt;/a&gt;. In a monorepo, you can "specify a subdirectory if your docs are not at the repository root."&lt;/p&gt;

&lt;p&gt;Drafted updates. Mintlify &lt;a href="https://www.mintlify.com/docs/agent/suggestions" rel="noopener noreferrer"&gt;automations&lt;/a&gt; include a code change trigger that "Runs when a pull request merges in one or more connected source code repositories." The agent "reads your project content and any connected repositories, then follows the prompt to make updates." Automations require a Pro or Enterprise plan, "Each run that updates your docs costs 250 credits," and each automation can run up to 500 times per day. If the auth header change merges in a connected repository, this feature may already cover it, so check it before you add another tool.&lt;/p&gt;

&lt;p&gt;Mintlify still keeps people in the loop. Its &lt;a href="https://www.mintlify.com/docs/guides/maintenance" rel="noopener noreferrer"&gt;maintenance guide&lt;/a&gt; says "Update docs in the same pull request as the code change" and "Require a docs sign-off before closing any ticket that changes user-facing behavior," then sets monthly, quarterly, and annual reviews. A June 18, 2026 Mintlify article on &lt;a href="https://www.mintlify.com/library/how-to-stop-documentation-drift" rel="noopener noreferrer"&gt;stopping documentation drift&lt;/a&gt; adds that "pull request review is the safer setup for user-facing documentation."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the auth header change still slips through
&lt;/h2&gt;

&lt;p&gt;Test your own repository. Open the last merged pull request that changed how your API authenticates or what a request must send. Did anything flag the quickstart or guide that shows the old request? If nothing did, the reason is in what each Mintlify check reads.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Native check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;th&gt;What it does not see&lt;/th&gt;
&lt;th&gt;Where EkLine fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.mintlify.com/docs/cli/commands" rel="noopener noreferrer"&gt;&lt;code&gt;mint broken-links&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Internal links, plus anchors and external URLs with flags&lt;/td&gt;
&lt;td&gt;A working link on a page whose sample sends the old header&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; reads the API pull request and can start the docs fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.mintlify.com/docs/cli/commands" rel="noopener noreferrer"&gt;&lt;code&gt;mint validate&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The build in strict mode, failing on any warning or error&lt;/td&gt;
&lt;td&gt;Valid MDX that describes old behavior&lt;/td&gt;
&lt;td&gt;Docs Reviewer comments on the docs change, with &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;Mintlify component support&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.mintlify.com/docs/api-playground/openapi-setup" rel="noopener noreferrer"&gt;OpenAPI pages&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Reference pages generated from your spec&lt;/td&gt;
&lt;td&gt;Quickstarts and guides written by hand in MDX&lt;/td&gt;
&lt;td&gt;Docs Agent edits those pages in your &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;documentation repository&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two gaps sit outside every check: a migration note that lives in a ticket or a Slack thread, and hand-kept files. In a Mintlify-based repository, drewdrewthis &lt;a href="https://github.com/langwatch/tasks/issues/688" rel="noopener noreferrer"&gt;reported on August 21, 2026&lt;/a&gt; that llms-full.txt "is maintained by hand, which means it drifts silently and there is no signal when it does."&lt;/p&gt;

&lt;p&gt;So when are native tools enough? When your API code and docs share a repository and every fact the guide needs is in the pull request, Mintlify's checks plus the same-PR rule from its &lt;a href="https://www.mintlify.com/docs/guides/maintenance" rel="noopener noreferrer"&gt;maintenance guide&lt;/a&gt; cover the change. When the facts live in tickets, Slack, specs, or a separate code repository, the rule depends on memory; practitioners in an &lt;a href="https://news.ycombinator.com/item?id=48825447" rel="noopener noreferrer"&gt;Ask HN thread&lt;/a&gt; on keeping docs current describe docs-first habits and homemade nightly scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Mintlify upkeep checklist for this week
&lt;/h2&gt;

&lt;p&gt;You need write access to the docs repository and its CI. None of these steps needs EkLine.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If your OpenAPI spec is hosted at a URL, call the Trigger deployment endpoint in the CI action that updates the spec.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;mint broken-links&lt;/code&gt; with &lt;code&gt;--check-anchors&lt;/code&gt; and &lt;code&gt;--check-external&lt;/code&gt; before you publish; renamed headings change their slugs.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;mint validate&lt;/code&gt; to CI so a warning fails the build before readers see it.&lt;/li&gt;
&lt;li&gt;When a header, parameter, or endpoint name changes, search the whole docs repository for the old string, including hand-maintained files such as llms-full.txt. The link checks pass on this failure.&lt;/li&gt;
&lt;li&gt;Adopt the two process rules from Mintlify's maintenance guide: docs in the same pull request as the code, and a docs sign-off before closing any ticket that changes user-facing behavior.&lt;/li&gt;
&lt;li&gt;If you run automations, keep their pull requests on review. Mintlify's drift article calls review the safer setup.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How EkLine plugs into a Mintlify repository
&lt;/h2&gt;

&lt;p&gt;EkLine works in the repository Mintlify already deploys from, so your publishing path stays as it is.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;On Mintlify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where your content lives&lt;/td&gt;
&lt;td&gt;The repository Mintlify's GitHub App deploys from, at the root or in a monorepo subdirectory.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What EkLine watches&lt;/td&gt;
&lt;td&gt;The code repositories you select in the &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;EkLine GitHub App&lt;/a&gt;, which lists them apart from your documentation repository. Docs Agent also &lt;a href="https://docs.ekline.io/changelog/" rel="noopener noreferrer"&gt;reviews GitLab merge requests&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where its pull request lands&lt;/td&gt;
&lt;td&gt;Your docs repository. Mintlify deploys on merge, as it does today.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which CI check runs&lt;/td&gt;
&lt;td&gt;Docs Reviewer, which checks each docs change for style, consistency, links, and accuracy, with the &lt;code&gt;mintlify&lt;/code&gt; framework value, set in its &lt;a href="https://docs.ekline.io/reviewer/integrations/cli-integration/" rel="noopener noreferrer"&gt;configuration or with &lt;code&gt;--framework&lt;/code&gt;&lt;/a&gt;. The &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;framework support page&lt;/a&gt; says "Mintlify currently has the most comprehensive component support."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What stays in Mintlify&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;docs.json&lt;/code&gt;, generated API pages, hosting, deploys, and any automations you run.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Walk the auth header change through Docs Agent. When the engineer opens the API pull request, or marks a draft ready, &lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;automatic PR review&lt;/a&gt; reads the diff, title, and description once and scores the documentation impact. A low score stays silent, a medium score leaves a suggestion comment, and a high score starts a docs pull request in your Mintlify repository for the pages that need the new header. You review and merge it, and Mintlify deploys. Automatic PR review reads the pull request alone and leaves linked tickets out. When the migration note sits in a Jira ticket or a Slack thread, open a Docs Agent session and &lt;a href="https://docs.ekline.io/agent/combine-sources/" rel="noopener noreferrer"&gt;combine the sources&lt;/a&gt;; if they disagree, "the agent flags the conflict in the chat so you can decide." A weekly &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; sweeps what merged before you connected EkLine or scored below the threshold, and the &lt;a href="https://docs.ekline.io/agent/scheduled-agents/" rel="noopener noreferrer"&gt;Code Sample Review&lt;/a&gt; agent in Scheduled Agents "Verifies that code samples in your docs are accurate and runnable."&lt;/p&gt;

&lt;p&gt;If your doubt is whether reviewers will trust drafts they did not write: over one quarter, April 7 to July 6, 2026, &lt;a href="https://ekline.io/case-study/how-contextqas-engineers-merge-97-percent-of-what-an-ai-agent-writes" rel="noopener noreferrer"&gt;ContextQA's engineers&lt;/a&gt; "merged 97.5% of what the agent proposed, 79 updates, and set aside only two." ContextQA hosts its docs on GitBook, so read this as an EkLine result on another platform.&lt;/p&gt;

&lt;p&gt;The limits: the assessment runs once per pull request, you cannot customize its confidence thresholds, and Docs Agent works with GitHub and GitLab. Docs Agent is available to all plans, and EkLine grants access on request.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does EkLine replace your docs platform?
&lt;/h3&gt;

&lt;p&gt;No. Mintlify keeps your &lt;code&gt;docs.json&lt;/code&gt;, generated API reference, hosting, and deploys. EkLine adds a step before them: it reads code pull requests as they open, drafts docs pull requests into the repository Mintlify deploys from, and runs a Docs Reviewer check that handles Mintlify components. For a feature-by-feature view, read &lt;a href="https://ekline.io/blog/ekline-vs-mintlify-which-documentation-tool-is-right-for-you" rel="noopener noreferrer"&gt;EkLine vs Mintlify&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do Mintlify automations replace a docs review step?
&lt;/h3&gt;

&lt;p&gt;Mintlify's own guidance keeps the review step. Its drift article says Mintlify "can be configured to automerge workflow pull requests, but pull request review is the safer setup for user-facing documentation," and its maintenance guide still asks for docs sign-offs and scheduled reviews. An automation drafts the change; a reviewer decides whether it is right before it goes live.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't we script this ourselves?
&lt;/h3&gt;

&lt;p&gt;You can, and the Ask HN thread shows one version: cyanydeez described "a for loop that runs nightly on any files updated the prior day," with local AI revising the Markdown file next to each one. On Mintlify, when the quickstart lives in a separate docs repository, nothing sits beside the changed API file to revise. Someone also has to check each nightly rewrite, and rstagi named that cost in the same thread: "it's hard to fact-check everything all the time." EkLine reads the API pull request and, at high confidence, opens a docs pull request for the pages that need the change, so the check happens in review.&lt;/p&gt;

&lt;p&gt;Bring one recent API pull request, such as the last auth change, and see what EkLine would have changed in your quickstart. &lt;a href="https://ekline.io" rel="noopener noreferrer"&gt;Book an EkLine demo&lt;/a&gt; to walk through your own Mintlify setup.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>api</category>
      <category>automation</category>
      <category>github</category>
    </item>
    <item>
      <title>How to keep GitBook in sync with GitHub, and accurate</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:01:01 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/how-to-keep-gitbook-in-sync-with-github-and-accurate-2lpe</link>
      <guid>https://dev.to/alisa_hester_1/how-to-keep-gitbook-in-sync-with-github-and-accurate-2lpe</guid>
      <description>&lt;p&gt;To keep GitBook in sync with GitHub without losing edits, and keep the content accurate, turn on Git Sync, choose the first sync direction on purpose, and edit each page in one place while a change is open. That keeps the editor and your repository identical. For accuracy, make the synced repository the place where every correction lands, whether a writer, an engineer, or EkLine makes it.&lt;/p&gt;

&lt;p&gt;Take a common collision. An engineer renames a CLI flag in the code repository while a writer has an open change request in the GitBook editor on the page that documents that flag. The path below lands both edits without either one overwriting the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Git Sync already handles
&lt;/h2&gt;

&lt;p&gt;GitBook describes &lt;a href="https://gitbook.com/docs/docs-as-code/git-sync" rel="noopener noreferrer"&gt;Git Sync&lt;/a&gt; as bi-directional: "changes you make directly in GitBook's editor are automatically synced, as are any commits made on GitHub or GitLab." Your pages sit in the repository as Markdown, and GitBook adds safeguards around the sync:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you &lt;a href="https://gitbook.com/docs/docs-as-code/git-sync/enabling-github-sync" rel="noopener noreferrer"&gt;enable GitHub Sync&lt;/a&gt;, you "Choose the source of truth for the initial sync," and GitBook warns that "GitHub → GitBook can replace your section's content," for example with an empty repository's empty content.&lt;/li&gt;
&lt;li&gt;Edits merged in GitBook reach Git as &lt;a href="https://gitbook.com/docs/docs-as-code/git-sync/commits" rel="noopener noreferrer"&gt;commits named&lt;/a&gt; &lt;code&gt;GITBOOK-{change_request_number}: {change_request_subject}&lt;/code&gt;, so your history shows which changes came from the editor.&lt;/li&gt;
&lt;li&gt;If your docs live in the code repository, &lt;a href="https://gitbook.com/docs/docs-as-code/git-sync/monorepos" rel="noopener noreferrer"&gt;site-wide Git Sync&lt;/a&gt; can "sync multiple spaces from one repository and branch," each space in its own directory.&lt;/li&gt;
&lt;li&gt;A change request that conflicts with the space's live content is &lt;a href="https://gitbook.com/docs/guides/editing-and-publishing-documentation/how-to-handle-merge-conflicts-in-gitbook" rel="noopener noreferrer"&gt;resolved&lt;/a&gt; with &lt;strong&gt;Keep primary&lt;/strong&gt; or &lt;strong&gt;Keep changed&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You can &lt;a href="https://gitbook.com/docs/create-content/openapi/add-an-openapi-specification" rel="noopener noreferrer"&gt;add an OpenAPI spec&lt;/a&gt; by file upload, URL, or CLI. For a URL, "GitBook checks for updates automatically every 6 hours."&lt;/li&gt;
&lt;/ul&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%2F5yt4f4d0ypdjsaj9h13r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5yt4f4d0ypdjsaj9h13r.png" alt="Diagram: the GitBook editor and a GitHub or GitLab repo linked by two-way Git Sync, with a reviewed and merged EkLine pull request entering on the repo side; note to edit a page in one place at a time" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the flag rename still slips through
&lt;/h2&gt;

&lt;p&gt;Try this on your own space. Open the last merged pull request that renamed a flag, option, or command. Did anything flag the GitBook page that documents it? Each safeguard checks something real, and none of their docs describes comparing a page with the code.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Native check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;th&gt;What it does not see&lt;/th&gt;
&lt;th&gt;Where EkLine fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://gitbook.com/docs/docs-as-code/git-sync" rel="noopener noreferrer"&gt;Git Sync&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The editor and the repository hold the same content&lt;/td&gt;
&lt;td&gt;Whether that content still matches the code&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; reads the code pull request behind the rename&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://gitbook.com/docs/guides/editing-and-publishing-documentation/how-to-handle-merge-conflicts-in-gitbook" rel="noopener noreferrer"&gt;Keep primary or Keep changed&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Which side of a conflicting change request wins&lt;/td&gt;
&lt;td&gt;A pull request on the same page, which GitBook tracks separately&lt;/td&gt;
&lt;td&gt;The &lt;a href="https://docs.ekline.io/agent/update-review/" rel="noopener noreferrer"&gt;docs pull request&lt;/a&gt; lands in the synced repository for review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://gitbook.com/docs/create-content/openapi/add-an-openapi-specification" rel="noopener noreferrer"&gt;OpenAPI by URL&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The reference, checked every 6 hours&lt;/td&gt;
&lt;td&gt;The guides written around it&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/scheduled-agents/" rel="noopener noreferrer"&gt;Code Sample Review&lt;/a&gt; checks the samples in those guides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://gitbook.com/docs/gitbook-agent/overview" rel="noopener noreferrer"&gt;GitBook Agent&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Change requests, as a linter, and support signals&lt;/td&gt;
&lt;td&gt;Code diffs, which its docs do not describe reading&lt;/td&gt;
&lt;td&gt;EkLine starts from the code change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GitBook's &lt;a href="https://gitbook.com/docs/docs-as-code/git-sync/troubleshooting" rel="noopener noreferrer"&gt;Git Sync troubleshooting page&lt;/a&gt; is clear that the two sides track work separately: "Creating a pull request in GitHub or GitLab doesn't create a change request in GitBook, and creating a change request in GitBook doesn't create a pull request in your repository." The writer's change request and a pull request on the same page proceed without seeing each other.&lt;/p&gt;

&lt;p&gt;Existing repositories add two traps. The same page says GitBook "may create new markdown files instead of using the existing ones," and that creating readme files through the GitBook UI "Creates duplicate README files in your repository." In a June 2025 &lt;a href="https://github.com/GitbookIO/gitbook/issues/3333" rel="noopener noreferrer"&gt;issue filed against GitBook&lt;/a&gt;, marmarmo listed "Loss of documentation with overwrites," called it "a common pitfall in GitHub-synced projects," and reported that "the GitBook space had to be hard reset to remove duplicated instances."&lt;/p&gt;

&lt;p&gt;Accuracy is a separate job: Git Sync mirrors the old flag name to both sides. On &lt;a href="https://news.ycombinator.com/item?id=44026945" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt;, themast wrote that "writing an OpenAPI spec and then keeping a separate GitBook in sync felt like twice the work."&lt;/p&gt;

&lt;p&gt;GitBook Agent covers part of this. &lt;a href="https://gitbook.com/docs/gitbook-agent/overview" rel="noopener noreferrer"&gt;GitBook's documentation&lt;/a&gt; says it writes docs from a prompt, can "Review change requests" as a docs linter, and can use "support conversations, tickets, and threads from your connected tools" to propose updates. It is free for all plans in beta, with 10 free messages a week outside Pro and trials. For a fix that starts in support, it works inside the editor your writers already use. Its &lt;a href="https://www.gitbook.com/blog/introducing-docs-agent" rel="noopener noreferrer"&gt;December 10, 2025 launch post&lt;/a&gt; said that "Soon, GitBook Agent will be able to connect to" support conversations, Slack threads, GitHub issues, and more, and it describes no reading of pull requests or code diffs, where the flag rename starts.&lt;/p&gt;

&lt;p&gt;Is a native setup enough? Yes, if your space syncs from the code repository itself, which site-wide Git Sync allows, and the pull request holds every fact the page needs: a rule that the rename and its doc edit merge together covers you. No, when the reason for the rename sits in a ticket, a Slack thread, a spec, or a separate code repository. In an &lt;a href="https://news.ycombinator.com/item?id=48825447" rel="noopener noreferrer"&gt;Ask HN thread&lt;/a&gt; about keeping documentation up to date, commenters trade docs-first rules and nightly scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Git Sync safety checklist for this week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Choose the first sync direction on purpose, and confirm the repository holds the content you want before you pick GitHub → GitBook.&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;README.md&lt;/code&gt; in the repository and avoid creating readme files in the GitBook UI.&lt;/li&gt;
&lt;li&gt;Give each page one place of editing during a change: when a pull request touches a page with an open change request, finish one before you merge the other.&lt;/li&gt;
&lt;li&gt;Add your OpenAPI spec by URL so the reference refreshes on the 6-hour check, and click &lt;strong&gt;Check for updates&lt;/strong&gt; after a release.&lt;/li&gt;
&lt;li&gt;Know the recovery path: if Git Sync shows an unexpected error, GitBook says merging a small change request exports all content again, and a small commit imports it again.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where EkLine fits in a Git-synced space
&lt;/h2&gt;

&lt;p&gt;EkLine works in the repository, so Git Sync has to be on; a space edited only in GitBook has no repository to receive a pull request.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;With GitBook&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where your content lives&lt;/td&gt;
&lt;td&gt;Your GitBook space, synced to a GitHub or GitLab repository. Docs Agent works with GitHub and GitLab, not Bitbucket.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What EkLine watches&lt;/td&gt;
&lt;td&gt;Code repositories, which the &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;EkLine GitHub App&lt;/a&gt; lists apart from documentation repositories.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When it reads a change&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; assesses each pull request once, when it opens or moves from draft to ready. A weekly &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; sweeps what merged before EkLine was connected or fell below the threshold.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where its pull request lands&lt;/td&gt;
&lt;td&gt;The Git Sync repository, as a &lt;a href="https://docs.ekline.io/agent/update-review/" rel="noopener noreferrer"&gt;docs pull request&lt;/a&gt; your team reviews.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which CI check runs&lt;/td&gt;
&lt;td&gt;Docs Reviewer, which checks each docs change for style, consistency, links, and accuracy, through its &lt;a href="https://docs.ekline.io/reviewer/quickstart/github-action/" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;; &lt;code&gt;gitbook&lt;/code&gt; is one of its five &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;framework values&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What stays in GitBook&lt;/td&gt;
&lt;td&gt;The editor, change requests, hosting, GitBook Agent, and Git Sync.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Back to the flag rename. When the engineer opens the pull request, Docs Agent reads its diff, title, and description. A high-confidence result opens a docs pull request in the synced repository that updates the affected page; a medium one leaves a suggestion comment. The writer merges or closes the open change request on that page first, then reviews the docs pull request and merges it through the normal branch, and Git Sync, GitBook's own feature, carries it into the editor. The review reads the pull request alone ("Linked Jira or Linear tickets are not included"), so a rename that starts in a ticket goes through a Docs Agent session that can &lt;a href="https://docs.ekline.io/agent/combine-sources/" rel="noopener noreferrer"&gt;combine sources&lt;/a&gt;. For a feature-by-feature view, read &lt;a href="https://ekline.io/blog/ekline-vs-gitbook" rel="noopener noreferrer"&gt;EkLine vs GitBook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Will your engineers go along with it? P0 Security, a GitBook team, kept "Same GitHub. Same PR workflow. Same GitBook hosting. Same review process." Its &lt;a href="https://ekline.io/case-study/how-p0-securitys-engineering-team-stopped-writing-docs-and-started-shipping-faster" rel="noopener noreferrer"&gt;case study&lt;/a&gt; reports its engineers reclaimed 150+ hours in 6 months.&lt;/p&gt;

&lt;p&gt;Will it reach pages that are already stale? ContextQA, also on GitBook, brought 90 of 113 pages up to date in one quarter; the &lt;a href="https://ekline.io/case-study/how-contextqas-engineers-merge-97-percent-of-what-an-ai-agent-writes" rel="noopener noreferrer"&gt;ContextQA case study&lt;/a&gt; adds, "The pages doing that answering are the ones EkLine refreshed."&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does EkLine replace your docs platform?
&lt;/h3&gt;

&lt;p&gt;No. GitBook keeps the editor, change requests, hosting, and Git Sync. EkLine adds docs pull requests in your synced GitHub or GitLab repository when code changes, plus a Docs Reviewer check with GitBook framework support. Writers keep working in GitBook and see each merged update there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which side wins when the GitBook editor and the repo both change?
&lt;/h3&gt;

&lt;p&gt;GitBook's Git Sync overview and troubleshooting pages do not say. They state that pull requests and change requests are separate, and inside GitBook a conflicting change request is settled with Keep primary or Keep changed. Avoid the race: edit a page in one place at a time, and close or merge the change request before merging a pull request on the same page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need a GitBook alternative to keep API docs current?
&lt;/h3&gt;

&lt;p&gt;Not for the reference, since GitBook checks a spec added by URL every 6 hours. The guides around it need the repository workflow above. If you decide to leave GitBook for a self-hosted, Git-native site, &lt;a href="https://potluck.ekline.io" rel="noopener noreferrer"&gt;Potluck Docs&lt;/a&gt; is EkLine's open source (MIT) Astro + Starlight template.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't we script this ourselves?
&lt;/h3&gt;

&lt;p&gt;Partly. In the Ask HN thread, cyanydeez described "a for loop that runs nightly on any files updated the prior day," with local AI revising the Markdown file beside each changed file. When your space syncs from a separate docs repository, the page that documents a flag does not sit beside the code that renamed it. And every nightly rewrite still needs a reader, the cost rstagi named: "it's hard to fact-check everything all the time." EkLine reads the code pull request instead, and its reviewed pull request reaches the editor through Git Sync.&lt;/p&gt;

&lt;p&gt;Pick one merged pull request that renamed something your GitBook pages mention, and bring it along. To see what EkLine would change in your GitBook repository, &lt;a href="https://ekline.io" rel="noopener noreferrer"&gt;book a demo&lt;/a&gt;. Docs Agent is available to all plans, and access is granted on request.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>github</category>
      <category>git</category>
      <category>automation</category>
    </item>
    <item>
      <title>How to keep Astro Starlight docs accurate after a green build</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Mon, 12 Oct 2026 05:46:01 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/how-to-keep-astro-starlight-docs-accurate-after-a-green-build-33ci</link>
      <guid>https://dev.to/alisa_hester_1/how-to-keep-astro-starlight-docs-accurate-after-a-green-build-33ci</guid>
      <description>&lt;p&gt;"My Starlight build is green. How do I know the docs are still right?" A green build tells you the site is well-formed: frontmatter matches its schema, internal links resolve once you add a validator, and API pages render from your spec. It cannot tell you whether a sentence in a how-to is still true, which takes a content check driven by what changed in the product.&lt;/p&gt;

&lt;p&gt;Take one change: your product renames a component prop. The frontmatter schema passes, the links validate, the starlight-openapi pages regenerate from the updated spec, and the English how-to still shows the old prop. Every translation of that page now repeats the mistake.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Starlight's schema, link, and OpenAPI checks prove the site is well-formed; none reads a how-to against the product.&lt;/li&gt;
&lt;li&gt;Translations inherit English errors, and Git-based tracking can flag them once the English page is fixed.&lt;/li&gt;
&lt;li&gt;A content check driven by product pull requests closes the gap, with Starlight unchanged.&lt;/li&gt;
&lt;/ul&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%2Fpxkc5so7grzvlr2xu45o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpxkc5so7grzvlr2xu45o.png" alt="Diagram: what a green Starlight build proves, a stack of checks for frontmatter schema, internal links, OpenAPI pages and translation tracking, topped by the open question of whether each sentence is still true, which EkLine checks against product changes" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Starlight and its plugins already check
&lt;/h2&gt;

&lt;p&gt;Starlight pages live in an Astro content collection, and Astro validates them. In the words of the &lt;a href="https://docs.astro.build/en/guides/content-collections/" rel="noopener noreferrer"&gt;content collections guide&lt;/a&gt;, "Schemas enforce consistent frontmatter or entry data within a collection through Zod validation," and "If any file violates its collection schema, Astro will provide a helpful error to let you know." Starlight's &lt;code&gt;docsSchema()&lt;/code&gt; helper takes an &lt;a href="https://starlight.astro.build/reference/frontmatter/" rel="noopener noreferrer"&gt;&lt;code&gt;extend&lt;/code&gt; option&lt;/a&gt; that can make built-in fields required or add fields of your own, so a page missing something you care about surfaces as an error.&lt;/p&gt;

&lt;p&gt;Link checking came from the community. In June 2023, &lt;a href="https://github.com/withastro/starlight/issues/247" rel="noopener noreferrer"&gt;Starlight issue #247&lt;/a&gt; asked for "basic tooling to ensure the integrity of internal links," and the thread pointed to &lt;a href="https://github.com/HiDeoo/starlight-links-validator" rel="noopener noreferrer"&gt;starlight-links-validator&lt;/a&gt;, an MIT-licensed plugin by HiDeoo. Its &lt;a href="https://starlight-links-validator.vercel.app/getting-started/" rel="noopener noreferrer"&gt;getting started page&lt;/a&gt; describes "A Starlight plugin to validate internal links in Markdown and MDX files," and the check runs during a production build.&lt;/p&gt;

&lt;p&gt;The API reference can come from the spec. &lt;a href="https://github.com/HiDeoo/starlight-openapi" rel="noopener noreferrer"&gt;starlight-openapi&lt;/a&gt;, also by HiDeoo under MIT, is a "Starlight plugin to generate documentation from OpenAPI/Swagger specifications," so endpoint pages follow the spec your engineers maintain.&lt;/p&gt;

&lt;p&gt;Translations have two tools. Starlight's &lt;a href="https://starlight.astro.build/guides/i18n/" rel="noopener noreferrer"&gt;i18n guide&lt;/a&gt; handles missing pages: when a translation does not exist yet, readers get the default-language page with the notice "This content is not available in your language yet." Tracking stale translations belongs to a separate project, &lt;a href="https://lunaria.dev/blog/introducing-lunaria/" rel="noopener noreferrer"&gt;Lunaria&lt;/a&gt;, which describes "a custom tracking system that keeps track of your source and localized content changes powered by Git." Lunaria's May 2024 launch post lists Astro and Starlight among the projects using it to track translations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the renamed prop slips through
&lt;/h2&gt;

&lt;p&gt;Try this on your docs. Pick the most recent merged pull request that renamed a prop or changed what a component does. Did anything flag the how-to that shows it? Run the rename past each check:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Native check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;th&gt;What it does not see&lt;/th&gt;
&lt;th&gt;Where EkLine fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.astro.build/en/guides/content-collections/" rel="noopener noreferrer"&gt;Collection schema&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Frontmatter against its Zod schema&lt;/td&gt;
&lt;td&gt;The page body, where the old prop sits&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; reads the product pull request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://starlight-links-validator.vercel.app/getting-started/" rel="noopener noreferrer"&gt;starlight-links-validator&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Internal links in Markdown and MDX, in production builds&lt;/td&gt;
&lt;td&gt;A how-to whose links resolve and whose example is out of date&lt;/td&gt;
&lt;td&gt;Docs Agent opens an MDX edit in your &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;docs repository&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/HiDeoo/starlight-openapi" rel="noopener noreferrer"&gt;starlight-openapi&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Endpoint pages generated from the spec&lt;/td&gt;
&lt;td&gt;Hand-written how-tos around those pages&lt;/td&gt;
&lt;td&gt;Docs Agent drafts their fixes, and Docs Reviewer checks their writing with the &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;astro framework value&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://lunaria.dev/blog/introducing-lunaria/" rel="noopener noreferrer"&gt;Lunaria&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Which translations predate a change to the English source&lt;/td&gt;
&lt;td&gt;An English page that is wrong and unchanged&lt;/td&gt;
&lt;td&gt;A merged English fix gives Lunaria a change to track&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The i18n guide describes no outdated-translation check, and once a translated page exists, the fallback notice has no reason to appear, so translated readers see the old prop with no warning. Until someone notices the English error, nothing in the stack flags it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A checklist you can run this week without EkLine
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Extend &lt;code&gt;docsSchema()&lt;/code&gt; with an owner or last-reviewed field, so every page names who answers for it and when someone last checked it.&lt;/li&gt;
&lt;li&gt;Add starlight-links-validator to the production build your CI already runs, and confirm in your own pipeline how a broken link is reported.&lt;/li&gt;
&lt;li&gt;Generate the API reference with starlight-openapi from the spec your engineers ship, and stop hand-editing endpoint pages.&lt;/li&gt;
&lt;li&gt;Track translations with Git-based tooling such as Lunaria, so a change to an English source page can show up against each locale.&lt;/li&gt;
&lt;li&gt;After each release, reread your most-visited how-to pages against what shipped, starting with pages that show code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Is a same-PR docs rule enough for a small team?
&lt;/h2&gt;

&lt;p&gt;For most small teams it is: when the engineer who renames the prop also edits the how-to in the same pull request, the docs stay right without new tooling. Practitioners on &lt;a href="https://news.ycombinator.com/item?id=48825447" rel="noopener noreferrer"&gt;Ask HN&lt;/a&gt; describe docs-first and docs-in-the-PR habits: "Update the documentation first ... Followed by the code changes," and "every AI-heavy PR still needs a human owner, reproducible tests, and docs explaining the behavior change." Starlight's &lt;a href="https://starlight.astro.build/guides/authoring-content" rel="noopener noreferrer"&gt;authoring guide&lt;/a&gt; describes no built-in AI writer, so a second layer here would not overlap with a platform agent.&lt;/p&gt;

&lt;p&gt;Draw the line here. The same-PR rule and Starlight's checks are enough when the product and the docs share a repository and every fact the how-to needs is in that pull request. They fall short once those facts sit in a ticket, a Slack thread, a spec, or a repository the docs team does not watch, or when each how-to has translations to keep in step.&lt;/p&gt;

&lt;h2&gt;
  
  
  How EkLine fits a Starlight repository
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;On a Starlight site&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where your content lives&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;src/content/docs&lt;/code&gt; in a GitHub or GitLab repository.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What EkLine watches&lt;/td&gt;
&lt;td&gt;Your code repositories. The &lt;a href="https://docs.ekline.io/agent/github-app-setup/" rel="noopener noreferrer"&gt;GitHub App&lt;/a&gt; lists Code Repositories separately from Documentation Repositories, so the product and the docs can live in different repositories.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When it reads a change&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;Automatic PR review&lt;/a&gt; assesses each pull request once, when it opens or leaves draft, from the diff, title, and description. GitLab merge requests get the same review, per the &lt;a href="https://docs.ekline.io/changelog/" rel="noopener noreferrer"&gt;May 2026 changelog&lt;/a&gt;. A scheduled &lt;a href="https://docs.ekline.io/agent/prevent-documentation-drift/" rel="noopener noreferrer"&gt;Docs Drift Review&lt;/a&gt; sweeps what merged.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where its pull request lands&lt;/td&gt;
&lt;td&gt;Your docs repository, as an edit to the MDX that your team reviews and merges.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which CI check runs&lt;/td&gt;
&lt;td&gt;Docs Reviewer, which checks each docs change for style, consistency, links, and accuracy, set to the &lt;code&gt;astro&lt;/code&gt; &lt;a href="https://docs.ekline.io/reviewer/configuration/framework-support/" rel="noopener noreferrer"&gt;framework value&lt;/a&gt; in its config or &lt;a href="https://docs.ekline.io/reviewer/integrations/cli-integration/" rel="noopener noreferrer"&gt;CLI&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What stays in Starlight&lt;/td&gt;
&lt;td&gt;Your Astro build and preview, plugins, schema, and translation workflow.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Take the prop rename again. When it opens as a pull request in the product repository, automatic PR review assesses it. At high confidence, Docs Agent opens a docs pull request that edits the English how-to; at medium, it leaves a suggestion comment; at low, it stays silent. That assessment uses the pull request alone: "Linked Jira or Linear tickets are not included." If the rename merged before you connected EkLine or scored below the threshold, the Drift Review catches it, using a default prompt that starts "Audit the last 30 days of GitHub activity for customer-facing changes that lack documentation." The framework page says "Mintlify currently has the most comprehensive component support" and "Support for other frameworks is expanding," so test your custom components. If the old prop also appears in samples across other pages, the &lt;a href="https://docs.ekline.io/agent/scheduled-agents/" rel="noopener noreferrer"&gt;Code Sample Review&lt;/a&gt; agent in Scheduled Agents "Verifies that code samples in your docs are accurate and runnable." Docs Agent "is available to all plans, but we grant access on request."&lt;/p&gt;

&lt;p&gt;Worried about volume once every product change gets a docs check? At &lt;a href="https://ekline.io/case-study/how-socure-built-developer-experience-into-a-moat-with-ekline" rel="noopener noreferrer"&gt;Socure&lt;/a&gt;, "One technical writer merged 348 documentation updates in seven weeks" using EkLine, "with no added headcount." The case study does not name Socure's docs platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving to Starlight, or starting fresh
&lt;/h2&gt;

&lt;p&gt;If you are moving to Starlight from another framework, the path that puts the least accuracy work at risk keeps your docs as Markdown and MDX in Git, so the pull request loop you run today works on the new site too. EkLine maintains &lt;a href="https://potluck.ekline.io" rel="noopener noreferrer"&gt;Potluck Docs&lt;/a&gt;, an &lt;a href="https://github.com/ekline-io/potluck-docs" rel="noopener noreferrer"&gt;open-source Astro + Starlight template&lt;/a&gt; under the MIT license, for that kind of start. It ships "Three example OpenAPI references, rendered by Scalar with a built-in client for sending real requests," private docs for signed-in readers and org-scoped docs for each org's members, and a sitemap and &lt;code&gt;llms.txt&lt;/code&gt; "generated on every build." By its own description, it is "a template, not a hosted product." Use it to start a site or as a reference; EkLine does not require it.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does EkLine replace your docs platform?
&lt;/h3&gt;

&lt;p&gt;No. Starlight keeps building, previewing, and serving your site, and your schema, plugins, and translation workflow stay where they are. EkLine adds a content layer on top: Docs Agent proposes MDX edits as pull requests when a product change makes a page wrong, and Docs Reviewer checks those pages in CI with its &lt;code&gt;astro&lt;/code&gt; framework value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Starlight check for broken links?
&lt;/h3&gt;

&lt;p&gt;Starlight's answer to the 2023 request for link checking, issue #247, was a community plugin: starlight-links-validator by HiDeoo. It validates internal links in Markdown and MDX files during a production build. External URLs are outside its stated scope, and its pages do not say outright that a broken link fails the build, so confirm the behavior in your own CI before you treat it as a gate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't we script this ourselves?
&lt;/h3&gt;

&lt;p&gt;To a point. In the Ask HN thread, cyanydeez described "a for loop that runs nightly on any files updated the prior day," with local AI revising the Markdown next to each one. A Starlight how-to lives in src/content/docs, apart from the component it documents, and each translation adds pages to pair. Each rewrite also needs a reviewer, the gap rstagi named: "it's hard to fact-check everything all the time." EkLine reads the product pull request and proposes the English edit for review.&lt;/p&gt;

&lt;p&gt;Open one product pull request from your last release and bring it along. To see what Docs Agent would flag in your Starlight repository after your next release, &lt;a href="https://ekline.io" rel="noopener noreferrer"&gt;book a demo with EkLine&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>astro</category>
      <category>documentation</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Claude Code mods: what they are and when to build one</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Mon, 05 Oct 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/claude-code-mods-what-they-are-and-when-to-build-one-32kp</link>
      <guid>https://dev.to/alisa_hester_1/claude-code-mods-what-they-are-and-when-to-build-one-32kp</guid>
      <description>&lt;p&gt;An hour into a Claude Code session, you scroll back through the transcript to answer three questions: what changed, how much context is left, and whether Claude ran something you would have stopped. The answers are in there, buried under every tool call.&lt;/p&gt;

&lt;p&gt;Mods, which Anthropic launched on October 1, 2026, let you put those answers where you already look. The &lt;a href="https://code.claude.com/docs/en/plugins/mods/overview" rel="noopener noreferrer"&gt;Claude Code mods overview&lt;/a&gt; defines a mod as "a plugin that changes how Claude Code looks and behaves," built from JavaScript or TypeScript handlers that run on events such as a tool call or a submitted prompt and "can watch the event, change it, or take it over."&lt;/p&gt;

&lt;p&gt;Build one when it shows a signal you keep scrolling for (context left, a risky command, what changed) in the place you already watch the agent work. When a settings hook, a status-line script, or a skill already does the job, skip the mod.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A mod is a plugin whose functions run inside Claude Code on events such as tool calls and prompts.&lt;/li&gt;
&lt;li&gt;Good first mods are small: a context band, a guard on risky commands, a replay of the last turn's edits.&lt;/li&gt;
&lt;li&gt;Mods run with your permissions, aren't sandboxed, and draw nothing in the VS Code extension's chat panel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What a Claude Code mod is
&lt;/h2&gt;

&lt;p&gt;A mod is a plugin with code in it. The &lt;a href="https://code.claude.com/docs/en/plugins/mods/create" rel="noopener noreferrer"&gt;Create a mod guide&lt;/a&gt; says the &lt;code&gt;modules&lt;/code&gt; key in a plugin's &lt;code&gt;hooks/hooks.json&lt;/code&gt; "is what makes the plugin a mod," and a small mod has three files: &lt;code&gt;plugin.json&lt;/code&gt;, &lt;code&gt;hooks.json&lt;/code&gt;, and &lt;code&gt;register.js&lt;/code&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%2Fg23wcmjidgul4dlh39qb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg23wcmjidgul4dlh39qb.png" alt="Flow diagram: an event, such as a tool call or a prompt, reaches your hook, which takes dollar sign, e, and next, and then observes it and passes it on, rewrites it and passes it on, or answers it so the tool never runs. Drawing, commands, files, and network access go only through the dollar sign API." width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A hook observes, rewrites, or answers each event it receives.&lt;/p&gt;

&lt;p&gt;Each function in &lt;code&gt;register.js&lt;/code&gt; is a hook that takes &lt;code&gt;($, e, next)&lt;/code&gt;: the mods API, the event, and the next handler. A hook can observe an event, rewrite it, or answer it so the usual behavior never runs. Drawing, commands, model calls, files, and network access all go through &lt;code&gt;$&lt;/code&gt;: "A hook has no other way to do those things, which is why Claude Code can list what a mod does before you install it." The overview's worked example uses two hooks to count tool calls and show "Thinking · tool calls: 3…" on the spinner, in about a dozen lines without comments. "Mods require Claude Code v2.1.287 or later, and they're on by default."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why mods exist: what hooks could not do
&lt;/h2&gt;

&lt;p&gt;Claude Code already had hooks, which the mods docs call settings hooks: a shell command, HTTP request, or prompt in a settings file that runs on a lifecycle event. &lt;a href="https://claude.com/blog/claude-code-mods" rel="noopener noreferrer"&gt;Anthropic's launch post&lt;/a&gt; names their limit: "Hooks helped give users some of this control, but hooks can't rewrite events, draw new UI, or replace features. Mods can."&lt;/p&gt;

&lt;p&gt;The overview lists five things a mod can do that settings hooks, skills, status lines, and MCP servers cannot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Draw a pane beside the transcript or a band above the prompt.&lt;/li&gt;
&lt;li&gt;Redraw Claude Code's own interface, such as the spinner.&lt;/li&gt;
&lt;li&gt;Step into a tool call, for example to hold it while it asks you a question.&lt;/li&gt;
&lt;li&gt;Run "a &lt;code&gt;/command&lt;/code&gt; that runs your function at once, with no Claude turn, even while Claude is working."&lt;/li&gt;
&lt;li&gt;Share data between hooks, so "one hook can count tool calls while another shows the count beside the spinner."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where the hype came from
&lt;/h2&gt;

&lt;p&gt;Mods began as a &lt;a href="https://github.com/anthropics/claude-code/issues/91870" rel="noopener noreferrer"&gt;GitHub proposal for "function hooks,"&lt;/a&gt; opened September 3, 2026, and now titled "Mods - make Claude 10x more extensible." On September 9 the thread settled the name: "we are going to be calling this functionality 'Claude Mods.'" On October 1 it posted "We're live!"&lt;/p&gt;

&lt;p&gt;Many early shared mods are playful or meter-style. OneWave, promoting its own set, &lt;a href="https://www.onewave-ai.com/blog/claude-code-mods" rel="noopener noreferrer"&gt;open-sourced ten&lt;/a&gt;, including "burn-meter," "boss-fight," and "code-pet," and describes mods as changing "what you see while it works." On Reddit, &lt;a href="https://www.reddit.com/r/ClaudeAI/comments/1ww2cn3/i_built_claude_fables_a_claude_code_mod_that/" rel="noopener noreferrer"&gt;Claude Fables&lt;/a&gt; retells the latest moment of a session "as a short art scene in the band above the prompt."&lt;/p&gt;

&lt;h2&gt;
  
  
  Mod, settings hook, status line, skill, or MCP server?
&lt;/h2&gt;

&lt;p&gt;Pick the simplest option that delivers your signal. Quotes come from the overview's table and the &lt;a href="https://code.claude.com/docs/en/statusline" rel="noopener noreferrer"&gt;status line docs&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;th&gt;When you want&lt;/th&gt;
&lt;th&gt;What it cannot do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mod&lt;/td&gt;
&lt;td&gt;"a pane, a band above the prompt, a custom command, or to rewrite an event"&lt;/td&gt;
&lt;td&gt;Draw in the VS Code extension's chat panel, &lt;code&gt;claude -p&lt;/code&gt;, or cloud sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Settings hook&lt;/td&gt;
&lt;td&gt;"to block, allow, or log an event with a script you already have"&lt;/td&gt;
&lt;td&gt;Draw in the interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status-line script&lt;/td&gt;
&lt;td&gt;A persistent line of session data, such as context usage or cost&lt;/td&gt;
&lt;td&gt;Draw a pane or buttons, or hold, change, or answer a tool call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;td&gt;To stop pasting "the same instructions into chat"&lt;/td&gt;
&lt;td&gt;Draw in the interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;Claude "needs to reach an external system"&lt;/td&gt;
&lt;td&gt;Draw in the interface&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only a mod draws panes, bands, or buttons, or runs a command with no Claude turn, and "A plugin can hold all of them," so you can combine them. For the skills side of documentation work, see this &lt;a href="https://ekline.io/blog/best-claude-skills-for-documentation-ranked" rel="noopener noreferrer"&gt;ranking of Claude skills for documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The case that mods are cosmetic
&lt;/h2&gt;

&lt;p&gt;One objection is that mods are cosmetic: settings hooks, MCP servers, and skills already cover anything that changes what the agent does. The evidence partly supports it: the docs send you to a settings hook to block, allow, or log. The built-in status line already "receives JSON session data on stdin and displays whatever your script prints," including context usage and cost. An open, undecided proposal in &lt;a href="https://github.com/cluesmith/codev/issues/1761" rel="noopener noreferrer"&gt;the Codev project&lt;/a&gt; rates a mod for role injection "No gain; keep the flag (cross-harness)" and says "shell hook, role flag and render gate remain the cross-harness floor."&lt;/p&gt;

&lt;p&gt;The objection fails on control flow. The docs' comparison table says a settings hook can decide whether a tool call goes ahead and can change its arguments. A mod can also hold the call while it asks you a question, answer it without running the tool, and run a &lt;code&gt;/command&lt;/code&gt; while Claude is still working. The status line reruns on events such as "A new assistant message arrives," so it can show state but cannot hold, change, or answer a tool call. If your status line and CLAUDE.md show what you need, keep them, and build a mod for the signal they cannot reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creative uses: first mods to try
&lt;/h2&gt;

&lt;p&gt;Anthropic shares its samples "as they are, without support," and MindStudio's &lt;a href="https://www.mindstudio.ai/blog/claude-code-mods-how-to" rel="noopener noreferrer"&gt;mods setup guide&lt;/a&gt; warns that stacking several mods clutters the interface, so build the one that solves a real workflow problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  A context band
&lt;/h3&gt;

&lt;p&gt;One developer's &lt;a href="https://dev.to/pawel_nowak/i-built-my-first-claude-code-mod-without-writing-code-claude-wrote-it-validated-it-and-2mh7"&gt;first mod, written up on dev.to&lt;/a&gt;, began with "I wanted one thing: to see my context window without typing &lt;code&gt;/context&lt;/code&gt;." Anthropic's &lt;code&gt;token-weather&lt;/code&gt; sample "draws a forecast of your context window above the prompt."&lt;/p&gt;

&lt;h3&gt;
  
  
  A guard on risky commands
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;blast-radius&lt;/code&gt; sample "holds a risky shell command, such as &lt;code&gt;rm -rf&lt;/code&gt; or a force push, and shows what it would change, with buttons to proceed or cancel." A &lt;a href="https://www.reddit.com/r/claude/comments/1wwgmcb/what_claude_code_mods_have_you_built_so_far/" rel="noopener noreferrer"&gt;guard mod shared on r/claude&lt;/a&gt; "asks me to confirm before any commit, push or deploy" and "redacts API keys from tool output before the model reads it."&lt;/p&gt;

&lt;h3&gt;
  
  
  A replay of the last turn
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;replay-theater&lt;/code&gt; sample "adds a &lt;code&gt;/replay&lt;/code&gt; command that steps through the file edits Claude made in the last turn," which answers what changed without scrolling.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the difference between a Claude Code mod, a plugin, and a hook?
&lt;/h3&gt;

&lt;p&gt;A mod is a plugin whose &lt;code&gt;hooks/hooks.json&lt;/code&gt; has a &lt;code&gt;modules&lt;/code&gt; key. A hook is a function inside the mod that Claude Code calls on an event. A settings hook is the older kind: a script in a settings file that can block, allow, or log an event, or change a tool call's arguments, but cannot draw in the interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to know how to code to build a Claude Code mod?
&lt;/h3&gt;

&lt;p&gt;No. Describe the mod in a session and "Claude works from a built-in skill named &lt;code&gt;plugin-authoring&lt;/code&gt;," writes it under &lt;code&gt;~/.claude/dev-mods/&lt;/code&gt;, and Claude Code asks whether to enable hot reloading. That mod "loads only in the session that made it," so copy its folder out to keep it. The dev.to author still hit silent failures and a PATH mismatch: "This cost me twenty confused minutes."&lt;/p&gt;

&lt;h3&gt;
  
  
  Are Claude Code mods safe?
&lt;/h3&gt;

&lt;p&gt;"A mod is code that runs with your permissions," and "Mods aren't sandboxed." A mod can "approve a tool call before you're asked," "Read your secrets," and "Spend your usage," but cannot change the permission prompt. Before installing, run &lt;code&gt;claude plugin validate&lt;/code&gt; on its folder: the "&lt;code&gt;hooks:&lt;/code&gt; and &lt;code&gt;calls:&lt;/code&gt; lines" list what it does without running it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I install a Claude Code mod?
&lt;/h3&gt;

&lt;p&gt;Install it like any plugin from a marketplace, for example &lt;code&gt;/plugin install token-chart@your-org&lt;/code&gt;. To turn mods off, disable one in &lt;code&gt;/plugin&lt;/code&gt;, start with &lt;code&gt;--safe-mode&lt;/code&gt; for one session, or set &lt;code&gt;"disableAllHooks": true&lt;/code&gt; to stop every mod you installed in every session. That setting also stops your settings hooks and custom status line; built-in and organization-managed mods keep running.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do mods work in the VS Code extension?
&lt;/h3&gt;

&lt;p&gt;Hooks run there, but what a mod draws does not appear in the extension's chat panel, &lt;code&gt;claude -p&lt;/code&gt;, or cloud sessions. It appears in the terminal, including an editor's integrated terminal and the JetBrains plugin, and in the Desktop app's Code tab, except in WSL sessions and for terminal-only elements. &lt;a href="https://github.com/anthropics/claude-code/issues/99423" rel="noopener noreferrer"&gt;Open issue #99423&lt;/a&gt; (October 4, 2026) reports that in the extension "a mod that loads and hot-reloads correctly draws nothing."&lt;/p&gt;

&lt;h3&gt;
  
  
  Can my organization block mods?
&lt;/h3&gt;

&lt;p&gt;Yes. Administrators can restrict mods through managed settings, including &lt;code&gt;allowManagedModsOnly&lt;/code&gt;. On Team and Enterprise plans and on machines with managed settings, the built-in &lt;code&gt;cc-plugin-sec-default&lt;/code&gt; mod loads ahead of every mod a user installs and "Guards what your organization manages from the mods a user installs."&lt;/p&gt;

&lt;h3&gt;
  
  
  Will the mods API change?
&lt;/h3&gt;

&lt;p&gt;Yes. The Create a mod guide says "The events and methods can change between releases, so trust these files over any page, this one included, when they disagree." Re-validate your mods after you update Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;Pick the one thing you scrolled for in your last long session and ask Claude for a mod that shows it.&lt;/p&gt;

&lt;p&gt;If that thing is whether the agent left the docs behind, you could build a &lt;code&gt;tool.call&lt;/code&gt; hook that notices edits to &lt;code&gt;.md&lt;/code&gt; or &lt;code&gt;.mdx&lt;/code&gt; files and shows "docs touched: 3 files, not reviewed" above the prompt, or a &lt;code&gt;/docs-check&lt;/code&gt; command that runs a docs linter. EkLine does not ship that mod; it is an idea. EkLine's Docs Agent covers the pull-request side: when a pull request opens on GitHub, it decides whether your documentation needs updating and, depending on its confidence, stays silent, posts a suggestion, or triggers an update. It is available on all plans by request; &lt;a href="https://docs.ekline.io/agent/automatic-pr-review/" rel="noopener noreferrer"&gt;read how automatic documentation review on pull requests works&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>tooling</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Gemini 4 Argon: What It Does and Where It Falls Short</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Fri, 02 Oct 2026 20:07:01 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/gemini-4-argon-what-it-does-and-where-it-falls-short-2kf</link>
      <guid>https://dev.to/alisa_hester_1/gemini-4-argon-what-it-does-and-where-it-falls-short-2kf</guid>
      <description>&lt;p&gt;Google announced Gemini 4 Argon on September 30, 2026, with a benchmark table that puts it highest in 13 of 19 rows. If you choose models at a developer-tool or API company, you now have to decide whether that changes this quarter's evaluation plan, budget, or roadmap, working from a launch post, because almost nobody can call the model yet.&lt;/p&gt;

&lt;p&gt;Access is what limits that decision. &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-4-argon/" rel="noopener noreferrer"&gt;Google's announcement&lt;/a&gt; says Argon is "rolling out to a set of trusted cyber defenders through our Fairwind Program." The &lt;a href="https://ai.google.dev/gemini-api/docs/models" rel="noopener noreferrer"&gt;Gemini API models page&lt;/a&gt;, last updated October 1, 2026, lists no Gemini 4 model. There is no API model ID, no date for wider access, and no stated end to the introductory price of $2 per million input tokens and $10 per million output tokens.&lt;/p&gt;

&lt;p&gt;This week, decide which workloads to queue for evaluation once a model ID appears. Going by where Argon leads and trails in the published results, queue long-output generation and repo-scale code migration first, and keep terminal-driven agent loops on the model you use now. We have not run Argon. Every performance figure below is Google's or comes from a named third party, as of October 1, 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gemini 4 Argon is announced but not callable: rollout is limited to Google's Fairwind Program, and no Gemini 4 model appears on the Gemini API models or pricing pages as of October 1, 2026.&lt;/li&gt;
&lt;li&gt;Google's own table has Argon highest in 13 of 19 rows, with clear leads on DeepSWE, long context from 256k to 1M tokens, and multimodal (LVBench). It trails GPT-6 Astra and Claude Opus 5.5 on the terminal-driven agent benchmarks.&lt;/li&gt;
&lt;li&gt;Independent scoring is less flattering. On Artificial Analysis's Intelligence Index, Argon ties GPT-6 Astra at 53 and trails Claude Opus 5.5 and Sonnet 5.5. It has the lowest hallucination rate of any model scoring 45+ there, but lower accuracy than GPT-6 Astra.&lt;/li&gt;
&lt;li&gt;The $2/$10 price is introductory and undated. The regular $4/$20 price matches Claude Opus 5.5, and Argon used about 2.3 times Astra's output tokens per task in Artificial Analysis's runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Google announced
&lt;/h2&gt;

&lt;p&gt;The announcement, &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-4-argon/" rel="noopener noreferrer"&gt;"Gemini 4 Argon: our next era of frontier intelligence"&lt;/a&gt;, signed by "Koray Kavukcuoglu, SVP, Google DeepMind and Chief AI Architect, Google," makes these claims:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An output token limit of "an industry-leading 1M tokens, up from the previous 64K tokens," which Google ties to "longer, more complex use cases."&lt;/li&gt;
&lt;li&gt;Introductory pricing of "$2 per million input tokens and $10 per million output tokens, with cached input tokens priced at 95% off input token price," followed by "$4 per 1M input tokens and $20 per 1M output tokens" once the introductory period expires. Google does not say when that is.&lt;/li&gt;
&lt;li&gt;Internal coding use: "Google engineers have been using Argon for their daily tasks, from everyday debugging to large-scale codebase migrations and algorithm designs."&lt;/li&gt;
&lt;li&gt;Operations work: Argon agents "autonomously identify and apply memory optimizations across Google's data centers, freeing up over 300 TiB of memory once rolled out."&lt;/li&gt;
&lt;li&gt;Security: Argon can "autonomously find, validate, and patch critical software vulnerabilities," with safety resting on "misalignment mitigations that monitor Argon's chain-of-thought and actions and stop execution when necessary."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google's own take on timing is cautious: "We'll continue to gather feedback from early testers as we iterate on guardrails before making Argon available to developers, enterprises, and consumers as soon as possible." For the wider release it names an order, "starting with paid API customers and Google AI Ultra subscribers," but no timeframe for the API, Vertex AI, AI Studio, or the Gemini app.&lt;/p&gt;

&lt;p&gt;The post does not state the context window or the input modalities. Artificial Analysis lists a "Context Window: 1M tokens" in its &lt;a href="https://artificialanalysis.ai/articles/gemini-4-argon-google-top-three-labs" rel="noopener noreferrer"&gt;launch article&lt;/a&gt;. On modalities, that article and its &lt;a href="https://artificialanalysis.ai/models/gemini-4-argon" rel="noopener noreferrer"&gt;model page&lt;/a&gt; disagree, so treat both facts as unconfirmed until Google publishes a model card.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the 1M output limit means, and how it differs from the context window
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faetyannftitw1wht3ert.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faetyannftitw1wht3ert.png" alt="Diagram: the context window holds the prompt, files, and conversation going into the model; the output limit caps the one response coming out. A 64K output limit splits long artifacts across several calls; a 1M limit needs far fewer splits. Illustrative" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The context window caps what goes in; the output limit caps what one response can return.&lt;/p&gt;

&lt;p&gt;The output limit is the less familiar of the two. &lt;a href="https://news.ycombinator.com/item?id=49913571" rel="noopener noreferrer"&gt;One Hacker News reader&lt;/a&gt; wrote on launch day: "I don't understand the point or meaning of an output token limit." The context window is what the model reads in; the output limit caps what it writes back in one response.&lt;/p&gt;

&lt;p&gt;A 64K output cap means a long artifact, such as a multi-file migration diff, a generated SDK, or a long report, has to be split across several calls and stitched back together. A 1M cap should remove much of that splitting for the workloads Google names: "longer, more complex use cases." &lt;a href="https://www.datacamp.com/blog/gemini-4-argon" rel="noopener noreferrer"&gt;DataCamp notes&lt;/a&gt; there are "no published rate limits in the announcement," so how often you could request a response that long is unknown.&lt;/p&gt;

&lt;p&gt;Long outputs cost money. Calculated from Google's list prices, a response using the full 1M output tokens would cost $10 in output at the introductory price and $20 at the regular price. Argon also writes a lot per task: in Artificial Analysis's runs it averaged "62k output tokens per task, compared with 27k for GPT-6 Astra (max)."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Argon leads and trails in Google's table
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://deepmind.google/models/gemini/" rel="noopener noreferrer"&gt;Google DeepMind model page&lt;/a&gt; compares Argon with GPT-6 Astra, Claude Fable 5.1, and Claude Opus 5.5. Argon is highest outright in 13 of 19 rows, tied in one, and behind in five. The rows that matter most for a developer-tool team:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark (Google's table)&lt;/th&gt;
&lt;th&gt;Argon's position&lt;/th&gt;
&lt;th&gt;Gemini 4 Argon&lt;/th&gt;
&lt;th&gt;Compared with&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DeepSWE v1.1&lt;/td&gt;
&lt;td&gt;Leads&lt;/td&gt;
&lt;td&gt;77.9%&lt;/td&gt;
&lt;td&gt;Claude Opus 5.5 74.2%, GPT-6 Astra 74.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GraphWalks 256k to 1M&lt;/td&gt;
&lt;td&gt;Leads&lt;/td&gt;
&lt;td&gt;84.2%&lt;/td&gt;
&lt;td&gt;GPT-6 Astra 71.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harvey's Legal Agent Benchmark&lt;/td&gt;
&lt;td&gt;Leads&lt;/td&gt;
&lt;td&gt;19.6%&lt;/td&gt;
&lt;td&gt;Claude Fable 5.1 6.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutomationBench&lt;/td&gt;
&lt;td&gt;Leads&lt;/td&gt;
&lt;td&gt;51.3%&lt;/td&gt;
&lt;td&gt;Claude Opus 5.5 42.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LVBench&lt;/td&gt;
&lt;td&gt;Leads&lt;/td&gt;
&lt;td&gt;91.7%&lt;/td&gt;
&lt;td&gt;GPT-6 Astra 87.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE-bench v1&lt;/td&gt;
&lt;td&gt;Tied&lt;/td&gt;
&lt;td&gt;68.0%&lt;/td&gt;
&lt;td&gt;GPT-6 Astra 68.0% (tie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FrontierSWE v2&lt;/td&gt;
&lt;td&gt;Trails&lt;/td&gt;
&lt;td&gt;55.0%&lt;/td&gt;
&lt;td&gt;GPT-6 Astra 65.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-bench 4.0&lt;/td&gt;
&lt;td&gt;Trails&lt;/td&gt;
&lt;td&gt;57.4%&lt;/td&gt;
&lt;td&gt;Claude Opus 5.5 66.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostTrainBench&lt;/td&gt;
&lt;td&gt;Trails&lt;/td&gt;
&lt;td&gt;45.3%&lt;/td&gt;
&lt;td&gt;Claude Opus 5.5 49.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Bench Science 0.1&lt;/td&gt;
&lt;td&gt;Trails&lt;/td&gt;
&lt;td&gt;57.6%&lt;/td&gt;
&lt;td&gt;GPT-6 Astra 68.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSWorld-2.0 (Offline subset)&lt;/td&gt;
&lt;td&gt;Trails&lt;/td&gt;
&lt;td&gt;69.2%&lt;/td&gt;
&lt;td&gt;GPT-6 Astra 72.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"Agentic coding" splits in two. Argon leads DeepSWE by about four points and trails FrontierSWE v2 by more than ten. If you run coding agents, look at the benchmark that resembles your loop.&lt;/p&gt;

&lt;p&gt;Two third-party results favor Argon. The &lt;a href="https://www.vals.ai/benchmarks/vals_index" rel="noopener noreferrer"&gt;Vals Index leaderboard&lt;/a&gt;, updated 9/30/2026, ranks Argon first at "68.90%," ahead of Claude Sonnet 5.5 at "67.04%."&lt;/p&gt;

&lt;p&gt;On AA-Omniscience, &lt;a href="https://artificialanalysis.ai/articles/gemini-4-argon-google-top-three-labs" rel="noopener noreferrer"&gt;Artificial Analysis found&lt;/a&gt; that "Gemini 4 Argon has a 15% hallucination rate, the lowest of any model scoring 45+ on the Intelligence Index."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Gemini Argon falls short
&lt;/h2&gt;

&lt;p&gt;Terminal-driven agents are the clearest weak spot. The two sources measuring it disagree on details, so keep their figures apart. In Google's table, Argon scores 57.4% on Terminal-bench 4.0 against 66.4% for Claude Opus 5.5 and 58.2% for GPT-6 Astra.&lt;/p&gt;

&lt;p&gt;In its own runs, &lt;a href="https://artificialanalysis.ai/articles/gemini-4-argon-google-top-three-labs" rel="noopener noreferrer"&gt;Artificial Analysis reports&lt;/a&gt; that "Gemini 4 Argon achieves 57%, ... only behind Claude Sonnet 5.5 (max, 64%), Claude Opus 5.5 (max, 60%) and GPT-6 Astra (59%)." The harnesses and sources differ, so the competitor numbers do not line up, but both sources place Argon behind Opus 5.5.&lt;/p&gt;

&lt;p&gt;On the independent index, Argon is not in front. Artificial Analysis says "Gemini 4 Argon (high) scores 53 on the Artificial Analysis Intelligence Index, matching GPT-6 Astra (max, 53)." &lt;a href="https://the-decoder.com/google-gemini-4-argon-closes-the-gap-with-openai-and-anthropic-but-doesnt-take-a-clear-lead/" rel="noopener noreferrer"&gt;The Decoder&lt;/a&gt; adds: "Anthropic's models still lead. Claude Opus 5.5 sits at 58 points and Claude Sonnet 5.5 at 56." Its headline sums it up: Argon "closes the gap with OpenAI and Anthropic but doesn't take a clear lead."&lt;/p&gt;

&lt;p&gt;A low hallucination rate comes with lower accuracy. On the same AA-Omniscience evaluation, Argon scores 50%, which Artificial Analysis calls "a 5 point decrease from Gemini 3.1 Pro Preview."&lt;/p&gt;

&lt;p&gt;GPT-6 Astra scores 63% on that test. For a product that answers factual questions, Argon's two numbers point in different directions.&lt;/p&gt;

&lt;p&gt;Argon uses more tokens per task. The 62k versus 27k output-token gap means a per-token price comparison overstates the saving. The Decoder concludes: "The price advantage comes from lower token rates, not from efficiency."&lt;/p&gt;

&lt;h2&gt;
  
  
  Whose numbers these are
&lt;/h2&gt;

&lt;p&gt;Read the methodology note in Google's &lt;a href="https://storage.googleapis.com/deepmind-media/gemini/gemini_4_argon_model_evaluation.pdf" rel="noopener noreferrer"&gt;model evaluation PDF&lt;/a&gt;. It says: "All the results for non-Gemini models are sourced from providers' self reported numbers unless otherwise mentioned below." Two of Argon's own coding results are Google's runs: "DeepSWE v1.1 results for Gemini 4 Argon are self computed, using a mini-swe agent harness" and "Terminal-Bench 4.0 results for Gemini 4 Argon are self computed." Argon's scores are "pass @1" at "the highest thinking settings" unless the PDF notes otherwise.&lt;/p&gt;

&lt;p&gt;So the table mixes Google's own runs (of Argon on most rows, and of every model on GraphWalks, PostTrainBench, and LVBench) with providers' self-reported numbers and public leaderboards such as Vals AI, and the real-world vulnerability benchmark uses "an internal dataset." One commenter on the &lt;a href="https://news.ycombinator.com/item?id=49913571" rel="noopener noreferrer"&gt;Hacker News launch thread&lt;/a&gt;, nonethewiser, asked: "How is it even possible for every model to release benchmark results where they are #1 in 75% of categories?" We found no independent hands-on coding reports as of October 1, 2026. With no public access, &lt;a href="https://www.datacamp.com/blog/gemini-4-argon" rel="noopener noreferrer"&gt;DataCamp notes&lt;/a&gt;, "Almost nobody outside the Fairwind cohort has used Argon yet."&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemini 4 Argon vs GPT-6 Astra, Claude Fable, Opus, and the model you use now
&lt;/h2&gt;

&lt;p&gt;The table compares every option on the same criteria, read on October 1, 2026. Prices are list prices per 1M tokens from &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;OpenAI API pricing&lt;/a&gt; (standard tier, short context is "≤272K input tokens") and &lt;a href="https://claude.com/pricing" rel="noopener noreferrer"&gt;Claude pricing&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Public API status, Oct 1, 2026&lt;/th&gt;
&lt;th&gt;List price per 1M input / output tokens&lt;/th&gt;
&lt;th&gt;Google's benchmark table&lt;/th&gt;
&lt;th&gt;Artificial Analysis Intelligence Index&lt;/th&gt;
&lt;th&gt;Vals Index&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 4 Argon&lt;/td&gt;
&lt;td&gt;No API model ID; Fairwind Program only&lt;/td&gt;
&lt;td&gt;$2 / $10 introductory, then $4 / $20&lt;/td&gt;
&lt;td&gt;Highest in 13 of 19 rows, tied in 1&lt;/td&gt;
&lt;td&gt;53 (high)&lt;/td&gt;
&lt;td&gt;68.90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Astra&lt;/td&gt;
&lt;td&gt;Listed on OpenAI API pricing&lt;/td&gt;
&lt;td&gt;$10 / $50 (short context)&lt;/td&gt;
&lt;td&gt;Leads FrontierSWE v2, Terminal-Bench Science 0.1, OSWorld-2.0; ties CWE-bench v1&lt;/td&gt;
&lt;td&gt;53 (max)&lt;/td&gt;
&lt;td&gt;63.13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6.1 Sol&lt;/td&gt;
&lt;td&gt;Listed on OpenAI API pricing&lt;/td&gt;
&lt;td&gt;$2 / $10 (short context)&lt;/td&gt;
&lt;td&gt;Not in Google's table&lt;/td&gt;
&lt;td&gt;52 (max)&lt;/td&gt;
&lt;td&gt;61.15%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Fable 5.1&lt;/td&gt;
&lt;td&gt;Listed on Claude pricing&lt;/td&gt;
&lt;td&gt;$10 / $50&lt;/td&gt;
&lt;td&gt;In the table; leads no row&lt;/td&gt;
&lt;td&gt;Ties Argon and Astra, per The Decoder&lt;/td&gt;
&lt;td&gt;65.83%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 5.5&lt;/td&gt;
&lt;td&gt;Listed on Claude pricing&lt;/td&gt;
&lt;td&gt;$4 / $20&lt;/td&gt;
&lt;td&gt;Leads Terminal-bench 4.0 and PostTrainBench&lt;/td&gt;
&lt;td&gt;58, per The Decoder&lt;/td&gt;
&lt;td&gt;66.97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 5.5&lt;/td&gt;
&lt;td&gt;Listed on Claude pricing&lt;/td&gt;
&lt;td&gt;$2 / $10&lt;/td&gt;
&lt;td&gt;Not in Google's table&lt;/td&gt;
&lt;td&gt;56, per The Decoder&lt;/td&gt;
&lt;td&gt;67.04%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status quo: the model you run today&lt;/td&gt;
&lt;td&gt;In production now&lt;/td&gt;
&lt;td&gt;What you pay today&lt;/td&gt;
&lt;td&gt;Your own results on your own tasks&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Argon leads on Google's scoreboard and tops the Vals Index. On Artificial Analysis's index it ties GPT-6 Astra and Claude Fable 5.1, behind two Anthropic models. At its regular price it costs the same as Claude Opus 5.5, and it is the only option in the table you cannot run today.&lt;/p&gt;

&lt;p&gt;The status quo is an option too. Hacker News commenter deanc: "I can open codex or claude code apps or CLI and get real work done today with the latest models (even on the cheapest plans)." Argon has no public API, so anything you ship this quarter runs on a model you can call today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The case for planning a migration now
&lt;/h2&gt;

&lt;p&gt;The strongest opposing view: Google's table has Argon ahead, the Vals Index puts it ahead of Claude Sonnet 5.5 and Opus 5.5, and at $2/$10, Argon's introductory price is a fifth of GPT-6 Astra's $10/$50 short-context price and Claude Fable 5.1's $10/$50. If that holds the day the API opens, Argon becomes the obvious default, and a team with a migration plan ready saves first.&lt;/p&gt;

&lt;p&gt;Four facts limit that argument:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The lead depends on the scoreboard. It holds in Google's table, which mixes Google's own runs with providers' self-reported numbers and public leaderboards. On Artificial Analysis's index, Argon ties GPT-6 Astra and trails Claude Opus 5.5 and Sonnet 5.5.&lt;/li&gt;
&lt;li&gt;The price is temporary. Google gives no end date for the introductory period, and Vals already lists Argon at "$4 / $20" with a cost of "$15.68" per test. At $4/$20, Argon costs exactly what Claude Opus 5.5 costs.&lt;/li&gt;
&lt;li&gt;The low price is not unique. The introductory $2/$10 matches GPT-6.1 Sol's short-context price and Claude Sonnet 5.5, which you can call today.&lt;/li&gt;
&lt;li&gt;Cost per task depends on token use. Artificial Analysis puts Argon at "$1.99 per Intelligence Index task" while the price is "currently discounted 50%." Argon also writes about 2.3 times as many output tokens per task as Astra.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What survives is a narrower claim: Argon deserves a place in your evaluation queue, budgeted at the regular price. Prepare the tests now; a roadmap rewrite can wait for access and your own results. &lt;a href="https://venturebeat.com/technology/google-unveils-gemini-4-argon-retaking-benchmark-lead-over-openai-and-anthropic-but-in-limited-release" rel="noopener noreferrer"&gt;VentureBeat's Carl Franzen&lt;/a&gt; wrote that "model choice is still workload-dependent, even if Argon now gives Google its strongest claim yet to overall frontier leadership by benchmark count."&lt;/p&gt;

&lt;h2&gt;
  
  
  Which workloads to queue for Argon
&lt;/h2&gt;

&lt;p&gt;Use one rule for every workload: queue it when published results show Argon leading on that kind of task and the result would change what you ship; leave it where it is when they show Argon behind. Budget every test at $4/$20 and compare cost per task.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Published evidence&lt;/th&gt;
&lt;th&gt;What to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Long-output generation: large generated files, long reports, multi-file changes in one response&lt;/td&gt;
&lt;td&gt;1M output token limit, up from 64K (Google)&lt;/td&gt;
&lt;td&gt;Queue first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repo-scale code migration and long-context code work&lt;/td&gt;
&lt;td&gt;DeepSWE v1.1 lead (Google's own run); GraphWalks 256k to 1M lead; Google reports internal use for "large-scale codebase migrations"&lt;/td&gt;
&lt;td&gt;Queue first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Factual answers where a wrong answer is costly&lt;/td&gt;
&lt;td&gt;Lowest hallucination rate of any model scoring 45+ on its index, but 50% accuracy against Astra's 63% (Artificial Analysis)&lt;/td&gt;
&lt;td&gt;Test against your own question set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-driven agent loops&lt;/td&gt;
&lt;td&gt;Trails on Terminal-bench 4.0, FrontierSWE v2, and Terminal-Bench Science 0.1 (Google); behind three models on Terminal Bench 4 (Artificial Analysis)&lt;/td&gt;
&lt;td&gt;Stay on your current model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerability finding and patching&lt;/td&gt;
&lt;td&gt;Google's headline claim, from an internal dataset with no counts or false-positive rates; Fairwind access only&lt;/td&gt;
&lt;td&gt;Watch; you cannot test it outside the program&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This matches &lt;a href="https://www.datacamp.com/blog/gemini-4-argon" rel="noopener noreferrer"&gt;DataCamp's Argon guide&lt;/a&gt;: "When it opens up to regular users, I would reach for Argon on long-context document and repository work and stay with Claude Opus 5.5 or GPT-6 Astra for terminal-driven agent loops." The guide describes reactions so far as "first impressions of the announcement, not hands-on tests."&lt;/p&gt;

&lt;p&gt;By situation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your product generates long artifacts, such as SDKs or migration tooling, build your Argon evaluation set now.&lt;/li&gt;
&lt;li&gt;If your core loop is a coding agent driving a terminal, keep it on whatever wins your own tests today, and recheck when independent hands-on reports appear.&lt;/li&gt;
&lt;li&gt;If cost is your reason to look, compare Argon with Claude Opus 5.5 at the same $4/$20, counting output tokens.&lt;/li&gt;
&lt;li&gt;If you defend software and are in the Fairwind Program, you are among the few who can test Google's security claims now.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to evaluate Argon once access opens
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Freeze a task set from your own backlog for the queued workloads, with the expected result for each task.&lt;/li&gt;
&lt;li&gt;Run Argon through the harness you use for your current model, and record the thinking level. Google's DeepSWE result came from "a mini-swe agent harness," and Argon's scores use "the highest thinking settings" unless the PDF notes otherwise, so your numbers may differ.&lt;/li&gt;
&lt;li&gt;Log output tokens and cost per task at the regular $4/$20 price, next to the same figures for your current model.&lt;/li&gt;
&lt;li&gt;Count wrong answers separately from refusals or abstentions, because Artificial Analysis's results separate hallucination rate from accuracy.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Argon means for developer-tool companies
&lt;/h2&gt;

&lt;p&gt;For a developer-tool company, Argon is a model you might build with, and also one more agent that reads your API and developer docs. When Argon reaches developers, coding agents built on it can read the same pages your users read and repeat whatever is out of date in them.&lt;/p&gt;

&lt;p&gt;EkLine works on that side of the problem. It "keeps product, API, and developer docs accurate enough for AI engines, search systems, and agents to find, trust, and cite," as &lt;a href="https://ekline.io/blog/ekline-ai-visibility-geo" rel="noopener noreferrer"&gt;EkLine's post on AI visibility&lt;/a&gt; puts it. EkLine Journeys (in beta), described on &lt;a href="https://ekline.io/solutions/geo" rel="noopener noreferrer"&gt;EkLine's AI visibility page&lt;/a&gt;, run the questions people ask through Perplexity, ChatGPT, Gemini, and Claude, and let Claude Code or Codex try your product in a sandbox. You see what each assistant or coding agent says about your product and which pages it cited, so you know which pages to fix.&lt;/p&gt;

&lt;p&gt;EkLine is not built to choose or benchmark models, and we have not tested Argon. The page names Gemini, not Argon specifically. EkLine cannot make an assistant cite your page; it shows you what the assistants say and keeps the pages they read accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why is Gemini 4 Argon being released to cybersecurity teams first?
&lt;/h3&gt;

&lt;p&gt;Google says Argon is "rolling out to a set of trusted cyber defenders through our Fairwind Program" while it iterates on guardrails. Security is also Google's headline claim: it says Argon can "autonomously find, validate, and patch critical software vulnerabilities." Google adds that it is "actively engaged in the U.S. government's voluntary process for pre-release model access while we gradually expand access."&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I get access to Gemini 4 Argon?
&lt;/h3&gt;

&lt;p&gt;As of October 1, 2026, the announcement gives no sign-up or waitlist link outside the Fairwind Program. DataCamp reports that "There is no free tier, no waitlist link, and no published rate limits in the announcement." Google says the wider rollout will start with paid API customers and Google AI Ultra subscribers, without a date. Watch the Gemini API models page for a Gemini 4 model ID.&lt;/p&gt;

&lt;h3&gt;
  
  
  Did Google catch up after being behind for months?
&lt;/h3&gt;

&lt;p&gt;Partly. Artificial Analysis titled its review "Google is back as one of the top three labs in intelligence achieved" and scores Argon 53, matching GPT-6 Astra, while The Decoder notes that Claude Opus 5.5 and Sonnet 5.5 still score higher. Google's own table, which combines Google's runs with providers' and leaderboards' numbers, shows a lead in 13 of 19 rows.&lt;/p&gt;




&lt;p&gt;To check what AI assistants and coding agents read and repeat from your developer docs, &lt;a href="https://ekline.io/solutions/geo" rel="noopener noreferrer"&gt;see how EkLine shows what AI assistants say about your product&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>gemini</category>
      <category>ai</category>
      <category>llm</category>
      <category>analysis</category>
    </item>
    <item>
      <title>What Is WebMCP? When to Expose Browser Tools to AI Agents</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Fri, 02 Oct 2026 14:58:01 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/what-is-webmcp-when-to-expose-browser-tools-to-ai-agents-1kd1</link>
      <guid>https://dev.to/alisa_hester_1/what-is-webmcp-when-to-expose-browser-tools-to-ai-agents-1kd1</guid>
      <description>&lt;p&gt;WebMCP lets a web app declare structured tools that a browser agent can call. As the &lt;a href="https://github.com/webmachinelearning/webmcp" rel="noopener noreferrer"&gt;WebMCP specification&lt;/a&gt; defines it, each tool runs inside the page with access to the user's authenticated session and current application state.&lt;/p&gt;

&lt;p&gt;That context supports actions tied to what the user already has open, such as updating the current cart, saving a draft on the active support ticket, or creating an issue in the selected workspace.&lt;/p&gt;

&lt;p&gt;On September 28, 2026, Shopify added checkout WebMCP tools that can read checkout state; update buyer details, fulfillment, discount codes, declared fields, and payment; and place an order after buyer confirmation. Shopify's &lt;a href="https://shopify.dev/changelog/posts/webmcp-support-for-checkout" rel="noopener noreferrer"&gt;checkout WebMCP changelog&lt;/a&gt; notes that its storefront and cart tools were already available.&lt;/p&gt;

&lt;p&gt;Cloudflare's &lt;a href="https://developers.cloudflare.com/changelog/post/2026-09-28-webmcp-api" rel="noopener noreferrer"&gt;WebMCP beta changelog&lt;/a&gt; says Browser Run extended support to Kitesurf that day and migrated Chrome Lab sessions from the earlier testing API to &lt;code&gt;document.modelContext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;WebMCP is still experimental. Its specification is a Draft Community Group Report. The project's &lt;a href="https://github.com/webmachinelearning/webmcp/blob/main/implementation-status.md" rel="noopener noreferrer"&gt;implementation-status page&lt;/a&gt; lists origin trials in Chrome 149 and Edge 150, experimental Leo support in Brave, and ChatGPT Desktop support. It does not list Firefox or Safari implementations, so broad browser interoperability is not available.&lt;/p&gt;

&lt;p&gt;Use WebMCP for actions tied to the current browser session, an MCP server for capabilities that must run without the page, and browser automation when a site exposes no adequate structured agent interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://github.com/webmachinelearning/webmcp" rel="noopener noreferrer"&gt;WebMCP specification&lt;/a&gt; lets a page expose named, schema-defined tools to AI agents through the browser.&lt;/li&gt;
&lt;li&gt;It is a good fit for session-aware actions such as searching a catalog, updating a cart, saving a draft, or changing the object open in the current tab.&lt;/li&gt;
&lt;li&gt;It is a poor fit for unattended jobs, cross-service orchestration, or integrations that must work after the website closes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.chrome.com/docs/ai/webmcp/declarative-api" rel="noopener noreferrer"&gt;Declarative WebMCP&lt;/a&gt; turns HTML forms into tools. &lt;a href="https://developer.chrome.com/docs/ai/webmcp/imperative-api" rel="noopener noreferrer"&gt;Imperative WebMCP&lt;/a&gt; registers JavaScript tools through &lt;code&gt;document.modelContext&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Treat it as progressive enhancement. The &lt;a href="https://github.com/webmachinelearning/webmcp/blob/main/implementation-status.md" rel="noopener noreferrer"&gt;implementation-status page&lt;/a&gt; shows why the existing interface or API path must remain available while browser support is experimental.&lt;/li&gt;
&lt;li&gt;Start with one read-only or reversible workflow. Do not make payment, deletion, publishing, or permission changes your first test.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is WebMCP?
&lt;/h2&gt;

&lt;p&gt;WebMCP is a browser API for exposing web application actions as structured tools. Each tool defines an action, its accepted inputs, its execution path, and what value, if any, execution returns. Imperative tools can also supply optional risk or debugging hints.&lt;/p&gt;

&lt;p&gt;The proposal has two authoring models: &lt;a href="https://developer.chrome.com/docs/ai/webmcp/declarative-api" rel="noopener noreferrer"&gt;declarative metadata&lt;/a&gt; on HTML forms and &lt;a href="https://developer.chrome.com/docs/ai/webmcp/imperative-api" rel="noopener noreferrer"&gt;imperative registration&lt;/a&gt; through &lt;code&gt;document.modelContext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This contract lets an agent call an action directly rather than infer it from the DOM, accessibility tree, screenshots, labels, or layout. &lt;a href="https://developer.chrome.com/docs/ai/webmcp" rel="noopener noreferrer"&gt;Chrome's WebMCP guide&lt;/a&gt; describes the structured path as more reliable and token-efficient than element-by-element navigation.&lt;/p&gt;

&lt;p&gt;The website remains the application surface. It keeps the state and business logic, while the browser exposes only the tools the page registers.&lt;/p&gt;

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

&lt;p&gt;A typical flow has five steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user opens and signs in to a web application.&lt;/li&gt;
&lt;li&gt;The page declares or registers tools relevant to its current state.&lt;/li&gt;
&lt;li&gt;A browser agent discovers the available tools.&lt;/li&gt;
&lt;li&gt;The agent selects a tool and supplies arguments that match its schema.&lt;/li&gt;
&lt;li&gt;The page executes the action. An imperative callback's serializable return value is passed to the caller; an invocation that navigates the page can resolve to &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://developer.chrome.com/docs/ai/webmcp" rel="noopener noreferrer"&gt;WebMCP tools run in the page context&lt;/a&gt;, so they can use the session, account, cart, draft, route, or other frontend state already open.&lt;/p&gt;

&lt;h3&gt;
  
  
  Declarative WebMCP
&lt;/h3&gt;

&lt;p&gt;Use the &lt;a href="https://developer.chrome.com/docs/ai/webmcp/declarative-api" rel="noopener noreferrer"&gt;declarative API&lt;/a&gt; when the action is already represented by an HTML form. Add a tool name and description to the form, then describe the parameters on the relevant controls.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;form action: /catalog/search
method: GET
tool name: search_catalog
tool description: Search products by query and maximum price.
auto-submit: enabled

query input
 type: search
 required: yes
 parameter description: Product name or feature to search for.

maximum price input
 type: number
 minimum: 0
 parameter description: Highest acceptable price in US dollars.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The declarative API's &lt;a href="https://developer.chrome.com/docs/ai/webmcp/declarative-api" rel="noopener noreferrer"&gt;&lt;code&gt;toolautosubmit&lt;/code&gt; attribute&lt;/a&gt; lets the agent submit the form directly, which suits read-only searches. For payments, deletions, publishing, or permission changes, follow &lt;a href="https://developer.chrome.com/docs/ai/webmcp/secure-tools" rel="noopener noreferrer"&gt;Chrome's security guidance&lt;/a&gt; and leave it off so users keep the existing review step.&lt;/p&gt;

&lt;p&gt;Declarative tools let people and agents use the same form, validation, and submission path. The team maintains one workflow for both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Imperative WebMCP
&lt;/h3&gt;

&lt;p&gt;Use the &lt;a href="https://developer.chrome.com/docs/ai/webmcp/imperative-api" rel="noopener noreferrer"&gt;imperative API&lt;/a&gt; when the action depends on dynamic application logic or cannot be represented cleanly as a form.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;registerSupportDraftTool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;if &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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modelContext&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&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;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

 &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;save_support_draft&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Save a draft reply for the support ticket open in the app.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;ticketId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The ID of the open support ticket.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The reply text to save as a draft.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ticketId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;body&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;readOnlyHint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;ticketId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&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;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveDraft&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;ticketId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&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="na"&gt;draftId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;saved&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;reviewRequired&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;
 &lt;span class="p"&gt;});&lt;/span&gt;

 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;controller&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;The &lt;a href="https://developer.chrome.com/docs/ai/webmcp/imperative-api" rel="noopener noreferrer"&gt;imperative API supports unregistration&lt;/a&gt; through an &lt;code&gt;AbortSignal&lt;/code&gt;. In a single-page application, abort the existing registration and register a replacement when the route, selected object, or available action changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supportDraftRegistration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;registerSupportDraftTool&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// When the route, permissions, or state changes:&lt;/span&gt;
&lt;span class="nx"&gt;supportDraftRegistration&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  WebMCP vs browser automation vs a backend MCP server
&lt;/h2&gt;

&lt;p&gt;Choose the interface based on where the required state lives and how long the task must run. These layers can also be combined. &lt;a href="https://developers.cloudflare.com/changelog/post/2026-09-28-webmcp-api" rel="noopener noreferrer"&gt;Cloudflare's WebMCP beta&lt;/a&gt; shows how a browser-automation client can invoke WebMCP tools when a site exposes them and fall back to DOM, accessibility-tree, or visual interaction when it does not.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Best fit&lt;/th&gt;
&lt;th&gt;Main advantage&lt;/th&gt;
&lt;th&gt;Main tradeoff&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WebMCP&lt;/td&gt;
&lt;td&gt;Actions inside the current authenticated page&lt;/td&gt;
&lt;td&gt;Reuses live browser state and lets the site define a stable tool contract&lt;/td&gt;
&lt;td&gt;Experimental browser support and page-bound availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOM or visual browser automation&lt;/td&gt;
&lt;td&gt;Sites or workflows without an adequate structured tool interface&lt;/td&gt;
&lt;td&gt;Works without cooperation from the product team&lt;/td&gt;
&lt;td&gt;Depends on selectors, layout, visual interpretation, or other interface details that can change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server, usually remote for service-level integrations&lt;/td&gt;
&lt;td&gt;Remote tools, background work, cross-client access, and service-level integrations&lt;/td&gt;
&lt;td&gt;Runs independently of the page and fits MCP's client-server model&lt;/td&gt;
&lt;td&gt;Requires a separate integration and may need explicit session or object context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/docs/learn/architecture" rel="noopener noreferrer"&gt;MCP uses a host-client-server architecture&lt;/a&gt;. An MCP server can run locally or remotely and expose tools and other capabilities to a host through an MCP client. By contrast, &lt;a href="https://developer.chrome.com/docs/ai/webmcp/compare-mcp" rel="noopener noreferrer"&gt;WebMCP's page-level path&lt;/a&gt; does not require an MCP server, although a page tool may still call backend services.&lt;/p&gt;

&lt;p&gt;Browser automation covers sites with no WebMCP or API integration, including exploratory work and compatibility testing. Selectors, layouts, and visual cues can change, which makes the automation fragile. &lt;a href="https://developer.chrome.com/docs/ai/webmcp/compare-mcp" rel="noopener noreferrer"&gt;Chrome's comparison&lt;/a&gt; explains how WebMCP replaces that inference step with a contract defined by the product team.&lt;/p&gt;

&lt;p&gt;Apply the same rule to implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use WebMCP when the task depends on state in the current tab.&lt;/li&gt;
&lt;li&gt;Use an MCP server when the state lives in a service or the task must work across clients.&lt;/li&gt;
&lt;li&gt;Use browser automation when neither structured option exists, and budget for maintenance as the interface changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Five signs that WebMCP fits your product
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The current browser session matters
&lt;/h3&gt;

&lt;p&gt;WebMCP is useful when the user has already selected the relevant account, workspace, cart, ticket, document, or draft. The agent can act inside that context instead of reconstructing it through a second authentication and selection flow.&lt;/p&gt;

&lt;p&gt;Shopify's &lt;a href="https://shopify.dev/docs/agents/carts-and-checkout/checkout-webmcp" rel="noopener noreferrer"&gt;checkout WebMCP implementation&lt;/a&gt; shows the pattern. Its tools operate on the active checkout and cover reading state, updating checkout fields such as contact details, fulfillment, discounts, and payment, and placing the order after buyer confirmation. Cart-item changes remain the job of storefront or cart tools, or the checkout interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The action already exists in the interface
&lt;/h3&gt;

&lt;p&gt;A WebMCP tool should map to an existing interface action, such as searching the catalog, adding an item, saving a draft, creating an issue, or applying a filter. That shared path preserves a visible fallback and reuses the product's validation and business rules. Actions with no clear interface meaning usually need a narrower contract before agent use.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The user should remain close to the action
&lt;/h3&gt;

&lt;p&gt;WebMCP suits workflows where users need to inspect state before or after execution, especially payments, publishing, privacy, and access changes.&lt;/p&gt;

&lt;p&gt;Shopify's &lt;a href="https://shopify.dev/changelog/posts/webmcp-support-for-checkout" rel="noopener noreferrer"&gt;checkout tools require confirmation&lt;/a&gt; before completion. Apply the same boundary to consequential actions: let the agent prepare the change, while application policy and user approval govern execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The task has bounded inputs and a clear result
&lt;/h3&gt;

&lt;p&gt;Tools work best when their names, descriptions, schemas, and return values remove ambiguity. &lt;code&gt;search_catalog&lt;/code&gt; is better than &lt;code&gt;interact_with_store&lt;/code&gt;. &lt;code&gt;save_support_draft&lt;/code&gt; is better than &lt;code&gt;handle_ticket&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.chrome.com/docs/ai/webmcp/best-practices" rel="noopener noreferrer"&gt;Chrome's WebMCP best practices&lt;/a&gt; recommend concise descriptions, focused tools, and dynamic registration based on the current application state. If you need a long prompt to explain what a tool might do, the action is probably too broad.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The agent can call product logic directly
&lt;/h3&gt;

&lt;p&gt;A WebMCP tool can call the same application function as a button or form. The contract can stay stable as the control's placement or label changes. Keep interface tests for the human path.&lt;/p&gt;

&lt;h2&gt;
  
  
  When WebMCP is the wrong interface
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The capability must outlive the page
&lt;/h3&gt;

&lt;p&gt;Scheduled jobs, long-running processing, webhooks, background orchestration, and tools used from multiple clients belong at the service layer. Use an API or MCP server when the task must run after the page closes or from an IDE, desktop assistant, command line, support platform, or automated workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  The workflow crosses several products
&lt;/h3&gt;

&lt;p&gt;Keep cross-service orchestration outside the page. It needs explicit authentication, retries, observability, and ownership at the service layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  The action cannot be made safe enough for agent use
&lt;/h3&gt;

&lt;p&gt;Do not expose a destructive or irreversible operation because it is technically possible. Some actions need a review screen, a confirmation token, a second factor, a transaction limit, or no agent path at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Browser coverage would block the core workflow
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/webmachinelearning/webmcp/blob/main/implementation-status.md" rel="noopener noreferrer"&gt;WebMCP implementation-status page&lt;/a&gt; still shows limited browser interoperability. Keep the existing interface and API path available so the workflow works outside supported browsers.&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%2F4ocxes4k85if3ld8tyjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ocxes4k85if3ld8tyjs.png" alt="WebMCP control path from a browser agent and page tool to application authorization and human confirmation when risk requires it." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;WebMCP makes invocation explicit. The application still owns policy, permissions, and confirmation.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enforce security in application code
&lt;/h2&gt;

&lt;p&gt;WebMCP makes tool invocation explicit. Product controls still determine whether an action is authorized and safe.&lt;/p&gt;

&lt;p&gt;For imperative tools, &lt;a href="https://developer.chrome.com/docs/ai/webmcp/secure-tools" rel="noopener noreferrer"&gt;Chrome's security guidance&lt;/a&gt; covers prompt injection, untrusted tool output, origin boundaries, and confirmation for consequential actions. Optional annotations such as &lt;code&gt;readOnlyHint&lt;/code&gt;, &lt;code&gt;untrustedContentHint&lt;/code&gt;, and &lt;code&gt;consequentialHint&lt;/code&gt; give the agent risk signals; application code enforces the policy.&lt;/p&gt;

&lt;p&gt;A practical security baseline includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Validate every argument on the server, even if the page already validated it.&lt;/li&gt;
&lt;li&gt;Authorize the requested action against the current user and object.&lt;/li&gt;
&lt;li&gt;Require explicit confirmation for payment, deletion, publication, permission, and identity changes.&lt;/li&gt;
&lt;li&gt;Return the minimum data the agent needs.&lt;/li&gt;
&lt;li&gt;Treat page content and tool results as untrusted input to the model.&lt;/li&gt;
&lt;li&gt;Log the tool name, actor, result, confirmation path, and only the argument data permitted by the product's privacy policy.&lt;/li&gt;
&lt;li&gt;Rate-limit actions independently of the chat interface.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;code&gt;tools&lt;/code&gt; Permissions Policy defaults to &lt;code&gt;self&lt;/code&gt;. An embedding page can delegate it to a cross-origin iframe through the iframe's &lt;code&gt;allow="tools"&lt;/code&gt; attribute. For cross-origin in-page agents, the registering document must also include the caller's secure origin in &lt;code&gt;registerTool(..., { exposedTo: [...] })&lt;/code&gt;, and the caller must request the tool owner's origin through &lt;code&gt;getTools({ fromOrigins: [...] })&lt;/code&gt;. &lt;a href="https://developer.chrome.com/docs/ai/webmcp/secure-tools" rel="noopener noreferrer"&gt;Chrome's security guidance&lt;/a&gt; makes clear that these browser boundaries do not replace application authorization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.cloudflare.com/browser-run/features/webmcp" rel="noopener noreferrer"&gt;Cloudflare's Browser Run documentation&lt;/a&gt; notes an important beta limitation: Kitesurf does not yet implement the &lt;code&gt;tools&lt;/code&gt; Permissions Policy or origin-based tool filtering, and tools registered in iframes or popup windows are not exposed through its CDP integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the tool surface smaller than the interface
&lt;/h2&gt;

&lt;p&gt;Large web applications may have hundreds of actions. Exposing them all can make selection harder and consume more agent context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.chrome.com/docs/lighthouse/agentic-browsing/registered-webmcp-tools" rel="noopener noreferrer"&gt;Chrome's Lighthouse audit&lt;/a&gt; flags pages with more than 40 declared tools. Treat 40 as an audit trigger. Most routes should expose far fewer.&lt;/p&gt;

&lt;p&gt;Register tools dynamically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A project list can expose &lt;code&gt;search_projects&lt;/code&gt; and &lt;code&gt;create_project&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A project detail route can expose &lt;code&gt;rename_project&lt;/code&gt;, &lt;code&gt;add_member&lt;/code&gt;, and &lt;code&gt;archive_project&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A support ticket can expose &lt;code&gt;summarize_ticket&lt;/code&gt;, &lt;code&gt;save_reply_draft&lt;/code&gt;, and &lt;code&gt;change_status&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://developer.chrome.com/docs/ai/webmcp/best-practices" rel="noopener noreferrer"&gt;Chrome's best practices&lt;/a&gt; recommend unregistering tools when the user leaves the route or loses access so the agent sees only actions relevant to the current route and permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  A seven-step WebMCP pilot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pick one reversible outcome
&lt;/h3&gt;

&lt;p&gt;Start with search, filtering, drafting, or saving a non-public change. Avoid purchases, deletion, publication, and permission changes in the first pilot.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Write the contract before the code
&lt;/h3&gt;

&lt;p&gt;Define the tool name, one-sentence description, input schema, success result, error cases, permission checks, and confirmation rule.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Reuse the existing product action
&lt;/h3&gt;

&lt;p&gt;Call the same domain function used by the form or button, keeping one implementation for human and agent paths.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Preserve the human path
&lt;/h3&gt;

&lt;p&gt;WebMCP requires a secure, origin-isolated document. &lt;a href="https://developer.chrome.com/docs/ai/webmcp" rel="noopener noreferrer"&gt;Chrome documents&lt;/a&gt; that pages using &lt;code&gt;document.domain&lt;/code&gt;, including pages configured with &lt;code&gt;Origin-Agent-Cluster: ?0&lt;/code&gt;, cannot use the API.&lt;/p&gt;

&lt;p&gt;Keep the form or controls functional when &lt;code&gt;document.modelContext&lt;/code&gt; is unavailable. The &lt;a href="https://github.com/webmachinelearning/webmcp/blob/main/implementation-status.md" rel="noopener noreferrer"&gt;current implementation status&lt;/a&gt; is a strong reason to detect support at runtime and add WebMCP as progressive enhancement.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Add risk controls
&lt;/h3&gt;

&lt;p&gt;Set the relevant annotations, then follow &lt;a href="https://developer.chrome.com/docs/ai/webmcp/secure-tools" rel="noopener noreferrer"&gt;Chrome's security guidance&lt;/a&gt; by enforcing authorization, validation, confirmation, and rate limits in application code.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Test the tool and the fallback
&lt;/h3&gt;

&lt;p&gt;Run direct tool calls with valid, invalid, stale, unauthorized, and adversarial inputs. Test the normal interface without WebMCP. Chrome also provides &lt;a href="https://developer.chrome.com/docs/lighthouse/agentic-browsing/registered-webmcp-tools" rel="noopener noreferrer"&gt;Lighthouse checks&lt;/a&gt; for common tool-definition problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Measure task success
&lt;/h3&gt;

&lt;p&gt;Track tool choice, argument validity, task completion, human correction, and fallback to browser navigation. Use completion and correction rates as the decision metrics; tool-call volume measures activity rather than success.&lt;/p&gt;

&lt;p&gt;For a fuller measurement model, see &lt;a href="https://ekline.io/blog/measure-ai-agent-documentation-usage" rel="noopener noreferrer"&gt;How to Measure Whether AI Coding Agents Use Your Developer Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose by state, lifetime, and fallback
&lt;/h2&gt;

&lt;p&gt;Start by identifying the product action, the state it needs, and how long it must remain available. Use WebMCP when the action depends on the current tab. Use an API or MCP server when it must outlive the tab, run in the background, or serve many clients.&lt;/p&gt;

&lt;p&gt;Pilot one reversible action on one route, define its success condition, and verify that the existing interface still works when WebMCP is unavailable.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>agents</category>
      <category>webdev</category>
      <category>browser</category>
    </item>
    <item>
      <title>When to Hire a Technical Writer, When to Automate, and How They Work Together</title>
      <dc:creator>Alisa Hester</dc:creator>
      <pubDate>Fri, 02 Oct 2026 14:22:03 +0000</pubDate>
      <link>https://dev.to/alisa_hester_1/when-to-hire-a-technical-writer-when-to-automate-and-how-they-work-together-45hb</link>
      <guid>https://dev.to/alisa_hester_1/when-to-hire-a-technical-writer-when-to-automate-and-how-they-work-together-45hb</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Hire a technical writer when nobody owns the documentation program or when the work requires audience judgment, information architecture, stakeholder alignment, and editorial accountability.&lt;/li&gt;
&lt;li&gt;Automate when a writer or another docs owner is buried in change detection, context gathering, routine drafting, repetitive checks, and follow-up.&lt;/li&gt;
&lt;li&gt;If the company lacks ownership and the current workflow cannot keep pace, solve both problems together: give a technical writer clear authority and add an agent around the repeatable steps.&lt;/li&gt;
&lt;li&gt;Socure used this model across 25+ products. Peter Schwarck reviewed and published the updates while EkLine prepared source-grounded drafts, giving him more time for information architecture and larger documentation improvements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Socure paired a technical writer with automation
&lt;/h2&gt;

&lt;p&gt;Socure had one technical writer supporting more than 25 products across two platforms. Documentation requests reached him through chat messages, tickets, and a release tracker. Identifying affected documentation consumed time before he could assess the change, resolve open questions, and shape the update.&lt;/p&gt;

&lt;p&gt;Socure already had a technical writer with clear ownership. Its bottleneck was detecting affected documentation and preparing updates across a large product surface, so the company added EkLine around Peter Schwarck's workflow. EkLine surfaced likely documentation work and prepared source-grounded drafts. Peter decided what needed to change and approved publication.&lt;/p&gt;

&lt;p&gt;Peter also gained time for information architecture and larger documentation improvements that had been waiting for attention.&lt;/p&gt;

&lt;p&gt;In seven weeks, Socure reported 348 merged documentation updates, the estimated equivalent of more than 1,000 hours of documentation work, with no added headcount. This establishes Socure's result only; staffing requirements vary by company. It shows how a writer-led workflow can increase coverage when automation handles defined preparation steps.&lt;/p&gt;

&lt;p&gt;Read the full &lt;a href="https://ekline.io/case-study/how-socure-built-developer-experience-into-a-moat-with-ekline" rel="noopener noreferrer"&gt;Socure case study&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagnose the documentation work before setting headcount
&lt;/h2&gt;

&lt;p&gt;A request for a technical writer often bundles several different problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nobody is accountable for the documentation.&lt;/li&gt;
&lt;li&gt;The product changes faster than the current owner can track.&lt;/li&gt;
&lt;li&gt;Engineers know the product but cannot keep writing every guide.&lt;/li&gt;
&lt;li&gt;Existing docs lack structure, consistency, or a clear audience.&lt;/li&gt;
&lt;li&gt;Support answers useful questions that never become public documentation.&lt;/li&gt;
&lt;li&gt;Routine maintenance consumes the time needed for strategic work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different items require different responses. Missing ownership calls for a hire or an explicit assignment. Repeatable workflow gaps call for automation around that owner.&lt;/p&gt;

&lt;p&gt;Before opening a requisition, list the documentation work from the last month. For each item, mark where audience judgment, source validation, structure, or approval was required, then mark which steps followed a repeatable pattern. Most documentation work contains both. This map will show whether the immediate gap is ownership, capacity, or both.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type of work&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Best owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Judgment&lt;/td&gt;
&lt;td&gt;deciding what the audience needs, resolving conflicting sources, choosing the right explanation&lt;/td&gt;
&lt;td&gt;technical writer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Program ownership&lt;/td&gt;
&lt;td&gt;information architecture, editorial standards, roadmap, stakeholder alignment&lt;/td&gt;
&lt;td&gt;technical writer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subject-matter validation&lt;/td&gt;
&lt;td&gt;confirming API behavior, security details, and product intent&lt;/td&gt;
&lt;td&gt;engineer or product owner, coordinated by the writer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detection&lt;/td&gt;
&lt;td&gt;finding which pages are affected by a code change, release, or recurring support question&lt;/td&gt;
&lt;td&gt;automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preparation&lt;/td&gt;
&lt;td&gt;gathering source context and drafting a routine update&lt;/td&gt;
&lt;td&gt;automation, reviewed by the writer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeatable review&lt;/td&gt;
&lt;td&gt;checking terminology, style rules, links, structure, and required sections&lt;/td&gt;
&lt;td&gt;automation, governed by the writer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If no one owns the documentation program, hire or assign that owner first. If an owner exists but cannot keep pace with product change, add automation around their workflow. Teams facing both problems should do both.&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%2Fpa483pqv0zskw3wqz3lb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpa483pqv0zskw3wqz3lb.png" alt="Workflow showing product and customer signals moving through automated detection, source gathering, drafting, and checks before a technical writer decides, edits, verifies, and approves the documentation" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The agent prepares the work. The technical writer owns the decision and approval.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When to hire a technical writer
&lt;/h2&gt;

&lt;p&gt;Open the requisition when the missing capability is human judgment or clear ownership.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nobody owns the user's learning experience
&lt;/h3&gt;

&lt;p&gt;Documentation is a product surface. Someone has to understand what a developer is trying to accomplish, where the current explanation fails, and how the pieces should fit together. A queue of generated pages does not provide that ownership.&lt;/p&gt;

&lt;p&gt;A technical writer can turn scattered requests into a coherent program. They define the audience, establish the structure, set standards, and decide what deserves attention first.&lt;/p&gt;

&lt;h3&gt;
  
  
  The documentation needs information architecture
&lt;/h3&gt;

&lt;p&gt;A growing product accumulates pages, examples, release notes, and troubleshooting articles. The hard work is deciding how users should move through them.&lt;/p&gt;

&lt;p&gt;Automation can identify duplicated or disconnected content. A writer decides whether to merge pages, split a long guide, change the navigation, introduce a new concept, or remove material that no longer helps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Product teams disagree about the correct explanation
&lt;/h3&gt;

&lt;p&gt;Code, tickets, internal discussions, and support answers do not always agree. Someone must resolve the conflict and produce an explanation the company is willing to stand behind.&lt;/p&gt;

&lt;p&gt;This is editorial and organizational work. It often requires interviewing engineers, product managers, support, security, and customers. Hire for it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The company needs an accountable editorial standard
&lt;/h3&gt;

&lt;p&gt;Terminology, tone, examples, accessibility, and risk boundaries need an owner. Automation can apply rules after the rules exist. A writer creates those rules, updates them when the product changes, and knows when an exception is justified.&lt;/p&gt;

&lt;h3&gt;
  
  
  High-risk content requires careful judgment
&lt;/h3&gt;

&lt;p&gt;Authentication, billing, permissions, migrations, security, and breaking API changes deserve a named owner. An agent can gather evidence and prepare a draft. A writer should coordinate the review and make sure the final guidance is clear, complete, and approved.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to automate documentation work
&lt;/h2&gt;

&lt;p&gt;Automation makes sense when the company already has a qualified documentation owner, but repeatable workflow steps with stable inputs and review rules consume too much of that person's time.&lt;/p&gt;

&lt;h3&gt;
  
  
  The writer has to chase every product change
&lt;/h3&gt;

&lt;p&gt;A writer cannot attend every engineering discussion or inspect every merged pull request. When the documentation process depends on someone remembering to file a ticket, important changes will arrive late or remain invisible.&lt;/p&gt;

&lt;p&gt;Automation can monitor defined product signals, identify likely documentation impact, and bring the change to the writer. The writer then decides whether an update is needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Routine updates begin with the same research every time
&lt;/h3&gt;

&lt;p&gt;Many documentation tasks start with gathering a code diff, release context, an existing page, a support conversation, and the current style rules. An agent can assemble that context and prepare a reviewable first draft.&lt;/p&gt;

&lt;p&gt;The writer starts with relevant sources and a draft to assess, then decides whether the update is useful, accurate, and ready for broader review.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reviewers repeat the same checks
&lt;/h3&gt;

&lt;p&gt;Style, terminology, links, headings, required sections, and structural rules can be checked consistently before a human review. The writer should define the rules and own exceptions. The agent should run the routine inspection every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation requests arrive faster than they can be triaged
&lt;/h3&gt;

&lt;p&gt;A crowded queue hides the difference between a small factual correction and a new guide that needs research. Automation can classify and route the work so the writer spends attention according to risk and user impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  The docs owner has no time for strategic improvements
&lt;/h3&gt;

&lt;p&gt;When maintenance and change-chasing fill the week, the writer has less time for onboarding research, information architecture, and other program-level improvements. Automating defined preparation and checking steps restores that capacity without removing editorial ownership.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the writer and the agent should work together
&lt;/h2&gt;

&lt;p&gt;The writer defines and owns the documentation system, including its priorities, standards, and approval rules. The agent works within those boundaries.&lt;/p&gt;

&lt;p&gt;A practical workflow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A code change, release, repeated support question, or documentation audit creates a signal.&lt;/li&gt;
&lt;li&gt;The agent gathers the relevant sources and identifies the affected documentation.&lt;/li&gt;
&lt;li&gt;The agent prepares a draft or a focused recommendation with its source trail.&lt;/li&gt;
&lt;li&gt;The writer checks audience fit, product accuracy, structure, terminology, and risk.&lt;/li&gt;
&lt;li&gt;An engineer or product owner resolves any open technical question.&lt;/li&gt;
&lt;li&gt;The writer approves, edits, rejects, or redirects the work.&lt;/li&gt;
&lt;li&gt;The team measures whether the update reduced drift, repeated questions, or reviewer effort.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This model keeps publication authority with the team. It also creates a visible path from product change to documentation change, which is difficult to maintain through ad hoc tickets alone.&lt;/p&gt;

&lt;p&gt;Technical writers evaluating what this changes in their daily work can read &lt;a href="https://ekline.io/for-technical-writers" rel="noopener noreferrer"&gt;EkLine for technical writers&lt;/a&gt;. The writer retains program and editorial ownership: deciding what users need, shaping the information architecture, resolving ambiguity, coordinating technical review, and approving publication. The agent expands coverage by preparing traceable work for review.&lt;/p&gt;

&lt;h2&gt;
  
  
  A decision guide for the requisition you are about to open
&lt;/h2&gt;

&lt;p&gt;Use the following questions before deciding what to buy or whom to hire.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;If the answer is yes&lt;/th&gt;
&lt;th&gt;Recommended action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Is there no accountable documentation owner?&lt;/td&gt;
&lt;td&gt;Strategy and judgment are missing.&lt;/td&gt;
&lt;td&gt;Hire a technical writer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are engineers writing most customer-facing docs from scratch?&lt;/td&gt;
&lt;td&gt;The company needs editorial ownership and a better contribution workflow.&lt;/td&gt;
&lt;td&gt;Hire a writer and automate source gathering plus first drafts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does a capable writer spend most of the week chasing updates and doing routine maintenance?&lt;/td&gt;
&lt;td&gt;Capacity is trapped in repeatable work.&lt;/td&gt;
&lt;td&gt;Add automation around the writer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are the docs poorly structured or hard to navigate?&lt;/td&gt;
&lt;td&gt;The problem requires information architecture.&lt;/td&gt;
&lt;td&gt;Hire or assign a senior documentation owner before automating broadly.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are updates late because teams forget to notify docs?&lt;/td&gt;
&lt;td&gt;Change detection is broken.&lt;/td&gt;
&lt;td&gt;Automate detection and routing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is there nobody qualified to review generated updates?&lt;/td&gt;
&lt;td&gt;The approval layer is missing.&lt;/td&gt;
&lt;td&gt;Establish ownership before adding generation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is the product surface growing across many teams?&lt;/td&gt;
&lt;td&gt;Ownership and coverage must scale together.&lt;/td&gt;
&lt;td&gt;Use a writer-led, agent-assisted model.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Open the requisition when the company needs an accountable documentation owner. If maintenance volume is also a problem, define the writer's remit and automate the repeatable parts of the workflow as part of the same plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to take from the Socure example
&lt;/h2&gt;

&lt;p&gt;Socure's result shows one condition where this model can work: a capable writer already owns the program, while change detection and draft preparation limit coverage across a broad product surface.&lt;/p&gt;

&lt;p&gt;Treat the 25+ product ratio as specific to Socure. Product complexity, release cadence, existing documentation quality, review requirements, and source access will change the staffing and workflow a different company needs.&lt;/p&gt;

&lt;p&gt;Peter remained responsible for editorial judgment and publication. The workflow gave him more time for information architecture and documentation improvements that had been crowded out by incoming requests.&lt;/p&gt;

&lt;p&gt;Documentation automation should increase the writer's control over the program and capacity to improve it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run a small workflow test before changing the team plan
&lt;/h2&gt;

&lt;p&gt;Test the workflow on recent documentation work rather than a generic automation demo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select five to ten recent product changes and recurring support questions that led to documentation work.&lt;/li&gt;
&lt;li&gt;Ask the current docs owner to mark where each item required audience judgment, source validation, drafting, or approval, and which steps repeated across items.&lt;/li&gt;
&lt;li&gt;Keep audience decisions, ambiguity resolution, structure, and approval with the writer.&lt;/li&gt;
&lt;li&gt;Test automation on detection, context gathering, first-draft preparation, and repeatable checks.&lt;/li&gt;
&lt;li&gt;Record the affected pages found, factual corrections made during review, reviewer time, and elapsed time from signal to approved change. Compare those results with the current process.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result should tell you what the requisition needs to accomplish. If the test reveals both missing ownership and a repeatable maintenance bottleneck, hire the writer and automate the bottleneck. If only one is missing, solve that problem first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the requisition match the bottleneck
&lt;/h2&gt;

&lt;p&gt;Open the requisition if the team lacks an accountable documentation owner with authority to set priorities, structure, and standards. Add automation if that owner is spending too much time finding changes, collecting source context, preparing routine updates, or running repeatable checks. If both conditions are true, fund the role and the workflow together.&lt;/p&gt;

&lt;p&gt;Keep publication approval with the writer. Evaluate the combined system by documentation coverage, factual corrections during review, reviewer effort, and user outcomes.&lt;/p&gt;

&lt;p&gt;To see how this workflow would handle your recent product changes and support questions, &lt;a href="https://cal.link/meet_ekline_3" rel="noopener noreferrer"&gt;book an EkLine walkthrough&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should we hire a technical writer or automate documentation?
&lt;/h3&gt;

&lt;p&gt;Hire a technical writer when the company lacks clear documentation ownership, audience judgment, information architecture, or editorial governance. Automate when an existing owner spends too much time detecting changes, gathering context, drafting routine updates, and checking repeatable rules. Fast-moving technical companies often need both: a writer who owns the documentation program and an agent that handles repeatable work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does EkLine replace technical writers?
&lt;/h3&gt;

&lt;p&gt;No. EkLine gives technical writers leverage. It helps detect documentation work, gather source material, draft updates, run quality checks, and route changes for review. The writer still decides what users need, resolves ambiguity, shapes the information architecture, and approves publication.&lt;/p&gt;

&lt;h3&gt;
  
  
  What work should a technical writer own?
&lt;/h3&gt;

&lt;p&gt;A technical writer should own audience understanding, documentation strategy, information architecture, editorial standards, cross-functional decisions, high-risk explanations, and final approval. These jobs depend on audience judgment, cross-functional trust, and clear accountability.&lt;/p&gt;

&lt;h3&gt;
  
  
  What documentation work should be automated?
&lt;/h3&gt;

&lt;p&gt;Good candidates include detecting documentation impact from product changes, collecting relevant source context, drafting routine updates, checking style and terminology, finding broken links, and routing a reviewable change to the right owner.&lt;/p&gt;

&lt;h3&gt;
  
  
  How did Socure combine a technical writer with EkLine?
&lt;/h3&gt;

&lt;p&gt;Socure paired one technical writer with EkLine across more than 25 products. Peter Schwarck reviewed and published the updates while EkLine detected changes and prepared source-grounded drafts. Socure reported 348 merged documentation updates in seven weeks, the estimated equivalent of more than 1,000 hours of documentation work.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>writing</category>
      <category>automation</category>
      <category>hiring</category>
    </item>
  </channel>
</rss>
