<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Tech Docs: ⚡ Scaling Docs]]></title><description><![CDATA[When growth breaks things: workflows, automation, migrations]]></description><link>https://blog.techdocs.studio/s/scaling-docs</link><image><url>https://substackcdn.com/image/fetch/$s_!2k14!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff99f17-2d47-4548-9b5d-0caae3d7adeb_1200x1200.png</url><title>Tech Docs: ⚡ Scaling Docs</title><link>https://blog.techdocs.studio/s/scaling-docs</link></image><generator>Substack</generator><lastBuildDate>Wed, 24 Jun 2026 03:18:55 GMT</lastBuildDate><atom:link href="https://blog.techdocs.studio/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[David Garcia]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[david@techdocs.studio]]></webMaster><itunes:owner><itunes:email><![CDATA[david@techdocs.studio]]></itunes:email><itunes:name><![CDATA[David Garcia]]></itunes:name></itunes:owner><itunes:author><![CDATA[David Garcia]]></itunes:author><googleplay:owner><![CDATA[david@techdocs.studio]]></googleplay:owner><googleplay:email><![CDATA[david@techdocs.studio]]></googleplay:email><googleplay:author><![CDATA[David Garcia]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Nobody plans for redirects]]></title><description><![CDATA[Until users can't find anything, partners complain, and Google traffic disappears.]]></description><link>https://blog.techdocs.studio/p/nobody-plans-for-redirects</link><guid isPermaLink="false">https://blog.techdocs.studio/p/nobody-plans-for-redirects</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Mon, 11 May 2026 13:05:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ae65bd8e-34be-4d61-a5c4-1df7eae7be77_3683x4604.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We were running a content audit for a client preparing to migrate their docs to a new platform. Standard work: pull every published URL into a spreadsheet, group by section, flag what to keep, what to merge, what to drop.</p><p>Then we cross-referenced their analytics. A handful of old URLs were responsible for most of the search traffic to the site. Pages that had ranked well for years, that partners linked to, that customers had bookmarked. None of those URLs would exist on the new site.</p><p>If we&#8217;d launched without a redirect plan, they would have lost months of search traffic overnight. Customer bookmarks would break. Partner integrations would point to dead pages.</p><p>Most of the energy in a migration goes into the new platform. What it looks like, how it&#8217;s organized, what tech stack to use, where to host it&#8230; The old URLs barely come up. </p><p>But you&#8217;re not just moving content. You&#8217;re moving content that other people have linked to, in places you don&#8217;t control. Search engines, partner sites, support emails, bookmarks, internal wikis. You can&#8217;t update any of those. The only thing you can do is make sure the URLs they point to still resolve.</p><p>So if you&#8217;re planning a docs migration, ask one question: what happens to every existing URL?</p><p>Whether you&#8217;re reviewing a plan from a vendor or running the project internally, this is the check that matters. If nobody on the team can answer it, redirects aren&#8217;t going to happen. They&#8217;ll get pushed to &#8220;after launch&#8221; and never come back.</p><p>The new site can be perfect. But every old URL that breaks costs you traffic, support tickets, and a bit of trust.</p>]]></content:encoded></item><item><title><![CDATA[Why we still use Doxygen (just not the way you think)]]></title><description><![CDATA[Doxygen isn't dead. Here's how we turn it into docs users actually read.]]></description><link>https://blog.techdocs.studio/p/why-we-still-use-doxygen-just-not</link><guid isPermaLink="false">https://blog.techdocs.studio/p/why-we-still-use-doxygen-just-not</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 05 May 2026 13:03:57 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9ae13009-1feb-429e-9a30-13324092a3fc_4000x6000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last month at a Write the Docs Barcelona meetup, someone asked me: <em>&#8220;Do you see tools like Doxygen going out of style?&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xLs1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xLs1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xLs1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:767742,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/196132097?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xLs1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Default Doxygen output</figcaption></figure></div><p>It&#8217;s a fair question. Doxygen&#8217;s default output looks vintage, and most people who land on it don&#8217;t stick around.</p><h2>The problem isn&#8217;t Doxygen</h2><p>Doxygen is great at the part most people don&#8217;t want to do themselves: parsing code comments and extracting structured information. Class hierarchies, function signatures, parameter descriptions, return types, defaults.<br><br>The problem is what comes out of the box. The HTML looks like it was built two decades ago, and it lives as a separate site with its own search, disconnected from the docs users already know. It feels like a different product altogether.<br><br>So engineers close the tab. Writers stop pushing for it. The reference docs either don&#8217;t get published, or they get published and nobody reads them. Neither is good.</p><h2>Use Doxygen as a parser, not a publisher</h2><p>Doxygen also generates XML alongside HTML. Same structured data, in a format you can actually work with.</p><p>From that XML you can produce markdown, RST, or whatever format your docs platform expects. The API reference becomes part of your docs instead of a separate site bolted on. Sphinx, Docusaurus, Antora, MkDocs, whatever you&#8217;re already using.</p><p>We did this for ScyllaDB&#8217;s Driver docs. Built a custom extension that consumed the Doxygen XML and rendered it as native Sphinx pages.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LENn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LENn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!LENn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!LENn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!LENn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LENn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:425315,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/196132097?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LENn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!LENn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!LENn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!LENn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Doxygen output with a custom Sphinx extension</figcaption></figure></div><p>The API reference now looks like every other page on the site. Same theme, same navigation, same search. When the team adds new libraries, the reference updates from the comments in the code, automatically. </p><p>The downside is that you have to write the extension if one doesn&#8217;t exist for your platform. But that&#8217;s a one-time effort, and the alternative is maintaining reference docs by hand and watching them go stale every release.</p><h2>Why this matters more now</h2><p>Structured API reference is also exactly what AI agents need to write correct code. When an agent has to know what parameters a function takes, or what its return type is, the reference is more reliable than any tutorial. It comes straight from the source.</p><p>Doxygen&#8217;s XML already contains all of that. Publishing it properly means it&#8217;s useful for both humans and AI, not just one or the other.</p><h2>So is Doxygen going out of style?</h2><p>The template is, but the tool isn&#8217;t. Doxygen still does the hardest part: extracting structured documentation from code.</p>]]></content:encoded></item><item><title><![CDATA[We tried following a client's getting started guide]]></title><description><![CDATA[Half the code examples didn't compile.]]></description><link>https://blog.techdocs.studio/p/we-tried-following-a-clients-getting</link><guid isPermaLink="false">https://blog.techdocs.studio/p/we-tried-following-a-clients-getting</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 25 Mar 2026 14:03:46 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/791d95b5-acad-4c95-a2bc-bbfada457147_3505x2663.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week a client asked us to review their getting started module. The manual installation section was deeply technical: lots of steps, lots of code blocks, lots of commands to run in sequence.</p><p>We started following it. Within a few minutes, we had our answer. Some steps worked fine, but others didn&#8217;t even compile. One snippet referenced a method that no longer existed. Another used a dependency version from two releases ago.</p><p>The client didn&#8217;t know. The page looked great. Clean formatting, syntax highlighting, clear explanations between each code block. Nothing about it screamed &#8220;broken&#8221;, you had to actually run the code to find out.</p><p>This is what happens when code lives in Markdown files, disconnected from any build process. The docs look fine, but they just don&#8217;t work anymore.</p><h2>Keep examples in a project, not in your docs</h2><p>The fix: stop pasting code into Markdown files. Instead, keep your examples in a separate project that actually compiles.</p><p>The project lives in its own folder near the docs, with real dependencies, a real build step, and version control. Your docs import snippets from this project instead of containing them directly. When the product releases a new version, you update the project. If a snippet breaks, the build fails. You find out before your users do.</p><p>You can also version your examples properly. Need docs for v2 and v3? The project has branches for each. You bump the dependency, run the build, and know immediately what still works.</p><p>Once we set this up for the client, updating code examples stopped being scary. It went from editing a Markdown file and hoping it still worked to making a code change with a build. New users following the getting started guide actually got to the end.</p><p>It does mean maintaining a project alongside your docs. But the alternative is finding out your examples are broken when a user does.</p><div><hr></div><p>If you want the practical details on how to set this up, I wrote a <a href="https://blog.techdocs.studio/p/how-to-keep-documentation-code-examples">step-by-step guide</a> a few years ago.</p>]]></content:encoded></item><item><title><![CDATA[Slow builds were killing our docs]]></title><description><![CDATA[How we cut a Sphinx build from 30 minutes to under 3 by splitting PDFs into chapters and parallelizing outputs.]]></description><link>https://blog.techdocs.studio/p/slow-builds-were-killing-our-docs</link><guid isPermaLink="false">https://blog.techdocs.studio/p/slow-builds-were-killing-our-docs</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 26 Feb 2026 08:31:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a714444a-305c-4f09-8d8f-114ef0b08f0d_6048x4024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#8220;Our docs build takes 30 minutes.&#8221;</em></p><p>The client said it casually, like it was just how things worked. The system rebuilt the entire site every time, even for a one-word fix.</p><p>This is more common than you&#8217;d think, and it kills documentation quality in ways that aren&#8217;t obvious.</p><h2>Slow builds make docs worse</h2><p>When a build takes 30 minutes, nobody verifies small changes. You fix a typo, push it, and hope for the best. You&#8217;re not going to wait half an hour to check whether the formatting looks right.</p><p>So writers stop iterating. They batch changes into big updates instead of making frequent small improvements. Reviews drag because nobody wants to trigger another long cycle just to see a preview. </p><p>The result: fewer updates go out, more errors slip through, and the team starts treating the docs as something to avoid touching.</p><h2>Why this build was slow</h2><p>The project used Sphinx, and every build generated everything from scratch: the full HTML site and a complete PDF manual.</p><p>The PDF was the bottleneck. Sphinx uses LaTeX to produce PDFs, and LaTeX is slow. One monolithic PDF meant one monolithic build, so changing a single paragraph in the authentication guide rebuilt a 1,400-page PDF from scratch.</p><p>It got worse: the HTML and PDF builds ran one after the other. Even when the HTML build was fast, it sat waiting for the PDF to finish before the pipeline completed.</p><h2>What we changed</h2><p>We split the monolithic PDF into separate files, one per section. Authentication, API reference, deployment guide, each with its own PDF. Now changing the auth docs rebuilds only that PDF and leaves the rest untouched.</p><p>Then we stopped running the two builds in sequence. HTML and PDF now build in parallel, so writers can preview their HTML changes right away while the PDFs generate in the background.</p><h2>The result</h2><p>Build time dropped from 30 minutes to under 5 for most changes.</p><p>But the number isn&#8217;t the point. What mattered was how the team&#8217;s behavior changed. Writers started checking their work again. Small fixes went out the same day instead of waiting for &#8220;next sprint.&#8221; Reviews sped up because previews were ready in minutes. The docs got better because the build time got out of the way.</p><p>Nobody complains about slow builds in sprint retros. They're a silent documentation killer, quietly pushing teams away from touching the docs. </p><p>If yours takes more than 10 minutes, it's worth finding out why.</p>]]></content:encoded></item><item><title><![CDATA[The friction problem: Why we skip steps (even important ones)]]></title><description><![CDATA[How a simple link fixed our broken docs review process.]]></description><link>https://blog.techdocs.studio/p/the-friction-problem-why-we-skip</link><guid isPermaLink="false">https://blog.techdocs.studio/p/the-friction-problem-why-we-skip</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Mon, 02 Feb 2026 13:24:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b694fa48-c034-4d11-879a-b7dbd1f16fb9_5616x3716.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The docs went live with errors. Users reported them within hours.</p><p>The review process was supposed to be simple: build the docs locally, check for broken links, formatting issues, rendering problems, then approve.</p><p>Except reviewers weren&#8217;t building the docs locally. They were skimming the markdown in the PR and hitting approve. &#8220;LGTM!&#8221; Without ever seeing the rendered output.</p><p>You can&#8217;t really blame them. Building docs locally means cloning the repo, installing dependencies, running a build command, waiting, then navigating to localhost. That&#8217;s five minutes of friction for a review that &#8220;should&#8221; take two. So they skip it and hope it renders fine.</p><h2>This isn&#8217;t a discipline problem</h2><p>It&#8217;s a friction problem.</p><p>We don&#8217;t skip important steps because we&#8217;re lazy. We skip them because the effort feels disproportionate to the task. A quick review shouldn&#8217;t require a local dev environment, but this one did. So the &#8220;quick review&#8221; quietly became &#8220;skim the markdown and approve.&#8221;</p><h2>The fix was simple</h2><p>We added automated PR previews. Every pull request now generates a deployed preview and drops the link in the PR comments.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pa3d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pa3d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 424w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 848w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 1272w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pa3d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png" width="1236" height="464" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:464,&quot;width&quot;:1236,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74911,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/186590483?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pa3d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 424w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 848w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 1272w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#8220;Click this link&#8221; replaced &#8220;build it locally.&#8221; One click versus five minutes of setup. Guess which one people actually do.</p><p>Review quality went up immediately. Not because we trained anyone, not because we wrote stricter guidelines, not because we added more process. We just removed the friction.</p><h2>The pattern</h2><p>This isn&#8217;t unique to doc reviews. Style guides get ignored when checking them by hand is a chore, so you put the linter in CI and suddenly everyone complies. Broken link checks never happen because clicking every link is tedious, so you automate them and they get caught before merge.</p><p>The step is important. Everyone agrees it&#8217;s important. We still skip it, and every time the reason is the same: too much friction for the value it delivers in the moment.</p><p>So instead of asking &#8220;why aren&#8217;t people following the process?&#8221;, ask &#8220;what&#8217;s making this process hard to follow?&#8221;</p><div><hr></div><p>If you've run into something similar (a process that kept getting skipped until you found a way to reduce the friction) I'd love to hear about it in the comments.</p>]]></content:encoded></item><item><title><![CDATA[Your docs are talking. Are you listening?]]></title><description><![CDATA[How AI assistants turn user questions into product insights]]></description><link>https://blog.techdocs.studio/p/ai-documentation-assistants-content-gaps</link><guid isPermaLink="false">https://blog.techdocs.studio/p/ai-documentation-assistants-content-gaps</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 21 Jan 2026 15:14:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6e0d97e5-1698-450f-b9ef-20cc8172c5bc_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most teams add an <strong>AI assistant</strong> to their docs for one reason: answer user questions faster.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OqIT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OqIT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OqIT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:624677,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/185216606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OqIT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AI chatbot embedded in a documentation site</figcaption></figure></div><p>That&#8217;s a fine goal. But it misses the bigger opportunity.</p><h2>The real value isn&#8217;t answers. It&#8217;s visibility.</h2><p>Every question a user asks reveals something:</p><ul><li><p>A confusing explanation</p></li><li><p>A missing example</p></li><li><p>A gap in the product itself</p></li></ul><p>When teams add an AI assistant to their docs, they don&#8217;t just get faster support. They get a window into exactly where users are struggling.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gj-g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gj-g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 424w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 848w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 1272w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gj-g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png" width="1456" height="702" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33f12312-715c-465d-af72-f50bebd403e8_1526x736.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:702,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152897,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/185216606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gj-g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 424w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 848w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 1272w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AI chatbot responding "I don't have enough information to answer this question"</figcaption></figure></div><p>When your AI can&#8217;t answer, that&#8217;s not a failure. It&#8217;s a signal.</p><p>That shift changes everything.</p><h2>From static reference to feedback loop</h2><p>Traditional documentation is a one-way broadcast. You write it, publish it, and hope it helps.</p><p>But when you track what users actually ask, documentation becomes a conversation. You see patterns. You spot the same confusion appearing again and again. You find the blind spots your team never noticed because you&#8217;re too close to the product.</p><p>Suddenly, your docs aren&#8217;t just supporting users. They&#8217;re teaching you what to fix.</p><h2>The insight you&#8217;re leaving on the table</h2><p>If your documentation only answers questions, you&#8217;re capturing maybe 10% of its potential value.</p><p>The other 90%? It&#8217;s in the questions themselves.</p><ul><li><p>Which features confuse people most?</p></li><li><p>Where do users get stuck in onboarding?</p></li><li><p>What terminology doesn&#8217;t land?</p></li></ul><p>With an AI assistant, that data exists. Most teams just aren&#8217;t collecting it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vjzc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vjzc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg" width="1456" height="750" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:750,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57945,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/185216606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Vjzc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Analytics dashboard displaying unanswered questions grouped by topic and frequency.</figcaption></figure></div><p>A good AI assistant surfaces which questions your docs can&#8217;t answer, ranked by frequency.</p><h2>From insight to action</h2><p>Knowing where the gaps are is only half the problem. Fixing them is where most teams stall.</p><p>The best tools help you close those gaps with clear guidance on where to start.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VPZo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VPZo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 424w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 848w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VPZo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png" width="1456" height="652" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:652,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:501293,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/185216606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VPZo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 424w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 848w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Recommendations on how to fix each content gap, with guidance on what to document and why.</figcaption></figure></div><h2>Start here</h2><p>Next time you look at your docs, don&#8217;t ask &#8220;did we cover everything?&#8221;</p><p>Ask &#8220;what are users still asking, and why?&#8221;</p><p>The answer will show you exactly what needs to change.</p>]]></content:encoded></item><item><title><![CDATA[How to get useful documentation feedback (not comma debates)]]></title><description><![CDATA[Vague requests get surface feedback. Here's how to ask questions that actually help.]]></description><link>https://blog.techdocs.studio/p/how-to-get-useful-documentation-feedback</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-get-useful-documentation-feedback</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 14 Jan 2026 20:20:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/19c4eeea-c2aa-43b1-aeca-27087bcaaada_5568x3712.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week, I sent a tutorial draft to two teammates.</p><p><em>&#8220;Hey, can you review this?&#8221;</em></p><p>Two days later I had 10 comments. Four were about commas. Two more debated whether colons introducing lists should be bold. Another spent three paragraphs on whether &#8220;setup&#8221; should be one word or two.</p><p>Not a single comment mentioned that step 4 was completely broken. The command I told users to run didn&#8217;t actually work.</p><h2>Why vague requests produce surface feedback</h2><p>When you ask &#8220;can you review this?&#8221; with no direction, reviewers default to whatever stands out first: typos, formatting, word choice. Easy to spot, easy to comment on.</p><p>&#8220;Review this&#8221; could mean:</p><ul><li><p>Check if the logic makes sense</p></li><li><p>Verify the code runs</p></li><li><p>Look for security issues</p></li><li><p>Test the user flow</p></li><li><p>Proofread for typos</p></li><li><p>Check if the tone is right</p></li></ul><p>Without knowing what you need, people pick the easiest path.</p><h2>The cost of unfocused reviews</h2><p>You spend hours sorting through comments that don&#8217;t help. Reviewers spend their energy on things you&#8217;ll ignore or fix in a later phase. And the real issues never get caught.</p><p>I&#8217;ve watched teams spend three review cycles debating admonition colors while nobody noticed the registration flow was broken. Product and docs ship, users can&#8217;t sign up, and someone says &#8220;but we had five people review it.&#8221; They did. They reviewed the wrong things.</p><h2>How to ask for useful feedback</h2><p>Tell exactly what to look at:</p><ul><li><p><em>&#8220;Does the getting started flow make sense?&#8221;</em></p></li><li><p><em>&#8220;Are the code examples working on your end?&#8221;</em></p></li><li><p><em>&#8220;Is the reference documentation for this function complete?&#8221;</em></p></li></ul><p>And tell them what to ignore:</p><ul><li><p><em>&#8220;Don&#8217;t test authentication, QA is handling that&#8221;</em></p></li><li><p><em>&#8220;Ignore formatting, I&#8217;ll run the linter&#8221;</em></p></li><li><p><em>&#8220;Skip the intro section, it&#8217;s placeholder text&#8221;</em></p></li><li><p><em>&#8220;Don&#8217;t worry about performance yet, that&#8217;s next sprint&#8221;</em></p></li></ul><p>The second half matters as much as the first. Telling people what to skip is what frees them to focus on what you actually need.</p><h2><strong>If you&#8217;re the one being asked to review</strong></h2><p>This works the other way too. Someone sends you <em>&#8220;can you review this?&#8221;</em> with no context. Ask what kind of feedback they&#8217;re looking for. It takes 30 seconds and saves you both from a useless cycle.</p><p>Ask <em>&#8220;What kind of feedback are you looking for?&#8221;</em></p><p>Takes 30 seconds. Saves both of you from a useless review cycle.</p><p>That doesn&#8217;t mean ignoring obvious problems. If you spot a bug or a broken link while reviewing, point it out. If something&#8217;s unclear, say so. Leave things better than you found them. But keep the goal in mind: if someone asked you to review the tutorial flow and you spend 15 minutes hunting for Oxford commas, you&#8217;ve lost the plot.</p><h2>How to make this normal</h2><p>Next time you ask for a review, add one specific question. When someone asks you to review something, ask what they&#8217;re looking for.</p><p>A simple template helps:</p><ul><li><p><strong>What changed:</strong> brief summary</p></li><li><p><strong>What to focus on:</strong> specific concerns</p></li><li><p><strong>What to skip:</strong> things handled elsewhere</p></li><li><p><strong>Questions:</strong> what you&#8217;re unsure about</p></li></ul><h2>What it comes down to</h2><p>Everybody wants to help. But without direction, it&#8217;s easy to lose focus on whatever jumps out first, and that&#8217;s almost never what you need.</p><p>If you want useful feedback, ask useful questions. Be specific, point toward what matters, and call out what to ignore. You&#8217;ll get faster reviews, better feedback, and fewer arguments.</p>]]></content:encoded></item><item><title><![CDATA[Our best tutorial was actually broken (we just couldn't see it)]]></title><description><![CDATA[12 user complaints revealed what our analytics couldn't]]></description><link>https://blog.techdocs.studio/p/our-best-tutorial-was-actually-broken</link><guid isPermaLink="false">https://blog.techdocs.studio/p/our-best-tutorial-was-actually-broken</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 23 Dec 2025 14:47:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/26218e86-5bf4-4c0e-97b0-4d928f05b31f_3553x2572.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A tutorial had a 5-minute average session time. The analytics looked great, the best retention of any page. During a review call, the product lead pulled up the dashboard: &#8220;See? Users love this one.&#8221;</p><p>We suggested adding a feedback widget. A small button: &#8220;Was this helpful?&#8221;</p><p>One week later, 12 users had left feedback. Not one was positive.</p><p>&#8220;Step 3 is missing.&#8221; &#8220;This example doesn&#8217;t work.&#8221; &#8220;I&#8217;ve read this four times and I&#8217;m still confused.&#8221; &#8220;Where&#8217;s the actual code?&#8221;</p><p>Those 5 minutes weren&#8217;t engagement. They were users scrolling up and down, re-reading, trying to figure out what was missing.</p><h2>Good metrics, bad experience</h2><p>The analytics showed what users did. The feedback showed why.</p><p>The team fixed everything in 48 hours: added the missing step, replaced the broken example, clarified the confusing parts, and added code where users expected it.</p><p>Session time dropped to 3 minutes. But now users were finishing successfully instead of giving up confused.</p><h2>You need both</h2><p>Quantitative data shows behavior. Qualitative data explains it.</p><p>Your analytics will tell you users spent 5 minutes on a page. Your users will tell you they spent those 5 minutes confused.</p><p>One number can mean two completely different things.</p>]]></content:encoded></item><item><title><![CDATA[A tagging system for documentation review comments]]></title><description><![CDATA[Use a tagging system to stop debating what blocks merge.]]></description><link>https://blog.techdocs.studio/p/a-tagging-system-for-documentation-review-comments</link><guid isPermaLink="false">https://blog.techdocs.studio/p/a-tagging-system-for-documentation-review-comments</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 16 Dec 2025 14:03:40 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/828d34d6-fb7e-48f1-aed1-6fec03b5d0ad_5184x3456.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every comment in the review looks equally urgent.</p><p>Formatting notes sit beside broken code examples. The team spends 30 minutes debating comma placement while critical bugs slip through.</p><p>To fix this, I introduced a tagging system for review comments.</p><h2>The problem: No shared language for priority</h2><p>Reviewers leave comments without indicating priority, and contributors treat every comment as blocking. The breakdown happens in three ways:</p><ul><li><p><strong>Contributors waste time on non-issues:</strong> Someone suggests &#8220;maybe use a bullet list here instead of numbered?&#8221; The contributor spends an hour reformatting. Turns out it was just a passing thought.</p></li><li><p><strong>Critical issues get missed:</strong> Seventeen comments deep, one mentions the API endpoint is wrong. The PR merges. Users hit a broken example. Support tickets pile up.</p></li><li><p><strong>Review cycles multiply:</strong> Contributor fixes what they think matters. Reviewer expected different fixes. Another round. The two-day PR becomes a two-week ordeal.</p></li></ul><p>The root cause is the missing shared language for priority. And even when something clearly needs fixing, the comment doesn&#8217;t say what kind of fix it is. A code bug? A clarity problem? A style preference? Contributors guess, guess wrong, and the cycle repeats.</p><h2>The fix: severity + category</h2><p>A two-part tag for every review comment.</p><p><strong>Severity</strong> tells contributors the importance of the fix:</p><ul><li><p><strong>blocker:</strong> Must fix before merge. Breaks functionality or blocks critical understanding.</p></li><li><p><strong>improvement</strong>: Should fix before publication. Improves clarity, structure, or usability.</p></li><li><p><strong>optional</strong>: Personal preferences, stylistic suggestions, future ideas.</p></li></ul><p><strong>Category</strong> tells contributors what kind of fix at first glance:</p><ul><li><p><strong>clarity</strong>: Confusing or incomplete explanations.</p></li><li><p><strong>bug</strong> Incorrect code, wrong output, factual errors.</p></li><li><p><strong>organization</strong>: Issues with flow, structure, content order.</p></li><li><p><strong>style</strong>: Wording, formatting, tone.</p></li><li><p><strong>consistency</strong>: Conflicts with other sections, terminology, or examples.</p></li></ul><p>Add others if your team needs them, but keep the list short.</p><h2>Some examples</h2><blockquote><p><em>(improvement, clarity)</em>: Step 3 assumes readers know what environment variables are. Add a one-line explanation or link to prerequisites.</p></blockquote><blockquote><p><em>(blocker, bug)</em>: This code example throws an error. Missing import statement at the top.</p></blockquote><blockquote><p><em>(improvement, organization)</em>: Move the troubleshooting section before advanced configuration. Users hit errors at the basic level first.</p></blockquote><blockquote><p><em>(optional, clarity)</em>: This explanation works, but the second paragraph repeats the first. Consider cutting it.</p></blockquote><h2>What changes after tagging</h2><ul><li><p><strong>Contributors know what to fix immediately</strong>. Scan for <em>blocker</em> tags. Fix those first. Everything else waits.</p></li><li><p><strong>Contributors feel less overwhelmed: </strong>Seventeen comments looks terrifying. Two blockers, eight improvements, seven optional? Manageable.</p></li><li><p><strong>Debates end faster: </strong>No more &#8220;should we merge this or wait?&#8221; If there are no blockers, merge. Track improvements for follow-up.</p></li><li><p><strong>Review culture improves:</strong> New reviewers see the pattern. They start tagging their comments. The team develops shared expectations.</p></li></ul><h2>What this doesn&#8217;t fix</h2><p>Tagging doesn&#8217;t fix slow reviewers. If your team takes three days to look at PRs, tags won&#8217;t help, because that&#8217;s a process problem.</p><p>It doesn&#8217;t fix bad feedback either. &#8220;(blocker, style): I don&#8217;t like this wording&#8221; is still bad feedback. The reviewer still has to add context and explain why.</p><p>And it doesn&#8217;t replace good judgment. A reviewer still needs to know what&#8217;s actually a blocker versus a preference.</p><h2>How to start</h2><p>Don&#8217;t overthink it. Start tagging your review comments this week, with the tag at the start of each comment where it&#8217;s visible.</p><p>Within two weeks you&#8217;ll see fewer debates about what blocks merge. Contributors will know what to fix first, reviews will move faster, and other reviewers will copy the pattern.</p><p>The system works because it forces one decision upfront: is this blocking or not? Make that decision explicit, and stop guessing.</p>]]></content:encoded></item><item><title><![CDATA[Reference documentation that never gets outdated]]></title><description><![CDATA[Define once. Generate everything else.]]></description><link>https://blog.techdocs.studio/p/reference-documentation-that-never</link><guid isPermaLink="false">https://blog.techdocs.studio/p/reference-documentation-that-never</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 02 Dec 2025 15:04:35 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/761812b0-f2a1-4788-8b40-0e9757367830_3840x2560.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most teams maintain configuration properties twice. Code defines them, docs describe them, and then the two drift apart.</p><h2>The problem</h2><p>An engineer adds a new configuration property:</p><pre><code>export interface DatabaseConfig {
  isolationLevel?: IsolationLevel;
  enableSsl?: boolean; 
  <strong>retryAttempts?: number; // New property</strong>
}</code></pre><p>They deploy it and forget to update the docs.</p><p>Three weeks later, a user reads the documentation. There&#8217;s no mention of <code>retryAttempts</code>, so they assume the feature doesn&#8217;t exist. Or worse, they assume the default behavior and it breaks their setup. A support ticket arrives.</p><p>This pattern repeats with every config change:</p><ul><li><p>Properties get added and docs lag behind. </p></li><li><p>Properties get deprecated and docs still show them. </p></li><li><p>Defaults change and docs show the old values.</p></li></ul><p>The same thing happens with API parameters, CLI flags, environment variables, and error codes. Anywhere docs describe what exists in code.</p><p>The root cause is simple: code and docs live in two places with different owners. Code changes frequently, gets reviewed and tested, and is always correct. Docs update manually, have no automated checks, and drift out of sync. Two systems that don&#8217;t talk to each other.</p><h2>The solution: define once, generate the rest</h2><p>There are two approaches.</p><h3>Approach 1: Define a schema</h3><p>Write a machine-readable schema as your source of truth, and generate code, docs, and everything else from it.</p><pre><code>properties:

  - name: isolation_level
    required: true
    type: string
    enum: [READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE]
    example: READ_UNCOMMITTED
    description: Transaction isolation level

  - name: enable_ssl
    required: false
    type: boolean
    default: true
    description: Enable SSL encryption for database connections

  - name: retry_attempts
    required: false
    type: integer
    default: 3
    description: Number of times to retry failed connections</code></pre><p>From this schema you generate server code, client SDKs, API documentation, examples, and interactive API explorers. The schema is your contract, and everything else derives from it.</p><p>There&#8217;s a second benefit. Decoupling the schema from the actual code makes it easier to have conversations about the contract itself. Teams can review and agree on the API structure before anyone implements it.</p><p>This approach works best when open standards exist for your technology: <a href="https://www.openapis.org/">OpenAPI</a> for REST APIs, <a href="https://graphql.org/">GraphQL</a> schemas, <a href="https://protobuf.dev/">Protocol Buffers </a>for gRPC, <a href="https://json-schema.org/">JSON Schema</a>, <a href="https://www.asyncapi.com/en">AsyncAPI</a> for event-driven architectures. If no standard exists, you have to build the generators yourself, which can be a stopper when resources are tight.</p><h3>Approach 2: Annotate your code</h3><p>Add documentation as annotations directly in your code, and generate docs from it.</p><p><strong>Example:</strong> TypeScript with JSDoc</p><pre><code>export interface DatabaseConfig {

  <strong>/** Transaction isolation level
   * @required
   * @example &#8216;READ_COMMITTED&#8217;
   */</strong>
  isolationLevel?: IsolationLevel;

  <strong>/** Enable SSL encryption for database connections
   * @default true
   */</strong>
  enableSsl?: boolean;

  <strong>/** Number of times to retry failed connections
   * @default 3
   */</strong>
  retryAttempts: number;
}
</code></pre><p>From the annotated code, you generate an intermediate schema and then the reference documentation.</p><p>Check if your programming language already has a standard: <a href="https://www.baeldung.com/javadoc">JavaDoc</a> for Java, <a href="https://realpython.com/how-to-write-docstrings-in-python/#exploring-docstring-formats-in-python">Google-style docstrings</a> for Python, <a href="https://jsdoc.app/">JSDoc</a> for TypeScript/JavaScript. If no convention exists, define one, document it, and stay consistent.</p><h2>How to implement it</h2><p><strong>Start by documenting your source of truth</strong>. Write your schema file or add annotations to your code, including descriptions, types, defaults, and constraints. Be thorough here, because this is the single source that everything else generates from.</p><p><strong>Then</strong> <strong>choose your generator</strong>. Check whether existing plugins work for your docs platform. Rendering OpenAPI in Docusaurus? There&#8217;s a <a href="https://github.com/PaloAltoNetworks/docusaurus-openapi-docs">plugin</a>. Sphinx? There&#8217;s an <a href="https://sphinxcontrib-openapi.readthedocs.io/">extension</a>. If you need something more specific, like TypeScript docs in Antora, you&#8217;ll need a custom solution.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hRnt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hRnt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!hRnt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!hRnt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!hRnt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hRnt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:487079,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://techdocs.substack.com/i/179833255?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hRnt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!hRnt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!hRnt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!hRnt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55bcbf8b-bdab-425a-aaa4-d3205cca2efd_3024x1714.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Schema page generated with Docusaurus</figcaption></figure></div><p>One tip for the annotation approach: always generate an intermediate schema file (JSON or YAML) first. Don&#8217;t try to parse code annotations directly in your docs build.</p><p><strong>Finally,</strong> <strong>add it to CI</strong>. On every commit, validate the source, regenerate the documentation, and fail the build if validation fails. On merge, deploy the updated documentation automatically.</p><h2>Start small</h2><p>You don&#8217;t need to generate everything on day one. Start with one configuration file and generate just the reference table, keeping the rest manual. You can still have custom, hand-written guides alongside generated reference sections. Prove it works, then expand.</p><h2>A common objection</h2><blockquote><p><em>&#8220;But our configuration is complex. We need custom documentation.&#8221;</em></p></blockquote><p>You can still have it. Generate the reference section, the part that can be autogenerated and reused across guides, and keep the step-by-step guides manual.</p><h2>The result</h2><p>An engineer adds a new parameter and commits the code. The docs update automatically.<br><br>Three weeks later, a user reads the documentation. The parameter is there. No support ticket this time.</p>]]></content:encoded></item><item><title><![CDATA[AI writes generic docs without this]]></title><description><![CDATA[Keep a context file next to your codebase. Feed it to AI every time.]]></description><link>https://blog.techdocs.studio/p/ai-writes-generic-docs-without-this</link><guid isPermaLink="false">https://blog.techdocs.studio/p/ai-writes-generic-docs-without-this</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 25 Nov 2025 08:24:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5fa2b4f2-5308-4b3e-bb1d-84676ddd30ff_3725x2508.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I kept rewriting everything the AI wrote.</p><p>The content was technically correct but generic. Corporate tone that didn&#8217;t match our style. Examples that could have been for any product. Missing the context that makes ours different.</p><p>The AI wasn&#8217;t the problem. I was asking it to write documentation without giving it the information it needed.</p><h2>What changed</h2><p>We now keep a <strong>context file</strong> next to the codebase. Every time I prompt an AI agent, I feed this file in first.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FX_0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FX_0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png 424w, https://substackcdn.com/image/fetch/$s_!FX_0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png 848w, https://substackcdn.com/image/fetch/$s_!FX_0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png 1272w, https://substackcdn.com/image/fetch/$s_!FX_0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FX_0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png" width="3024" height="1806" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1806,&quot;width&quot;:3024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:499240,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://techdocs.substack.com/i/179824568?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b42bc54-ed7d-4158-a955-0b3d492cb541_3024x1806.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FX_0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png 424w, https://substackcdn.com/image/fetch/$s_!FX_0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png 848w, https://substackcdn.com/image/fetch/$s_!FX_0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png 1272w, https://substackcdn.com/image/fetch/$s_!FX_0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1c0ff4-b7fd-428d-b68e-b6620e5ed6bd_3024x1806.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Preview of my context file</figcaption></figure></div><p><strong>Without context file:</strong></p><blockquote><p>&#8220;Welcome to Biel.ai! We&#8217;re excited to help you get started with our amazing AI chatbot platform.&#8221;</p></blockquote><p><strong>With context file:</strong></p><blockquote><p>&#8220;Biel.ai trains on your documentation to answer technical questions. This guide gets you from zero to a working chatbot in 10 minutes.&#8221;</p></blockquote><p>The second version matches our voice, uses our positioning, and focuses on the user.</p><p>Think of it like onboarding a new team member. You don&#8217;t say &#8220;go write docs&#8221; and expect great results. You explain the product, the users, the style, the constraints. Same with AI.</p><h2>How to build one</h2><p>Create a markdown file next to your codebase and include:</p><p>1. Three sentences about your product</p><p>2. Who uses it and why (specific personas, not &#8220;developers&#8221;)</p><p>3. How you write, what to avoid, examples of good vs. bad. Paste 3-5 examples from your best docs (this is your voice)</p><p>4. Common use cases (actual workflows)</p><p>5. Technical details (stack, repo structure, naming conventions)</p><p>Commit it so it versions with your code, and update it whenever you catch the AI producing results that miss the mark.</p><p>Use it for docs, marketing copy, support responses, tutorials, release notes. Anywhere AI writes for your product.</p><p><strong>More advanced:</strong> If your IDE supports rules (like Cursor&#8217;s <code>.cursor/rules</code>), add the context file there and it&#8217;ll feed into every prompt automatically.</p><h2>An unexpected benefit</h2><p>The context file started aligning the whole team. New engineers read it to understand positioning. Writers use it for consistency. Product managers reference it when describing features. It became our single source of truth for how we talk about the product.</p><p>Worth the 30 minutes to set up.</p>]]></content:encoded></item><item><title><![CDATA[Stop using tables for documenting configuration properties]]></title><description><![CDATA[Have you ever struggled with formatting complex tables to document configuration properties?]]></description><link>https://blog.techdocs.studio/p/stop-using-tables-for-documenting</link><guid isPermaLink="false">https://blog.techdocs.studio/p/stop-using-tables-for-documenting</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 13 Jun 2024 14:33:39 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/eab444a7-05c4-4462-a0e5-36b06e4813a4_2341x3500.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Property tables look organized, but they break down fast with complex configurations.</p><p>Here&#8217;s a typical configuration table:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1Jms!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1Jms!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png 424w, https://substackcdn.com/image/fetch/$s_!1Jms!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png 848w, https://substackcdn.com/image/fetch/$s_!1Jms!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png 1272w, https://substackcdn.com/image/fetch/$s_!1Jms!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1Jms!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png" width="861" height="456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:456,&quot;width&quot;:861,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37491,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1Jms!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png 424w, https://substackcdn.com/image/fetch/$s_!1Jms!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png 848w, https://substackcdn.com/image/fetch/$s_!1Jms!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png 1272w, https://substackcdn.com/image/fetch/$s_!1Jms!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa773aace-0c91-4f33-8907-8d7faf13f0ac_861x456.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Clean at first glance, but painful in practice.</p><h2>The problems</h2><ul><li><p><strong>Limited space for descriptions: </strong>That <em>sslmode</em> property has four possible values with different behaviors. The table cell gives you 50 characters. You either truncate important information or your table explodes horizontally.</p></li><li><p><strong>Horizontal scrolling:</strong> Wide tables scroll off the screen. Users on mobile give up. Users on desktop get annoyed.</p></li><li><p><strong>Hard to edit:</strong>  Try adding a line break or list inside a Markdown table cell. You&#8217;ll remember why you hate tables.</p></li><li><p><strong>Unnecessary fields:</strong> Not every property is required. Not every property has a default. But tables force you to create columns for everything, leaving empty cells everywhere.</p></li><li><p><strong>Inflexible:</strong> Need to add &#8220;Available values&#8221; as a column? Rebuild the entire table.</p></li></ul><h2>An alternative approach: description lists</h2><p>Instead of cramming everything into cells, give each property its own block:</p><blockquote><p><strong>postgresql.connection.hostname</strong></p><p>    The hostname of the PostgreSQL server.</p><p><strong>    Required</strong></p><p><strong>    Type:</strong> String</p><p>    <strong>Example:</strong> localhost</p><p><strong>postgresql.connection.port</strong></p><p>     The port on which PostgreSQL is running.</p><p>    <strong>Type:</strong> Integer</p><p>    <strong>Default:</strong> 5432</p><p><strong>postgresql.connection.sslmode</strong></p><p>Determines whether to use SSL and the level of verification required.</p><p>    <strong>Type:</strong> String</p><p>    <strong>Default:</strong> prefer</p><p>    <strong>Available values:</strong></p><p>    - <em>disable</em><strong>:</strong> SSL is not used for the connection.</p><p>    - <em>allow</em>: First attempts a non-SSL connection. If that fails, attempts an SSL connection.</p><p>     - <em>prefer</em>: First attempts an SSL connection. If that fails, attempts a non-SSL connection.</p><p>    - require: SSL is used for the connection.</p></blockquote><h2>Why it works</h2><ul><li><p><strong>Space for actual explanations:</strong> Complex properties get the room they need. <em>sslmode</em> gets four detailed options instead of a cramped sentence.</p></li><li><p><strong>No horizontal scrolling: </strong>Content flows vertically. Works on any screen size.</p></li><li><p><strong>Easy to edit: </strong>Update one property without touching the others. Add lists, code blocks, whatever you need.</p></li><li><p><strong>Automatic linking:</strong> Most documentation systems generate anchor links for each property. Users can share <em>#postgresql.connection.sslmode</em> directly.</p></li><li><p><strong>Only show relevant fields:</strong> Required properties show &#8220;Required.&#8221; Optional properties don&#8217;t. No empty cells cluttering the page.</p></li></ul><h2>The catch</h2><p>Most documentation systems don&#8217;t support rich description lists by default, so you&#8217;ll likely need a plugin or a custom extension. It&#8217;s worth it for complex configurations, and not worth it for simple two-column data.</p><h2>Real-world examples</h2><ul><li><p><a href="https://www.mongodb.com/docs/manual/reference/configuration-options/">MongoDB Configuration Parameters</a></p></li><li><p><a href="https://www.sphinx-doc.org/en/master/usage/configuration.html">Sphinx Configuration</a></p></li><li><p><a href="https://stripe.com/docs/api/pagination">Stripe API Pagination</a></p></li></ul><h2>Conclusion</h2><p>Tables aren&#8217;t evil. They&#8217;re just overused for the wrong problems.</p><p>Use tables for simple data (two or three columns), short descriptions, and uniform properties where every row has the same fields.</p><p>Use description lists for complex properties with multiple options, long explanations, and properties with different fields, where some are required, some have defaults, and some have neither.</p><p>Now, you have another tool in your chest. Use it wisely.</p>]]></content:encoded></item><item><title><![CDATA[Treat screenshots like design assets]]></title><description><![CDATA[Use design tools and reusable components to make updates faster.]]></description><link>https://blog.techdocs.studio/p/treat-screenshots-like-design-assets</link><guid isPermaLink="false">https://blog.techdocs.studio/p/treat-screenshots-like-design-assets</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Fri, 17 Mar 2023 10:30:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d8c140f0-16bf-46f6-b787-4e1e29301636_2000x2500.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Screenshot maintenance is a mess in most documentation projects.</p><p>Someone captures a screenshot, edits it with the OS image editor, and adds it to the docs. Three months later the UI changes. Nobody can find the original, nobody knows how it was edited, and someone creates a new screenshot that looks nothing like the rest.</p><p>Designers don&#8217;t work this way. Neither should you.</p><h2>Use a design tool</h2><p>Stop editing screenshots in your OS image editor. Use Figma or Draw.io instead, and create one canvas per documentation page. All your screenshots live in one place, with consistent sizes and styles.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9qIE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9qIE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png 424w, https://substackcdn.com/image/fetch/$s_!9qIE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png 848w, https://substackcdn.com/image/fetch/$s_!9qIE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png 1272w, https://substackcdn.com/image/fetch/$s_!9qIE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9qIE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png" width="1456" height="706" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:706,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Managing screenshots with Draw.io&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Managing screenshots with Draw.io" title="Managing screenshots with Draw.io" srcset="https://substackcdn.com/image/fetch/$s_!9qIE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png 424w, https://substackcdn.com/image/fetch/$s_!9qIE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png 848w, https://substackcdn.com/image/fetch/$s_!9qIE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png 1272w, https://substackcdn.com/image/fetch/$s_!9qIE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd34a5c9a-0d88-469a-8587-a97031b05798_3840x1863.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you need to export, you choose the format and resolution. When the UI changes, you know exactly where to find the source file and what to update.</p><h2>Build a reusable library</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kvhu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kvhu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png 424w, https://substackcdn.com/image/fetch/$s_!kvhu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png 848w, https://substackcdn.com/image/fetch/$s_!kvhu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png 1272w, https://substackcdn.com/image/fetch/$s_!kvhu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kvhu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png" width="1456" height="857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:857,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Library of reusable elements&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Library of reusable elements" title="Library of reusable elements" srcset="https://substackcdn.com/image/fetch/$s_!kvhu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png 424w, https://substackcdn.com/image/fetch/$s_!kvhu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png 848w, https://substackcdn.com/image/fetch/$s_!kvhu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png 1272w, https://substackcdn.com/image/fetch/$s_!kvhu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf40a9e1-450b-466a-8554-08e4ff0003b8_2081x1225.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Create components you use across all screenshots:</p><ul><li><p>Highlight boxes (consistent color and style)</p></li></ul><ul><li><p>Arrows pointing to UI elements</p></li></ul><ul><li><p>Step numbers for tutorials</p></li></ul><ul><li><p>Blur overlays for sensitive data</p></li></ul><p>When a screenshot goes out of date, replace the base image and reuse your existing highlights and arrows instead of recreating everything from scratch.</p><h2>Store editable versions with your docs</h2><p>Put the editable files (<code>.fig</code>, <code>.drawio</code>) in your documentation repository. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Cwhy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Cwhy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png 424w, https://substackcdn.com/image/fetch/$s_!Cwhy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png 848w, https://substackcdn.com/image/fetch/$s_!Cwhy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png 1272w, https://substackcdn.com/image/fetch/$s_!Cwhy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Cwhy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png" width="1160" height="555" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:555,&quot;width&quot;:1160,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Folder structure&quot;,&quot;title&quot;:&quot;Folder structure&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Folder structure" title="Folder structure" srcset="https://substackcdn.com/image/fetch/$s_!Cwhy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png 424w, https://substackcdn.com/image/fetch/$s_!Cwhy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png 848w, https://substackcdn.com/image/fetch/$s_!Cwhy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png 1272w, https://substackcdn.com/image/fetch/$s_!Cwhy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1188141-6f0f-44c0-9fd5-8bbaeed38d82_1160x555.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When someone needs to update a screenshot six months from now, they can. They&#8217;re not starting from scratch or guessing how you created the original.</p><h2>This won&#8217;t stop screenshots from going stale</h2><p>Nothing does. But it makes updates faster. Your future self, or your teammate, opens the design file, swaps the screenshot, and exports.</p><p>The consistency is a bonus. When every screenshot uses the same highlight color and arrow style, your documentation looks professional instead of cobbled together.</p><p>Treat screenshots like design assets, not disposable images.</p>]]></content:encoded></item><item><title><![CDATA[Tips to keep documentation code examples up to date]]></title><description><![CDATA[Separate code from text and automate testing to reduce maintenance]]></description><link>https://blog.techdocs.studio/p/how-to-keep-documentation-code-examples</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-keep-documentation-code-examples</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Fri, 30 Aug 2019 19:03:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e2631d02-9dce-468d-bcc4-0122dbda4c8d_3072x4608.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Code examples in docs rot. The SDK changes, nobody updates the examples, and users copy code that no longer works.</p><p>Here&#8217;s how to make code examples easier to maintain and test.</p><p><strong>Note: </strong>I&#8217;m using Sphinx here, but the principles apply to any documentation system.</p><h2>The problem with inline code</h2><p>Here&#8217;s a typical documentation page mixing code and text:</p><pre><code><code>
Example
=======

To order a pizza using the Python SDK, call the
``order`` method by passing the
pizzas you want, your customer ID, and the delivery
service as the parameters.

The following examples show you how to order a 
Hawaiian pizza to take away.

.. code-block:: python

    api = pizza.Api()

    api.order(
      pizzas=[
      {&#8217;code&#8217;:pizza.pizza_codes.HAWAIIAN, 
        &#8216;quantity&#8217;:1}
        ], 
        customer_id=&#8217;dgarcia360&#8217;, 
        serviceType=pizza.service_types.TAKE_AWAY)</code></code></pre><p>When the SDK updates, you have to:</p><ol><li><p>Find every affected example.</p></li><li><p>Copy/paste each one into a file.</p></li><li><p>Test it manually.</p></li><li><p>Update the docs.</p></li></ol><p>You can&#8217;t verify the code you tested is the same code displayed in the docs.</p><h2>Step 1: Separate code from text</h2><p>Move code examples to separate files:</p><pre><code><code>documentation-project/
&#9500;&#9472;&#9472; index.rst
&#9500;&#9472;&#9472; order.rst
&#9500;&#9472;&#9472; examples/
&#9474;   &#9500;&#9472;&#9472; javascript
&#9474;   &#9492;&#9472;&#9472; python
&#9474;       &#9500;&#9472;&#9472; order.py
&#9474;       &#9500;&#9472;&#9472; tests/
&#9474;       &#9492;&#9472;&#9472; requirements.txt</code></code></pre><p>Now you can:</p><ul><li><p>Run the code and add tests</p></li></ul><ul><li><p>Use linters to check formatting</p></li></ul><ul><li><p>Execute examples without copy/paste</p></li></ul><h2>Step 2: Import code into docs</h2><p>Use a directive like Sphinx&#8217;s <code>literalinclude</code> directive to render code files:</p><pre><code><code>
.. literalinclude:: examples/python/order.py
    :language: python</code></code></pre><h2>Step 3: Highlight code subsets</h2><p>Sometimes you only need part of a file. Use comment tags to mark sections:</p><pre><code><code>
# block 01
api = pizza.Api()
# endblock 01

# block 02
api.order(
    pizzas=[
        {&#8217;code&#8217;:pizza.pizza_codes.HAWAIIAN, 
        &#8216;quantity&#8217;:1}
    ], 
    customer_id=&#8217;dgarcia360&#8217;, 
    serviceType=pizza.service_types.TAKE_AWAY)
# endblock 02</code></code></pre><p>... and then, detect those tags with the help of the directive.</p><pre><code><code>.. literalinclude:: /pizza/order.py
    :language: python
    :start-after: # block 02
    :end-before: # endblock 02</code></code></pre><p>You can also use line numbers:</p><pre><code><code>.. literalinclude:: /pizza/order.py
    :language: python
    :lines: 10-15</code></code></pre><p>But line numbers break easily. Add one import statement at the top of the file and every line number shifts. Your docs now show the wrong code. Comment tags stay anchored to the code they mark, even when the file changes.</p><h2>The new update process</h2><p>When the SDK releases a new version:</p><p>1. Update dependencies in the examples folder.</p><p>2. Run the code and see what fails.</p><p>3. Fix the broken examples.</p><p>4. Push changes. Docs update automatically.</p><h2>The real benefit</h2><p>This doesn&#8217;t eliminate code example maintenance. It just makes it testable.</p><p>When your tests pass, your code examples work. When they fail, you know which examples broke and can fix them before users find out.</p><p>Separate the code, test it, import it into the docs. That&#8217;s the whole trick.</p>]]></content:encoded></item></channel></rss>