<?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>Sat, 09 May 2026 23:37: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[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>The team works in different languages, deals with different tools to extract code comments, and ends up with Doxygen output that looks vintage. The default HTML lives as a separate site with its own search, its own navigation, no easy way to make it match the rest of the docs. So even when they publish it, nobody reads it.</p><p>Here&#8217;s how we work around it.</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. It works across C++, Java, and a long list of other languages.</p><p>The problem is what comes out of the box. The HTML looks like it was built two decades ago. It can&#8217;t be styled to match your navigation. It uses its own search bar, separate from the main one users already know. It feels like a different product altogether.</p><p>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, just in a format you can do something 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>The big shift is control. You decide how the reference looks. You can hide internal helpers Doxygen would otherwise expose, like for example group classes by feature instead of file. Strip out the noise (private members, autogenerated boilerplate, deprecated APIs nobody uses) and only show what your users actually need. None of that is possible with the default HTML.</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. The tool isn&#8217;t. Doxygen still does the hardest part: extracting structured documentation from code.</p><p>Throw away the HTML. Keep the XML.</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. Others didn&#8217;t 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. Nobody re-runs examples after every release. The docs look fine. 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>&#8220;Our docs build takes 30 minutes.&#8221;</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 don&#8217;t wait half an hour to check if the formatting looks right.</p><p>Writers stop iterating. They batch changes into big updates instead of making frequent small improvements. Reviews slow down because nobody wants to trigger another long cycle just to see a preview.</p><p>The result: fewer updates, more errors that slip through, and a team that treats docs as something to avoid touching.</p><h2>Why this build was slow</h2><p>The project used Sphinx. The build produced both HTML and PDF outputs. Every build generated everything from scratch: the full HTML site and the complete PDF manual.</p><p>In this case, the PDF was the bottleneck. Sphinx uses LaTeX to produce PDFs, and LaTeX is slow. One monolithic PDF meant one monolithic build. Change a paragraph in the authentication guide and the system rebuilds a 1400-page PDF from scratch.</p><p>On top of that, the HTML and PDF builds ran sequentially. One waited for the other. So even if the HTML build was fast, the PDF blocked the whole pipeline.</p><h2>What we changed</h2><p>Two things:</p><p><strong>We split the PDF into chapters: </strong>Instead of generating one massive PDF, we configured Sphinx to produce separate PDFs per section. Authentication docs, API reference, deployment guide, each their own PDF.</p><p>Change the auth docs? Rebuild only that PDF. The rest stay untouched.</p><p><strong>We separated the HTML and PDF builds:</strong> They now run in parallel instead of sequentially. Writers can preview their HTML changes immediately 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 real impact isn&#8217;t the number. It&#8217;s what changed in the team&#8217;s behavior. Writers started verifying their changes again. Small fixes got pushed the same day instead of being batched for &#8220;next sprint.&#8221; Reviews got faster because previews were available in minutes.</p><p>The docs got better because the build time got out of the way.</p><p>Slow builds are a silent documentation killer. Nobody complains about them in sprint retros. But they quietly push teams away from touching the docs.</p><p>If your build takes more than 10 minutes, it&#8217;s worth investigating 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 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 actual rendered output.</p><p>Can&#8217;t 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 pray it&#8217;ll render well. </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 it did. So the &#8220;quick review&#8221; 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. </p><p>Style guides nobody follows because checking them is a chore &#8594; put linting in CI and suddenly everyone complies.</p><p>Broken link checks that never happen because clicking every link is tedious &#8594; automate it and they get caught before merge.</p><p>The step is important. We all agree it's important. We still skip it. Every time, the reason is the same: too much friction for the value it delivers in the moment.</p><p>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 of them were about commas. Two more about whether colons introducing lists should be bold or not. Another spent three paragraphs debating 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><strong>Why vague requests produce surface feedback</strong></h2><p>When you ask &#8220;can you review this?&#8221; without direction, people default to whatever stands out first.</p><p>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><strong>The cost of unfocused reviews</strong></h2><p>You spend hours sorting through comments that don&#8217;t help. Reviewers spend energy on things you&#8217;re going to ignore or fix a later phase. The real issues never get caught.</p><p>I&#8217;ve seen teams spend three review cycles debating admonition colors while nobody notices the registration flow is broken. Product and docs ships. Users can&#8217;t sign up. &#8220;But we had five people review it.&#8221;</p><p>Yeah, they reviewed the wrong things.</p><h2><strong>How to ask for useful feedback</strong></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><h2><strong>If you&#8217;re the one being asked to review</strong></h2><p>This works the other way too. Someone sends you &#8220;can you review this?&#8221; with no context.</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><h2><strong>See something else? Mention it. But stay focused.</strong></h2><p>If you spot a bug or broken link while reviewing, point it out. If something&#8217;s unclear, say so. Of course, leave things better than you found them. This isn&#8217;t about ignoring obvious problems.</p><p>But keep the ultimate goal in mind. If someone asked you to review the tutorial flow and you spend 15 minutes looking for oxford commas, you&#8217;ve lost the plot. Don&#8217;t forget what they actually needed.</p><p> Just don&#8217;t forget what they actually needed.</p><h2><strong>How to make this normal</strong></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>You can create simple templates:</p><p><strong>Review Request:</strong></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><strong>What this comes down to</strong></h2><p>Everybody wants to help. But without direction, it&#8217;s easy to loose 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.</p><p>Be specific. Point toward what matters. Call out what to ignore.</p><p>You&#8217;ll get faster reviews, better feedback, and fewer arguments about commas.</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. Analytics looked great. 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. Added code snippets where users expected them.</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 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. Contributors treat every comment as blocking.</p><p>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: no shared language for priority. And even when something clearly needs fixing, the comment doesn&#8217;t say what kind of fix. Is it 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></p><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. 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><ul><li><p><strong>Tagging doesn&#8217;t fix slow reviewers.</strong> If your team takes three days to look at PRs, tags won&#8217;t help. That&#8217;s a process problem.</p></li><li><p><strong>Tagging doesn&#8217;t fix bad feedback.</strong> <em>&#8220;(blocker, style): I don&#8217;t like this wording&#8221;</em> is still bad feedback. Add context. Explain why.</p></li><li><p><strong>Tagging doesn&#8217;t replace good judgment</strong>. A reviewer still needs to know what&#8217;s actually a blocker vs. a preference.</p></li></ul><h2>How to start</h2><p>Don&#8217;t overthink it. Start tagging your review comments this week.</p><p>Put the tag at the start of each comment. Make it 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. Others will copy you.</p><p>The system works because it forces one decision upfront: is this blocking or not?</p><p>Make that decision explicit. Stop wasting time 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.</p><p>Then things drift apart.</p><h2>The problem</h2><p>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>Deploys it. Forgets to update the docs.<br></p><p>Three weeks later, a user reads the documentation. No mention of <code>retry_attempts</code>. They assume the feature doesn&#8217;t exist. Or worse, they assume the default behavior and it breaks their setup.</p><p>Support ticket arrives.</p><p>This pattern repeats with every config change. Properties added, docs lag behind. Properties deprecated, docs still show them. Default values change, docs show old defaults. The same thing happens with API parameters, CLI flags, environment variables, 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. From it, generate code, docs, and everything else.</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, generate server code, client SDKs, API documentation, examples, interactive API explorers. The schema is your contract. Everything else derives from it.</p><p>An additional benefit: by decoupling the schema from actual code, you facilitate conversations about the contract. Teams can review and agree on the API structure before implementation.</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.</p><p>If no standard exists, you need to build the generators yourself, which could be a stopper if resources are limited.</p><h3>Approach 2: Annotate your code</h3><p>Add documentation as annotations directly in your code. 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 annotated code, generate the intermediate schema and 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. Stay consistent.</p><p>This approach is simpler than defining schemas, especially when you don&#8217;t have code generators available.</p><h2>How to implement it</h2><p><strong>Document your source of truth. </strong>Write your schema file or add annotations to your code. Include descriptions, types, defaults, constraints.</p><p>Be thorough. This is the single source. Everything generates from it.</p><p><strong>Choose your generator. </strong>Check if 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? <a href="https://sphinxcontrib-openapi.readthedocs.io/">Extension available</a>.</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><br>But if you need something specific (TypeScript docs in Antora, for example), you&#8217;ll need a custom solution.</p><blockquote><p><strong>Key tip for annotations:</strong> Always generate an intermediate schema file (JSON or YAML) first. Don&#8217;t try parse code annotations directly in your docs build. </p></blockquote><p>If you need a custom extension, that requires dev work. <a href="https://techdocs.studio/services/documentation-automation">We can help with that</a>.</p><p><strong>Add to CI. </strong>On every commit: validate the source, regenerate documentation, fail the build if validation fails. On merge: deploy updated documentation automatically.</p><h2>Start small</h2><p>You don&#8217;t need to generate everything on day one.</p><p>Start with one configuration file. Generate just the reference table. Keep 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 in guides). Keep step-by-step guides manual.</p><h2>The result</h2><p>Engineer adds a new parameter. Commits the code. The docs update automatically.</p><p>Three weeks later, a user reads the documentation. The parameter is there.</p><p>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. 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. 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. Update it as you find the AI producing results that miss the mark.</p><p>Use it for docs, marketing copy, support responses, tutorial content, 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. 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.</p><p>It became our single source of truth for &#8220;how we talk about this product.&#8221;</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. 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><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 complex description lists by default. You&#8217;ll likely need to write a custom extension or use a plugin.</p><p>Worth it for complex configurations. 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><strong>Use tables for:</strong></p><ul><li><p>Simple data (2-3 columns)</p></li><li><p>Short descriptions</p></li><li><p>Uniform properties (all have same fields)</p></li></ul><p><strong>Use description lists for:</strong></p><ul><li><p>Complex properties with multiple options</p></li><li><p>Long explanations</p></li><li><p>Properties with different fields (some required, some with defaults, some with neither)</p></li></ul><p>Now, you have another tool in your chest to enhance your documentation. 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, adds it to the docs. Three months later the UI changes. Nobody can find the original. Nobody knows how it was edited. Someone creates a new screenshot that looks completely different from 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.</p><p>Stop editing screenshots in your OS image editor. Use Figma or Draw.io instead. 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, choose your 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;: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="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" 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>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 becomes outdated, replace the base image and reuse your existing highlights and arrows. No 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 doesn&#8217;t prevent 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 all your screenshots use 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>Documentation code examples break. The SDK changes. Nobody updates the examples. Users copy broken code and get frustrated.</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 code from docs, test it, and import it. That&#8217;s it.</p>]]></content:encoded></item></channel></rss>