<?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]]></title><description><![CDATA[Subscribe if technical documentation is your problem.]]></description><link>https://blog.techdocs.studio</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</title><link>https://blog.techdocs.studio</link></image><generator>Substack</generator><lastBuildDate>Fri, 17 Jul 2026 19:04:48 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[How we onboard new hires with codelabs]]></title><description><![CDATA[One-to-one onboarding doesn't scale. Codelabs do.]]></description><link>https://blog.techdocs.studio/p/how-we-onboard-new-hires-with-codelabs</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-we-onboard-new-hires-with-codelabs</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 02 Jul 2026 12:18:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/22d5a1d9-3923-4d10-9d6c-355f70882247_5417x3612.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When a new person joins the company, the default onboarding plan is another person. Someone senior sits with them, walks them through the first setup, answers questions, points them at the right places to start. It works. But also, it doesn&#8217;t scale.</p><p>Every new hire pulls a person off their own work for days. The quality of the onboarding depends on who happens to be free that week and how good they are at explaining things. Two people who join the same month get completely different starts. And whoever onboards them spends the same afternoon explaining the same process they covered last month.</p><p>I led a <a href="https://blog.techdocs.studio/p/codelabs-are-the-internal-docs-your">codelabs program</a> at a large enterprise to fix exactly this. Here&#8217;s the thinking behind it.</p><h2>One-to-one teaching doesn&#8217;t scale, and it isn&#8217;t consistent</h2><p>The problem with pairing isn&#8217;t that it&#8217;s ineffective. It&#8217;s that it&#8217;s expensive and uneven.</p><p>The cost is obvious: senior time is the scarcest resource on any team, and onboarding spends a lot of it. The unevenness is the quieter problem. When the lesson lives in a person&#8217;s head, every delivery comes out a little different. One mentor remembers to explain a key step, another forgets. One walks through the whole process, another says &#8220;you&#8217;ll pick it up.&#8221; New hires end up with different mental models of the same system, and the gaps show up months later.</p><p>Codelabs move the lesson out of the mentor&#8217;s head and into something repeatable. The senior person&#8217;s knowledge gets captured once, and every new hire works through the same path. Mentors are still there for the hard questions, but they&#8217;re not re-teaching the basics every time someone joins.</p><h2>Start with the use cases new hires actually hit</h2><p>It&#8217;s tempting to document the whole system. We didn&#8217;t. We started by listing what a new hire actually has to do in their first weeks, the real tasks, not the org chart.</p><p>These were the core workflows they'd run no matter which team they landed on, the end-to-end processes that touch several systems at once. They're also the steps that cross team boundaries, which is exactly where <a href="https://blog.techdocs.studio/p/codelabs-are-the-internal-docs-your">reference docs leave gaps</a>.</p><p>A handful of codelabs covering the most common first-month tasks does most of the work. We weren&#8217;t trying to teach the whole system. We were getting people through the paths they&#8217;d actually walk in their first weeks.</p><h2>Build each one the same way</h2><p>Every codelab in the program followed the same anatomy: a real scenario, one golden path, a starting point, checkpoints along the way, and a reference solution to compare against.</p><p>Consistency matters at scale. When a thousand people go through the same set of exercises, the structure has to be predictable, and the quality can't depend on who wrote which one. I wrote about <a href="https://blog.techdocs.studio/p/anatomy-of-a-good-codelab">what makes a good codelab</a> in a previous post.</p><h2>What changed</h2><p>The first task stopped being a three-week ordeal. New hires went from an empty starting point to shipping something real on their own, without waiting to catch a senior person at a free moment.</p><p>Mentors got their time back. And because everyone worked through the same exercises, the team finally had a shared baseline. When someone said &#8220;I did the onboarding codelab,&#8221; everyone knew exactly what they&#8217;d learned.</p><p>Onboarding stopped being a tax on our best people. It became something the system could absorb at scale.</p>]]></content:encoded></item><item><title><![CDATA[Anatomy of a good codelab]]></title><description><![CDATA[The parts that separate a codelab from a tutorial nobody finishes.]]></description><link>https://blog.techdocs.studio/p/codelabs-best-practices</link><guid isPermaLink="false">https://blog.techdocs.studio/p/codelabs-best-practices</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 24 Jun 2026 13:04:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/de6bd433-da3c-45c0-a1ce-08b72c45c30c_4096x2731.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I led the <a href="https://blog.techdocs.studio/p/codelabs-are-the-internal-docs-your">codelabs initiative</a> at a large enterprise, building exercises across different technologies and skill levels: onboarding for new hires through to advanced material, spanning development frameworks, tooling, and infrastructure. The ones that worked all shared the same handful of parts. The weak first drafts were usually missing two or three of them.</p><p>A codelab is a guided exercise to learn how to build something real. Not a tutorial that demonstrates one feature or a reference page covering all the available options. It takes a learner from an empty starting point to a working result, using the tools and conventions of the team they&#8217;re joining.</p><p>I made the case for <a href="https://blog.techdocs.studio/p/codelabs-are-the-internal-docs-your">why codelabs are the internal docs most teams are missing</a> in an earlier post. This one is about how to build a good one. Here&#8217;s what makes them work.</p><h2>Start with a scenario, not a feature</h2><p>The strongest codelabs open with a real task. &#8220;Build a service that handles webhook events from our payment provider&#8221; pulls the learner through decisions, sequencing, and tool choices the way real work does. &#8220;Learn how to use the webhook library&#8221; doesn&#8217;t. It teaches a feature in isolation, and features taught in isolation never leave the codelab.</p><p>A quick test: if the title sounds like a generic heading it could live in your product docs to cover different use cases, the scenario is too narrow.</p><h2>Pick one golden path</h2><p>A codelab is not reference documentation. It shouldn&#8217;t explain every option and every alternative. Pick the one path that solves the main use case and walk the learner down it.</p><p>Real projects work this way too. You don&#8217;t implement your data layer in five databases so the team can choose later. You pick Postgres because of a specific reason and move on.</p><p>A codelab should make the same kind of decision. If there&#8217;s a meaningful alternative worth knowing about, mention it in a line and link out, but don&#8217;t fork the exercise to cover it. Every branch you add is another place to get lost.</p><h2>Hand them a starter repository</h2><p>Nobody should be setting up a project from scratch before they can begin. The starter repo carries the boilerplate, the dependencies, the config, and clear placeholders for the work ahead.</p><p>Setting up an environment is a different skill from learning a workflow, and mixing the two means the learner burns an hour debugging dependencies before they reach anything you wanted to teach.</p><h2>Build in checkpoints</h2><p>Every step needs a single goal and a way to confirm it worked. &#8220;Your service should now respond to a test webhook with a 200.&#8221; That way the learner knows they&#8217;re on track instead of discovering at the end that something broke back at step three.</p><p>Without checkpoints, a codelab becomes click-through-and-hope. People reach the end without being sure what they were meant to learn, which means they didn&#8217;t learn it.</p><h2>Give them something to compare against</h2><p>When they finish, the learner should be able to hold their work up against a reference implementation. Not just to check it runs, but to see what the senior-engineer version of the same task looks like to be able to compare. This is half the value of a codelab, and over time you build up a showcase of sample projects that follow your best practices.</p><h2>Where good codelabs go wrong</h2><p>The most common failure is drift: the underlying tools change, the codelab doesn&#8217;t, and now it teaches an API that no longer exists. Codelabs need an owner and a reason to get updated.</p><p>The other two failures pull in opposite directions. Too easy, and a new hire breezes through without ever getting stuck, which means it never prepared them for anything. Too long, and they stop. Anything past a couple of hours probably wants to be a few smaller codelabs in a sequence.</p><p>Build it the way you'd want to learn the workflow yourself. One scenario, one golden path, a starter repo, checkpoints, and a reference to compare against.</p>]]></content:encoded></item><item><title><![CDATA[Codelabs are the internal docs your engineers are missing]]></title><description><![CDATA[Every team documents its own product. Nobody documents how they connect.]]></description><link>https://blog.techdocs.studio/p/codelabs-are-the-internal-docs-your</link><guid isPermaLink="false">https://blog.techdocs.studio/p/codelabs-are-the-internal-docs-your</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Fri, 19 Jun 2026 11:32:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5042de41-5915-462c-b72b-28b6a168fc16_5184x3456.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most internal documentation is organized by team. Each team owns the docs for its own service, which makes sense for ownership.</p><p>It breaks down the moment someone has to ship something. To deploy a new service, an engineer has to call the auth service, get a token, call the payments service, handle the webhook, and wire it into the deployment pipeline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eiHV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eiHV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png 424w, https://substackcdn.com/image/fetch/$s_!eiHV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png 848w, https://substackcdn.com/image/fetch/$s_!eiHV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png 1272w, https://substackcdn.com/image/fetch/$s_!eiHV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eiHV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png" width="1390" height="770" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:770,&quot;width&quot;:1390,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96612,&quot;alt&quot;:&quot;&quot;,&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/198271924?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!eiHV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png 424w, https://substackcdn.com/image/fetch/$s_!eiHV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png 848w, https://substackcdn.com/image/fetch/$s_!eiHV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.png 1272w, https://substackcdn.com/image/fetch/$s_!eiHV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccc2c8cc-2149-4266-a33e-93d1d45c3ca7_1390x770.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>No single team&#8217;s docs cover the full sequence. The pieces are documented, but the connection between them isn&#8217;t.</p><h2>What gets lost between docs</h2><p>The integration patterns that connect one team&#8217;s product to another&#8217;s live in the heads of senior engineers. They learned them from pairing, from code review, from mistakes shipped to production. The knowledge is there, but it&#8217;s never written down because no team owns it.</p><p>Per-team docs don&#8217;t fix this. The auth team can&#8217;t write about how their service gets used inside the payments flow without overstepping, and the payments team can&#8217;t document the auth integration without speaking for another team. So nobody does.</p><p>The unwritten rules and best practices stay unwritten for the same reason. &#8220;Always wrap external calls in the retry helper.&#8221; Nobody owns that either, so it lives in code review comments and gets passed on by correction, not documentation.</p><h2>Codelabs cover the seams</h2><p>A codelab is a step-by-step exercise that walks an engineer through building something real. A starter repository, a scenario, the steps to get from empty to working, and a reference implementation to compare against.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kymz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kymz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!Kymz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!Kymz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!Kymz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kymz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52a01855-3a98-4317-86cb-821f958f74a9_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;:540456,&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/198271924?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_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_!Kymz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!Kymz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!Kymz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!Kymz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a01855-3a98-4317-86cb-821f958f74a9_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></figure></div><p>What makes them work as internal docs is that they&#8217;re scenario-first, not product-first. A codelab pulls in whichever services the scenario requires.</p><p>A codelab on &#8220;build a service that handles webhook events from our payment provider&#8221; uses three or four internal products in one exercise. By the end, the engineer knows not just what each product does, but how they fit together in the way your company actually builds.</p><h2>Where to start</h2><p>If your engineers are slow to ramp up and each team&#8217;s docs look fine, the gap is probably between them. This is where a codelab earns its keep. </p><p>Pick the cross-team scenario new hires hit first, the one that usually means three weeks of asking around, and build a codelab that walks through it end to end. Keep it current as the services change.</p><p>You don&#8217;t need many. A handful covering the workflows people actually run does most of the work. The goal isn&#8217;t a codelab for everything, it&#8217;s getting people through the paths they&#8217;ll actually walk.</p>]]></content:encoded></item><item><title><![CDATA[How we scope large docs migrations]]></title><description><![CDATA[Plan less, learn from one product, then scale.]]></description><link>https://blog.techdocs.studio/p/how-we-scope-large-docs-migrations</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-we-scope-large-docs-migrations</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 09 Jun 2026 13:20:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/17b27eef-4da6-4aed-a451-fe645fe08054_900x599.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Migrating 30,000 pages of Confluence to Markdown sounds simple: pick the format, run a converter, deploy.</p><p>It rarely goes that way. Plans built on assumptions break the moment real content meets the new platform.</p><p>That&#8217;s why we don&#8217;t quote large migrations up front. We pilot first.</p><h2>Why a pilot first</h2><p>Planning a full migration up front assumes you can predict what the work will look like. You can&#8217;t. Not at this scale, not with content this varied.</p><p>A pilot surfaces what the plan can&#8217;t see: the issues that only appear once real content meets the real platform. Some look like minor rendering bugs. Others reshape the whole approach.<br><br>So we migrate one slice end to end. That slice might be one product in a multi-product migration, one section of a large doc set, or a single content type. The shape of the project decides the unit.</p><p>That&#8217;s enough to know what the next slice will cost, what the rest will cost, and where the work is most likely to slip.</p><h2>Picking the right pilot</h2><p>The slice you pick decides whether the pilot is worth running. The temptation is to start with the easiest one: smallest content, simplest structure, friendliest team. Those pilots ship smoothly and teach you nothing about the rest. Pick something closer to the average instead.</p><p>Give the pilot a deadline too. Without one, it stops being a pilot and turns into the project itself, and you lose the reason you ran it in the first place.</p><p>And when leadership wants the full scope committed before any work starts, plan with the pilot in mind. Run one slice through the full workflow first, then narrow the estimate as the project takes shape.</p><h2>Evidence over estimates</h2><p>Most migration projects fail in scope-setting, not in execution. The pilot is how we set scope honestly. The estimate we give for the full project is the one we earned by doing part of it.</p><p>Ship one, then scale. You&#8217;ll learn more from one migrated slice than from any plan.</p>]]></content:encoded></item><item><title><![CDATA[Nobody plans for redirects]]></title><description><![CDATA[Until users can't find anything, partners complain, and Google traffic disappears.]]></description><link>https://blog.techdocs.studio/p/nobody-plans-for-redirects</link><guid isPermaLink="false">https://blog.techdocs.studio/p/nobody-plans-for-redirects</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Mon, 11 May 2026 13:05:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ae65bd8e-34be-4d61-a5c4-1df7eae7be77_3683x4604.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We were running a content audit for a client preparing to migrate their docs to a new platform. Standard work: pull every published URL into a spreadsheet, group by section, flag what to keep, what to merge, what to drop.</p><p>Then we cross-referenced their analytics. A handful of old URLs were responsible for most of the search traffic to the site. Pages that had ranked well for years, that partners linked to, that customers had bookmarked. None of those URLs would exist on the new site.</p><p>If we&#8217;d launched without a redirect plan, they would have lost months of search traffic overnight. Customer bookmarks would break. Partner integrations would point to dead pages.</p><p>Most of the energy in a migration goes into the new platform. What it looks like, how it&#8217;s organized, what tech stack to use, where to host it&#8230; The old URLs barely come up. </p><p>But you&#8217;re not just moving content. You&#8217;re moving content that other people have linked to, in places you don&#8217;t control. Search engines, partner sites, support emails, bookmarks, internal wikis. You can&#8217;t update any of those. The only thing you can do is make sure the URLs they point to still resolve.</p><p>So if you&#8217;re planning a docs migration, ask one question: what happens to every existing URL?</p><p>Whether you&#8217;re reviewing a plan from a vendor or running the project internally, this is the check that matters. If nobody on the team can answer it, redirects aren&#8217;t going to happen. They&#8217;ll get pushed to &#8220;after launch&#8221; and never come back.</p><p>The new site can be perfect. But every old URL that breaks costs you traffic, support tickets, and a bit of trust.</p>]]></content:encoded></item><item><title><![CDATA[Why we still use Doxygen (just not the way you think)]]></title><description><![CDATA[Doxygen isn't dead. Here's how we turn it into docs users actually read.]]></description><link>https://blog.techdocs.studio/p/why-we-still-use-doxygen-just-not</link><guid isPermaLink="false">https://blog.techdocs.studio/p/why-we-still-use-doxygen-just-not</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 05 May 2026 13:03:57 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9ae13009-1feb-429e-9a30-13324092a3fc_4000x6000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last month at a Write the Docs Barcelona meetup, someone asked me: <em>&#8220;Do you see tools like Doxygen going out of style?&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xLs1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xLs1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xLs1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:767742,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/196132097?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xLs1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!xLs1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfc61c1-52c2-4114-8c45-51787ba79d78_3024x1714.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Default Doxygen output</figcaption></figure></div><p>It&#8217;s a fair question. Doxygen&#8217;s default output looks vintage, and most people who land on it don&#8217;t stick around.</p><h2>The problem isn&#8217;t Doxygen</h2><p>Doxygen is great at the part most people don&#8217;t want to do themselves: parsing code comments and extracting structured information. Class hierarchies, function signatures, parameter descriptions, return types, defaults.<br><br>The problem is what comes out of the box. The HTML looks like it was built two decades ago, and it lives as a separate site with its own search, disconnected from the docs users already know. It feels like a different product altogether.<br><br>So engineers close the tab. Writers stop pushing for it. The reference docs either don&#8217;t get published, or they get published and nobody reads them. Neither is good.</p><h2>Use Doxygen as a parser, not a publisher</h2><p>Doxygen also generates XML alongside HTML. Same structured data, in a format you can actually work with.</p><p>From that XML you can produce markdown, RST, or whatever format your docs platform expects. The API reference becomes part of your docs instead of a separate site bolted on. Sphinx, Docusaurus, Antora, MkDocs, whatever you&#8217;re already using.</p><p>We did this for ScyllaDB&#8217;s Driver docs. Built a custom extension that consumed the Doxygen XML and rendered it as native Sphinx pages.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LENn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LENn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!LENn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!LENn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!LENn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LENn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:425315,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/196132097?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LENn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!LENn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!LENn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!LENn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be61970-7b37-4704-8e76-95f2a442bd8e_3024x1714.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Doxygen output with a custom Sphinx extension</figcaption></figure></div><p>The API reference now looks like every other page on the site. Same theme, same navigation, same search. When the team adds new libraries, the reference updates from the comments in the code, automatically. </p><p>The downside is that you have to write the extension if one doesn&#8217;t exist for your platform. But that&#8217;s a one-time effort, and the alternative is maintaining reference docs by hand and watching them go stale every release.</p><h2>Why this matters more now</h2><p>Structured API reference is also exactly what AI agents need to write correct code. When an agent has to know what parameters a function takes, or what its return type is, the reference is more reliable than any tutorial. It comes straight from the source.</p><p>Doxygen&#8217;s XML already contains all of that. Publishing it properly means it&#8217;s useful for both humans and AI, not just one or the other.</p><h2>So is Doxygen going out of style?</h2><p>The template is, but the tool isn&#8217;t. Doxygen still does the hardest part: extracting structured documentation from code.</p>]]></content:encoded></item><item><title><![CDATA[15 tips for better AI answers from your docs]]></title><description><![CDATA[What we tell companies after they add an AI chatbot, MCP server, or internal AI assistant to their documentation.]]></description><link>https://blog.techdocs.studio/p/15-tips-for-better-ai-answers-from</link><guid isPermaLink="false">https://blog.techdocs.studio/p/15-tips-for-better-ai-answers-from</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 22 Apr 2026 12:04:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2df755db-74dc-4f03-ae5f-5324bf4dac5b_5472x3648.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We&#8217;ve helped companies add AI chatbots and MCP servers to their documentation for the past two years. We also built <a href="https://biel.ai">Biel.ai</a>, so we&#8217;ve seen this from both sides: as consultants and as builders. After every deployment, the same question comes up: <em>&#8220;How do we improve the quality of the answers?&#8221;</em></p><p>Most of the tips below apply to human readers too. But they become critical when AI is retrieving your content, because the retrieval layer introduces a bottleneck. Before the LLM ever sees your content, a search or chunking system decides what to surface. A human can scan a page, skip irrelevant sections, and piece together an answer from context. A retrieval pipeline pulls a chunk and passes it forward with no such flexibility.</p><p>Here&#8217;s what we recommend:</p><h2>1. Every page is page one</h2><p>This was good advice before AI. Now it&#8217;s essential. Anyone landing on a page from a search result, a link, or an AI retrieval should understand what they&#8217;re reading without having seen any other page first.</p><p>Write each page so it makes sense on its own. If a page assumes the reader already knows something from a previous page, add a short explanation or a link to the prerequisite.</p><h2>2. Think in questions</h2><p>Users ask chatbots questions. &#8220;How do I authenticate?&#8221; &#8220;How do I export data?&#8221; &#8220;What happens if my token expires?&#8221;<br><br>Your docs don&#8217;t need to be written in question format. But the answers to these questions need to be there. Make sure your docs cover what users actually ask, not just what your team thinks is important. If you already have a chatbot running, check the logs. The questions that come up most should be clearly answered somewhere in your docs.</p><h2>3. Show complete code examples</h2><p>Include the full picture: imports, configuration, file paths. Humans can infer that they need to import a library if they&#8217;ve seen it before. A retrieval system often surfaces a single code block without the surrounding context, so the LLM has no way to fill in what&#8217;s missing.</p><h2>4. Use consistent terminology</h2><p>Pick one term per concept and stick with it. If you call it &#8220;token&#8221; in one place and &#8220;API key&#8221; in another, the retrieval layer might not connect them.  LLMs are actually good at resolving synonyms within a chunk, so the real risk here is at the retrieval stage: inconsistent terms mean the right content never gets surfaced in the first place. Consistent terminology helps both retrieval and readability.</p><h2>5. Less is more</h2><p>Some teams try to feed everything into their chatbot: blog posts, release notes, marketing pages, changelog entries. This creates noise. When the chatbot has to search through outdated blog posts and marketing copy alongside current documentation, the odds of returning the wrong content go up.</p><p>Keep the training scope focused on current, maintained documentation. Everything else is noise that makes answers worse.</p><h2>6. Avoid JavaScript-heavy rendering</h2><p>If your docs site relies on client-side JavaScript to render content, some crawlers and ingestion pipelines can&#8217;t read it. Check that your content is accessible without JavaScript enabled.</p><h2>7. Use keywords and metadata</h2><p>Add tags, page descriptions, and front matter metadata to every page. Tags are especially useful for synonyms. If your docs use &#8220;token&#8221; but users also call it &#8220;API key&#8221; or &#8220;credential,&#8221; adding those as keywords helps retrieval systems match the right content.</p><h2>8. Describe images in text</h2><p>Not all AI systems can read images. If you have a screenshot showing a configuration panel, describe the key information in text near the image or using the alt text option. Same for diagrams, flowcharts, and videos.</p><h2>9. One chatbot or many?</h2><p>If your company has multiple products, think carefully about how to scope your chatbot. A single chatbot trained on everything tends to mix context between products and give confused answers.</p><p>That said, separate chatbots per product aren&#8217;t always the right call. If your products share APIs, concepts, or workflows, a single chatbot with good metadata and scoping rules can handle cross-product questions better than siloed bots that can&#8217;t reference each other. The key is reducing noise without cutting off useful context.</p><p>If you&#8217;re using MCP servers, set up separate servers per product and configure rules for when to use each one.</p><h2>10. Keep content up to date</h2><p>Stale docs produce wrong answers. When the product ships a new version, the docs need to follow.</p><p>This was always true, but now the consequences are more immediate. A chatbot trained on outdated content will confidently give the wrong answer, and users won&#8217;t know it&#8217;s wrong because it sounds authoritative.</p><h2>11. Build an evaluation set</h2><p>Create a list of 10 to 25 real user questions. Run them through your chatbot. Grade the answers. This gives you a baseline to measure improvements against.</p><p>Update the evaluation set as you learn what users actually ask. The questions you thought were important might not be the ones users care about.</p><h2>12. Sandbox before deploying</h2><p>Set up a staging chatbot alongside your production one. Test changes, new content, and prompt adjustments in staging first. Catch issues before users do.</p><h2>13. Track what the chatbot can&#8217;t answer</h2><p>This is the most valuable data you&#8217;ll get. Every time the chatbot says &#8220;I don&#8217;t have enough information,&#8221; that&#8217;s a documentation gap. Log these. Review them weekly.</p><p>These gaps become your docs roadmap. If users ask about webhook security and your chatbot can&#8217;t answer, that&#8217;s the next guide to write.</p><h2>14. Choose a flexible platform</h2><p>Technology is advancing fast. If your chatbot platform doesn&#8217;t let you configure which model to use, adjust prompts, or add restrictions, you&#8217;ll be stuck when things change. Pick a platform that gives you that flexibility.</p><h2>15. Don&#8217;t wait for perfect docs</h2><p>The biggest mistake we see is teams spending months preparing their docs before launching an AI chatbot. They follow every best practice, theorize about what users will ask, and wait until everything is &#8220;ready.&#8221;</p><p>Then they launch and discover the same gaps they would have found on day one.</p><p>Deploy early. See what users actually ask. Document the gaps. Watch the answers improve. Repeat. Your users will tell you what's missing faster than any internal review will.</p>]]></content:encoded></item><item><title><![CDATA[How to make your docs discoverable to AI agents]]></title><description><![CDATA[The basics that cover 90% of the work, plus what to do if you want to push further.]]></description><link>https://blog.techdocs.studio/p/how-to-make-your-docs-discoverable</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-make-your-docs-discoverable</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 16 Apr 2026 10:33:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/29f0a494-7a33-4068-ab3b-c35365c4694b_5980x3665.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Mintlify reported earlier this year that <a href="https://www.mintlify.com/blog/ai-traffic">almost half of documentation site traffic</a> now comes from AI, not humans. Claude Code, Cursor, Copilot. They crawl docs to answer developer questions.</p><p>Most docs sites are not set up for this. Some block AI crawlers by default in r<code>obots.txt</code> and don&#8217;t know it. Others rely on JavaScript rendering that crawlers can&#8217;t see. Others have great content that buries the answer under three paragraphs of context.</p><p>Here&#8217;s what we&#8217;ve been testing and fixing across consulting projects.</p><h2>Four tests to run now</h2><h3>Test 1: is your site crawlable without JavaScript?</h3><p>Open your docs in a fresh browser. Disable JavaScript. Reload.</p><p>If the page loads and the content is readable, AI crawlers can probably read it too. If not, you have a problem. Most crawlers don&#8217;t execute JavaScript. They see what curl sees.</p><p>You can also test directly:</p><pre><code><code>curl -A "ClaudeBot" https://your-docs.com/getting-started</code></code></pre><p>If the response is a mostly empty HTML shell with a &lt;script&gt; tag, AI crawlers are getting the same empty shell.</p><h3>Test 2: is your robots.txt blocking AI crawlers?</h3><p>Check https://your-docs.com/robots.txt for these user agents:</p><pre><code><code>GPTBot        # OpenAI
ClaudeBot     # Anthropic
PerplexityBot # Perplexity
CCBot         # Common Crawl (used by many LLMs)
Google-Extended # Google's AI training bot</code></code></pre><p>If any of these are disallowed, AI crawlers are skipping your site. Some CDNs and hosting platforms block AI bots by default as part of &#8220;bot protection&#8221; settings. Worth checking.</p><h3>Test 3: do you rank for questions users actually ask?</h3><p>Pick three questions a developer might ask about your product. Google them with your company name.</p><p>Example: <code>"biel.ai create account"</code>, <code>"biel.ai docusaurus install"</code>, <code>"biel.ai customize widget"</code></p><p>If you don&#8217;t rank in the first results, AI probably can&#8217;t find you either. AI retrieval uses the same signals as search engines, weighted differently. This applies both to live retrieval (what ChatGPT and Claude Code query in real time) and to training data (what the models learned from). No Google ranking usually means no AI ranking in either case.</p><h3>Test 4: does your docs answer common questions up front?</h3><p>Pick three common questions users ask about your product. Open the relevant docs page for each.</p><p>Is the answer on the page? Is it in the first paragraph, or buried three paragraphs deep?</p><p>AI agents retrieve a chunk of content and return an answer based on it. If your page opens with context before the answer, the agent will summarize the context instead. If the answer is missing entirely, the agent will either hallucinate or say it doesn&#8217;t know.</p><h2>The 90%: indexable + useful + popular</h2><p>Those four tests measure three things:</p><ul><li><p><strong>Indexable: </strong>can AI crawlers access your content?</p></li><li><p><strong>Useful: </strong>does your content answer what users ask?</p></li><li><p><strong>Popular: </strong>is your content referenced by high-signal sources?</p></li></ul><p>Cover these three and you&#8217;ve done 90% of the work.</p><h2>The 10%: extra credit</h2><p>We can&#8217;t know exactly which retrieval methods each AI system uses. The more signals we provide, the more discoverable our content becomes. If you&#8217;ve covered the basics and want to push further, here&#8217;s what to add.</p><p><strong>Publish an </strong><code>llms.txt</code><strong> file.</strong> Like <code>sitemap.xml</code> but for LLMs. A plain text file at your site root describing what your documentation contains and how it&#8217;s organized.</p><pre><code># Biel.ai Docs
&gt; AI chatbot for technical documentation

## Getting Started
- [Install in Docusaurus](https://docs.biel.ai/docusaurus)
- [Install in MkDocs](https://docs.biel.ai/mkdocs)

## API Reference
- [Authentication](https://docs.biel.ai/api/auth)</code></pre><p>Still emerging, still evolving, but increasingly supported.</p><p><strong>Serve markdown URLs.</strong> Crawlers and agents work best with clean markdown over bloated HTML. You can serve the same page at .md for a cleaner, token-efficient version. Example: yoursite.com/api.md instead of making them parse your HTML, CSS, navigation, and cookie banner.</p><p><strong>Structured data and metadata.</strong> Add Schema.org markup for pricing, FAQs, and product info. Keep Open Graph tags and meta descriptions accurate. Use page metadata to describe what each page is about, including keywords and synonyms for concepts users might call by different names (e.g. &#8220;asset&#8221; vs &#8220;token&#8221;).</p><p><strong>Publish machine-readable schemas. </strong>Make your OpenAPI specs publicly available. Same for GraphQL schemas, Protocol Buffers, or any structured contract your API exposes. Agents can parse these directly, no HTML scraping needed.</p><h2>Measure where you stand</h2><p><a href="https://buildwithfern.com/agent-score">Fern&#8217;s Agent Score</a> evaluates your docs against 22 checks covering most of the above. You get a grade and a list of issues, and a prompt you can paste into Claude Code to fix them automatically.</p><p>We ran it on our own docs and got a <strong>C </strong>on the first run. As they say, &#8220;the shoemaker&#8217;s son always goes barefoot&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jQZX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jQZX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 424w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 848w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1272w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jQZX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png" width="1456" height="873" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:873,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133640,&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/194386309?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.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_!jQZX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 424w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 848w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1272w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.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>But this didn&#8217;t stop <a href="https://biel.ai">Biel.ai</a> from ranking first when asking ChatGPT for the <strong>best AI chatbot for Docusaurus</strong>. Because we focused on the basics 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_!D2kW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D2kW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 424w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 848w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1272w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D2kW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png" width="1456" height="827" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:827,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173852,&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/194386309?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.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_!D2kW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 424w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 848w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1272w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.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><h2>Start with the basics</h2><p>The 90% is where most of the value is. Be crawlable, improve the quality of your docs, make them popular. The extra 10% is worth doing if you&#8217;re already in good shape, but don&#8217;t skip the basics to chase it.</p><p>Most docs teams are still catching up. Start with the basics now and your docs will be easier to find when everyone else is still figuring it out.</p>]]></content:encoded></item><item><title><![CDATA[We tried following a client's getting started guide]]></title><description><![CDATA[Half the code examples didn't compile.]]></description><link>https://blog.techdocs.studio/p/we-tried-following-a-clients-getting</link><guid isPermaLink="false">https://blog.techdocs.studio/p/we-tried-following-a-clients-getting</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 25 Mar 2026 14:03:46 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/791d95b5-acad-4c95-a2bc-bbfada457147_3505x2663.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week a client asked us to review their getting started module. The manual installation section was deeply technical: lots of steps, lots of code blocks, lots of commands to run in sequence.</p><p>We started following it. Within a few minutes, we had our answer. Some steps worked fine, but others didn&#8217;t even compile. One snippet referenced a method that no longer existed. Another used a dependency version from two releases ago.</p><p>The client didn&#8217;t know. The page looked great. Clean formatting, syntax highlighting, clear explanations between each code block. Nothing about it screamed &#8220;broken&#8221;, you had to actually run the code to find out.</p><p>This is what happens when code lives in Markdown files, disconnected from any build process. The docs look fine, but they just don&#8217;t work anymore.</p><h2>Keep examples in a project, not in your docs</h2><p>The fix: stop pasting code into Markdown files. Instead, keep your examples in a separate project that actually compiles.</p><p>The project lives in its own folder near the docs, with real dependencies, a real build step, and version control. Your docs import snippets from this project instead of containing them directly. When the product releases a new version, you update the project. If a snippet breaks, the build fails. You find out before your users do.</p><p>You can also version your examples properly. Need docs for v2 and v3? The project has branches for each. You bump the dependency, run the build, and know immediately what still works.</p><p>Once we set this up for the client, updating code examples stopped being scary. It went from editing a Markdown file and hoping it still worked to making a code change with a build. New users following the getting started guide actually got to the end.</p><p>It does mean maintaining a project alongside your docs. But the alternative is finding out your examples are broken when a user does.</p><div><hr></div><p>If you want the practical details on how to set this up, I wrote a <a href="https://blog.techdocs.studio/p/how-to-keep-documentation-code-examples">step-by-step guide</a> a few years ago.</p>]]></content:encoded></item><item><title><![CDATA[Docs are fuel for AI. Not every company sees it that way.]]></title><description><![CDATA[While some companies eliminate their entire docs team, others are doubling down.]]></description><link>https://blog.techdocs.studio/p/docs-are-fuel-for-ai-not-every-company</link><guid isPermaLink="false">https://blog.techdocs.studio/p/docs-are-fuel-for-ai-not-every-company</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 19 Mar 2026 14:02:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ca481b3f-26f9-4c18-907d-4f59df8b8886_3240x2160.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week, a major data platform eliminated its dedicated documentation team. Around 70 writers, gone. Last year, a well-known design tool made similar cuts after telling employees to use AI tools wherever possible. (I&#8217;m not naming companies here, but both layoffs were publicly reported and widely discussed in tech writing circles.)</p><p>Across the industry, when companies need to reduce headcount, documentation teams are among the first on the list. Sometimes to cut costs, sometimes to justify AI investment. But the stated logic tends to be the same: AI can write docs now, so why pay people to do it?</p><p>Not every company is moving in this direction. And the ones that aren&#8217;t have a very different theory about what documentation is for.</p><h2>The companies cutting writers</h2><p>There are AI agents that detect code changes and draft doc updates. Tools that generate release notes, changelog entries, and API references from code and product specs. They&#8217;re fast, and for companies shipping quickly, that speed is a real advantage. On paper, you no longer need a dedicated team for this.</p><p>The question isn&#8217;t whether AI can produce docs. It&#8217;s whether it can maintain them, structure them, and make them useful over time without someone thinking about that full-time.</p><p>In practice, documentation gets reassigned to engineers or product managers, who use AI to draft it. In theory, it works. In reality, developers have already absorbed testing, infrastructure as code, CI/CD, on-call. Now add docs strategist to the pile. They have more on their plate, not less. Docs get written when there&#8217;s time, which is rarely.</p><p>Nobody reviews whether the content actually helps a user get from A to B. Nobody maintains the getting started guide when the SDK changes. Nobody decides what shouldn&#8217;t be documented.</p><p>And to be fair, there&#8217;s a real argument that the people who build the thing should document the thing. I don&#8217;t disagree. We&#8217;ve been advocating for that even before AI entered the picture. But there&#8217;s a difference between engineers contributing to docs and engineers being fully responsible for docs strategy, maintenance, and information architecture on top of everything else they already own. I&#8217;m describing a pattern I&#8217;ve seen, not citing a controlled study, but from the contracts we&#8217;ve picked up after layoffs like these, it&#8217;s consistent: the docs drift, support tickets go up, onboarding takes longer, and there&#8217;s nobody whose job it is to fix it.</p><p>Could this work with strong processes, dedicated doc sprints, or better guardrails around AI-generated content? Maybe. I haven&#8217;t seen it succeed at scale yet, but I&#8217;d welcome examples that prove otherwise.</p><h2>The companies investing in writers</h2><p>On the other side, some companies are hiring more writers, not fewer, and using AI to augment them. Their reasoning: documentation is now the source material that every AI system depends on. AI coding assistants, chatbots, support agents. They all consume your docs. If the docs are wrong, the AI is wrong.</p><p>Here&#8217;s a concrete example. An AI coding assistant trained on outdated API docs will confidently suggest deprecated endpoints and wrong parameter names. Developers follow the suggestion, hit errors, file issues, and lose trust in the tool. The root cause isn&#8217;t the AI. It&#8217;s the docs the AI was reading.</p><p>These companies treat documentation as infrastructure. The foundation for how users and AI understand their product. The better the docs, the better every experience built on top of them.</p><p>Anyone who&#8217;s actually used AI to write or code knows it&#8217;s a back and forth. You prompt, you review, you correct, you re-prompt. The output needs judgment. Someone who knows what good docs look like, not just someone who can generate more of them.</p><p>But it&#8217;s not just about producing docs. There&#8217;s also a role AI can&#8217;t fill, at least for now. Technical writing has never been 100% writing. It&#8217;s deciding what gets documented and what doesn&#8217;t. Knowing who to ask for the right information. Evaluating whether docs are useful or need rework. Figuring out what order things should be learned in. And knowing when adding more pages actually makes things harder to find. An AI will happily generate pages for everything. A good docs team knows when to say no.</p><h2>Where I stand</h2><p>I run a documentation engineering consultancy. I have skin in the game, and I&#8217;ll be honest about that. We&#8217;ve had contracts cancelled because companies decided AI could handle the docs. We&#8217;ve also gained contracts from companies that understand docs are the fuel for AI.</p><p>Our position: AI makes writers more capable, not redundant. Writers who use AI to draft, then edit, verify, test, and structure produce better output than before. Maybe the companies that cut their teams had other reasons for making that call. But creating better docs wasn&#8217;t one of them.<br><br>The companies investing in documentation right now understand something simpler: every answer AI generates is only as good as the docs it&#8217;s reading.</p>]]></content:encoded></item><item><title><![CDATA[We added an AI assistant to a docs site. Support tickets went up.]]></title><description><![CDATA[Here&#8217;s why that&#8217;s actually a good thing.]]></description><link>https://blog.techdocs.studio/p/we-added-an-ai-assistant-to-a-docs</link><guid isPermaLink="false">https://blog.techdocs.studio/p/we-added-an-ai-assistant-to-a-docs</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 11 Mar 2026 16:48:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d05cc466-a7eb-4e20-b4d6-29cc3fbb0a56_5184x3456.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We added an AI assistant to a client&#8217;s docs site. First week, support tickets went up. Not down.</p><p>The assistant kept responding &#8220;I couldn&#8217;t find information about this&#8221; for basic things. Export data. Reset password. Delete account.</p><p>Support had been answering these verbally for years. Everyone assumed it was documented, but it wasn&#8217;t.</p><h2>Why basic flows go undocumented</h2><p>When a team ships something new, they want to document the shiny parts. The feature they spent months building. The complex integration that&#8217;s hard to understand without a guide.</p><p>Nobody writes a page about how to reset a password. It feels too obvious.</p><p>Then support starts getting questions. They answer them in 30 seconds over chat, and writing a whole doc page for that feels like overkill. So it stays verbal. Months pass, new support agents join, and they learn the answers from colleagues, not from docs. At some point everyone just assumes it&#8217;s written down somewhere.</p><p>An AI assistant breaks this cycle. It can only answer what&#8217;s documented. It doesn&#8217;t know what support told a user last week, and it doesn&#8217;t have access to Slack threads or old tickets. In our case, that&#8217;s intentional. We only train it on curated, reviewed documentation.</p><p>So when a user asks &#8220;How do I export my data?&#8221; and the assistant says &#8220;I couldn&#8217;t find information about this,&#8221; that gap is no longer invisible. It shows up in the logs, every day. You can&#8217;t ignore it.</p><h2><strong>Use the gaps</strong></h2><p>Once we documented the missing flows, tickets dropped. The assistant started answering questions it couldn&#8217;t before.</p><p>But here&#8217;s the part we didn&#8217;t expect: the &#8220;I don&#8217;t know&#8221; responses told us exactly what to write next. We just looked at what users asked most and started there.</p><p>AI assistants don&#8217;t fix documentation problems. They make them visible.</p>]]></content:encoded></item><item><title><![CDATA[Slow builds were killing our docs]]></title><description><![CDATA[How we cut a Sphinx build from 30 minutes to under 3 by splitting PDFs into chapters and parallelizing outputs.]]></description><link>https://blog.techdocs.studio/p/slow-builds-were-killing-our-docs</link><guid isPermaLink="false">https://blog.techdocs.studio/p/slow-builds-were-killing-our-docs</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 26 Feb 2026 08:31:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a714444a-305c-4f09-8d8f-114ef0b08f0d_6048x4024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#8220;Our docs build takes 30 minutes.&#8221;</em></p><p>The client said it casually, like it was just how things worked. The system rebuilt the entire site every time, even for a one-word fix.</p><p>This is more common than you&#8217;d think, and it kills documentation quality in ways that aren&#8217;t obvious.</p><h2>Slow builds make docs worse</h2><p>When a build takes 30 minutes, nobody verifies small changes. You fix a typo, push it, and hope for the best. You&#8217;re not going to wait half an hour to check whether the formatting looks right.</p><p>So writers stop iterating. They batch changes into big updates instead of making frequent small improvements. Reviews drag because nobody wants to trigger another long cycle just to see a preview. </p><p>The result: fewer updates go out, more errors slip through, and the team starts treating the docs as something to avoid touching.</p><h2>Why this build was slow</h2><p>The project used Sphinx, and every build generated everything from scratch: the full HTML site and a complete PDF manual.</p><p>The PDF was the bottleneck. Sphinx uses LaTeX to produce PDFs, and LaTeX is slow. One monolithic PDF meant one monolithic build, so changing a single paragraph in the authentication guide rebuilt a 1,400-page PDF from scratch.</p><p>It got worse: the HTML and PDF builds ran one after the other. Even when the HTML build was fast, it sat waiting for the PDF to finish before the pipeline completed.</p><h2>What we changed</h2><p>We split the monolithic PDF into separate files, one per section. Authentication, API reference, deployment guide, each with its own PDF. Now changing the auth docs rebuilds only that PDF and leaves the rest untouched.</p><p>Then we stopped running the two builds in sequence. HTML and PDF now build in parallel, so writers can preview their HTML changes right away while the PDFs generate in the background.</p><h2>The result</h2><p>Build time dropped from 30 minutes to under 5 for most changes.</p><p>But the number isn&#8217;t the point. What mattered was how the team&#8217;s behavior changed. Writers started checking their work again. Small fixes went out the same day instead of waiting for &#8220;next sprint.&#8221; Reviews sped up because previews were ready in minutes. The docs got better because the build time got out of the way.</p><p>Nobody complains about slow builds in sprint retros. They're a silent documentation killer, quietly pushing teams away from touching the docs. </p><p>If yours takes more than 10 minutes, it's worth finding out why.</p>]]></content:encoded></item><item><title><![CDATA[Developers aren't reading your docs]]></title><description><![CDATA[At least, not in the way they used to. They're asking AI from their IDE instead. Here's how to make that work for you.]]></description><link>https://blog.techdocs.studio/p/developers-arent-reading-your-docs</link><guid isPermaLink="false">https://blog.techdocs.studio/p/developers-arent-reading-your-docs</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Sun, 22 Feb 2026 19:01:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/939010dd-6278-47d1-af12-1dfb22ec0e1f_4800x2700.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A developer needs to set up authentication using your SDK.</p><p>Two years ago, they&#8217;d open your docs site and read the guide. Today, they type &#8220;How do I authenticate with this API?&#8221; in Claude Code. The AI answers, writes the code, and moves on. Your docs site never sees a pageview.<br><br>Some engineers at Anthropic and OpenAI report that <a href="https://fortune.com/2026/01/29/100-percent-of-code-at-anthropic-and-openai-is-now-ai-written-boris-cherny-roon/">AI now writes 100% of their code</a>. If developers aren&#8217;t writing much of the code themselves, they&#8217;re certainly not browsing your docs to figure out how to write it.</p><p>We&#8217;re seeing this in the documentation projects we work on. AI-driven traffic to docs sites is growing while human visits drop. Mintlify reports that <a href="https://mintlify.com/blog/almost-half-your-docs-traffic-is-ai">almost half of documentation site traffic now comes from AI agents</a>, not humans. Your docs have a new primary reader, and it doesn&#8217;t browse. It queries.</p><h2>From reading to asking</h2><p>Documentation always competed with Stack Overflow, GitHub issues, and asking a coworker on Slack. AI coding assistants just won that competition. When you can describe your problem in natural language and get working code back, in context, inside your editor, there&#8217;s no reason to open a docs site.</p><p>But that doesn&#8217;t mean docs matter less. If anything, accuracy matters more now. A human reading a confusing paragraph will slow down, re-read, maybe search for other sources. An AI will pick an interpretation and ship it.</p><h2>The problem with public AI models</h2><p>When a developer asks an AI about your product, the model either relies on training data or searches the web, and both are broken.</p><p>Training data is stale. If you shipped a new SDK version last month, the model doesn&#8217;t know, and it&#8217;ll suggest deprecated methods with full confidence. Web search relies on SEO, so the model might surface a three-year-old Medium article instead of your current API reference. Your discoverability depends on how well you rank, not on how good your docs are.</p><p>Neither approach has any special relationship with your documentation. The model doesn&#8217;t know your custom error codes or the migration guide you published last Tuesday. So it generates code based on outdated examples and wrong parameter names, and the developer doesn&#8217;t find out the answer was wrong until something breaks.</p><h2>It gets worse for internal docs</h2><p>If public docs have a discoverability problem, internal docs are completely invisible.</p><p>Your internal wiki, your Confluence spaces, your private Notion pages. AI models can&#8217;t see any of it. A new engineer joins your team, asks their AI assistant &#8220;How do I deploy to staging?&#8221;, and gets nothing useful. The model wasn&#8217;t trained on your deployment runbook, and it can&#8217;t search your internal network. Every AI tool your developers use daily is blind to the documentation they need most.</p><h2>Connect your docs to the tools developers actually use</h2><p>There&#8217;s a fix. Instead of hoping AI models happen to find your docs, you can connect your documentation directly to the AI tools developers already use.</p><p>This is what the <strong><a href="https://www.anthropic.com/news/model-context-protocol">Model Context Protocol (MCP)</a></strong> enables. It&#8217;s an open standard that lets AI assistants connect to external data sources, a bridge between an AI coding assistant and your documentation. With an MCP server pointing at your docs, the assistant fetches answers directly from your content in real time, not from training data and not from Google.</p><p>The part worth understanding is how the assistant decides when to use it. You register a description of what your docs contain, and the AI uses that description to decide when to query them. If a developer is working with your SDK and hits an authentication problem, the assistant knows your docs are the right place to look. It isn&#8217;t a keyword search. The AI decides based on context.</p><h2>What this means for documentation teams</h2><p>Your docs go from a website people browse to a data source AI tools query, and that shifts what matters.</p><p>Content quality counts for more, not less. Every ambiguity, every outdated example, every missing step gets amplified, because bad docs now produce bad AI answers at scale. Good docs produce answers that make developers trust your product.</p><p>Internal docs become reachable too. That deployment runbook, your team&#8217;s coding standards, your architecture decision records: MCP can expose them to AI assistants inside your organization.</p><p>And you get better feedback than pageviews ever gave you. When AI assistants query your docs, you can see what questions are being asked, which is direct signal about what developers are actually trying to do.</p><h2>What this doesn&#8217;t fix</h2><p>MCP doesn&#8217;t fix bad docs. If your content is incomplete or outdated, AI will serve incomplete, outdated answers, just faster.</p><p>It doesn&#8217;t eliminate hallucinations either, though it gets things wrong less often when it has access to the right content. Your docs site is still the canonical source of truth. When AI gives a wrong answer, that&#8217;s where developers go to verify. MCP just makes your content reachable from more places.</p><h2>Where to start</h2><p>Start thinking about how AI assistants consume your content, not how humans read it. Structured content, clear headings, explicit examples: these matter even more when your new reader parses pages instead of browsing them.</p><p>Then look into how MCP can work for your docs. Connect it to the tools your team already uses, and see what questions come in.</p><p>Your docs are already being consumed by AI. The only question is whether you&#8217;re serving the right answers or letting the model guess.</p>]]></content:encoded></item><item><title><![CDATA["But it was working fine!"]]></title><description><![CDATA[Why your docs site breaks after four years of 'working fine]]></description><link>https://blog.techdocs.studio/p/but-it-was-working-fine</link><guid isPermaLink="false">https://blog.techdocs.studio/p/but-it-was-working-fine</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 10 Feb 2026 14:30:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/efefd5b9-758e-4d72-9eda-55d495f53054_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#8220;But it was working fine!&#8221;</em></p><p>It was working fine. Four years ago.</p><p>A client called recently about their docs site. Sphinx four versions behind, dependencies with known security vulnerabilities, deprecated extensions holding the build together, a theme broken on current browsers, and search that had grown noticeably slower.</p><p>The launch got budget. Content creation got budget. Someone even set up CI to build and deploy automatically. The team celebrated, then moved on.</p><p>Framework upgrades, dependency updates, security patches? Nobody brought them up. There was no line item for &#8220;keep the docs site alive,&#8221; because it was alive. It was working fine.</p><h2>Your docs site didn&#8217;t break</h2><p>You just stopped keeping up with everything around it.</p><p>Every dependency you don&#8217;t update becomes a risk. Every framework version you skip makes the next upgrade harder. None of it is urgent on any given day, and all of it is urgent four years later.</p><p>The decay is invisible. The site loads, the search works, the pages render, until one day they don&#8217;t. Or they do, just slower, just slightly broken, just enough for users to notice before you do.</p><h2>The cost equation</h2><p>Keeping a docs site maintained is routine work. Not always simple, but manageable if you stay current. The problem is that it never wins against everything else on the roadmap.</p><p>The actual cost is modest. A few hours a quarter to update dependencies, a CI check for broken links, an annual framework upgrade before you fall too far behind. Call it 20 to 30 hours a year.<br><br>Compare that to what neglect cost this client. Their docs were broken for at least three months before anyone flagged it, and the fix took another six weeks. Four and a half months of slow search and a theme that looked off on half the browsers visiting it. All that time, the docs were quietly telling users that this company doesn&#8217;t maintain its tools.</p><h2>Your docs site is a production system</h2><p>We all understand this for apps. Nobody ships a production app and walks away for four years. There are monitoring tools, dependency bots, upgrade cycles. A docs site has users, dependencies, and security surface area too. It deserves the same care.</p><p>Docs sites get none of that. They get launched and forgotten. Then someone calls you four years later wondering why everything is broken.</p><p>It has users, dependencies, and security surface area. It deserves the same care.</p><p>That client's site is fixed now, and they're on a maintenance plan. The kind of work that never makes headlines, but means nobody has to make that call again.</p>]]></content:encoded></item><item><title><![CDATA[The friction problem: Why we skip steps (even important ones)]]></title><description><![CDATA[How a simple link fixed our broken docs review process.]]></description><link>https://blog.techdocs.studio/p/the-friction-problem-why-we-skip</link><guid isPermaLink="false">https://blog.techdocs.studio/p/the-friction-problem-why-we-skip</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Mon, 02 Feb 2026 13:24:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b694fa48-c034-4d11-879a-b7dbd1f16fb9_5616x3716.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The docs went live with errors. Users reported them within hours.</p><p>The review process was supposed to be simple: build the docs locally, check for broken links, formatting issues, rendering problems, then approve.</p><p>Except reviewers weren&#8217;t building the docs locally. They were skimming the markdown in the PR and hitting approve. &#8220;LGTM!&#8221; Without ever seeing the rendered output.</p><p>You can&#8217;t really blame them. Building docs locally means cloning the repo, installing dependencies, running a build command, waiting, then navigating to localhost. That&#8217;s five minutes of friction for a review that &#8220;should&#8221; take two. So they skip it and hope it renders fine.</p><h2>This isn&#8217;t a discipline problem</h2><p>It&#8217;s a friction problem.</p><p>We don&#8217;t skip important steps because we&#8217;re lazy. We skip them because the effort feels disproportionate to the task. A quick review shouldn&#8217;t require a local dev environment, but this one did. So the &#8220;quick review&#8221; quietly became &#8220;skim the markdown and approve.&#8221;</p><h2>The fix was simple</h2><p>We added automated PR previews. Every pull request now generates a deployed preview and drops the link in the PR comments.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pa3d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pa3d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 424w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 848w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 1272w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pa3d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png" width="1236" height="464" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:464,&quot;width&quot;:1236,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74911,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/186590483?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pa3d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 424w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 848w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 1272w, https://substackcdn.com/image/fetch/$s_!pa3d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a41b8a3-3149-4f5d-9b16-7f5272452ba7_1236x464.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#8220;Click this link&#8221; replaced &#8220;build it locally.&#8221; One click versus five minutes of setup. Guess which one people actually do.</p><p>Review quality went up immediately. Not because we trained anyone, not because we wrote stricter guidelines, not because we added more process. We just removed the friction.</p><h2>The pattern</h2><p>This isn&#8217;t unique to doc reviews. Style guides get ignored when checking them by hand is a chore, so you put the linter in CI and suddenly everyone complies. Broken link checks never happen because clicking every link is tedious, so you automate them and they get caught before merge.</p><p>The step is important. Everyone agrees it&#8217;s important. We still skip it, and every time the reason is the same: too much friction for the value it delivers in the moment.</p><p>So instead of asking &#8220;why aren&#8217;t people following the process?&#8221;, ask &#8220;what&#8217;s making this process hard to follow?&#8221;</p><div><hr></div><p>If you've run into something similar (a process that kept getting skipped until you found a way to reduce the friction) I'd love to hear about it in the comments.</p>]]></content:encoded></item><item><title><![CDATA[Your docs are talking. Are you listening?]]></title><description><![CDATA[How AI assistants turn user questions into product insights]]></description><link>https://blog.techdocs.studio/p/ai-documentation-assistants-content-gaps</link><guid isPermaLink="false">https://blog.techdocs.studio/p/ai-documentation-assistants-content-gaps</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 21 Jan 2026 15:14:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6e0d97e5-1698-450f-b9ef-20cc8172c5bc_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most teams add an <strong>AI assistant</strong> to their docs for one reason: answer user questions faster.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OqIT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OqIT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OqIT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:624677,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/185216606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OqIT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!OqIT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee786f41-92b4-44c1-8508-e0ccc4697402_3024x1714.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AI chatbot embedded in a documentation site</figcaption></figure></div><p>That&#8217;s a fine goal. But it misses the bigger opportunity.</p><h2>The real value isn&#8217;t answers. It&#8217;s visibility.</h2><p>Every question a user asks reveals something:</p><ul><li><p>A confusing explanation</p></li><li><p>A missing example</p></li><li><p>A gap in the product itself</p></li></ul><p>When teams add an AI assistant to their docs, they don&#8217;t just get faster support. They get a window into exactly where users are struggling.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gj-g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gj-g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 424w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 848w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 1272w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gj-g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png" width="1456" height="702" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33f12312-715c-465d-af72-f50bebd403e8_1526x736.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:702,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152897,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/185216606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gj-g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 424w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 848w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 1272w, https://substackcdn.com/image/fetch/$s_!gj-g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33f12312-715c-465d-af72-f50bebd403e8_1526x736.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AI chatbot responding "I don't have enough information to answer this question"</figcaption></figure></div><p>When your AI can&#8217;t answer, that&#8217;s not a failure. It&#8217;s a signal.</p><p>That shift changes everything.</p><h2>From static reference to feedback loop</h2><p>Traditional documentation is a one-way broadcast. You write it, publish it, and hope it helps.</p><p>But when you track what users actually ask, documentation becomes a conversation. You see patterns. You spot the same confusion appearing again and again. You find the blind spots your team never noticed because you&#8217;re too close to the product.</p><p>Suddenly, your docs aren&#8217;t just supporting users. They&#8217;re teaching you what to fix.</p><h2>The insight you&#8217;re leaving on the table</h2><p>If your documentation only answers questions, you&#8217;re capturing maybe 10% of its potential value.</p><p>The other 90%? It&#8217;s in the questions themselves.</p><ul><li><p>Which features confuse people most?</p></li><li><p>Where do users get stuck in onboarding?</p></li><li><p>What terminology doesn&#8217;t land?</p></li></ul><p>With an AI assistant, that data exists. Most teams just aren&#8217;t collecting it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vjzc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vjzc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg" width="1456" height="750" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:750,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57945,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/185216606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Vjzc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Vjzc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b4fae36-6605-413c-b665-23528292b1a3_1588x818.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Analytics dashboard displaying unanswered questions grouped by topic and frequency.</figcaption></figure></div><p>A good AI assistant surfaces which questions your docs can&#8217;t answer, ranked by frequency.</p><h2>From insight to action</h2><p>Knowing where the gaps are is only half the problem. Fixing them is where most teams stall.</p><p>The best tools help you close those gaps with clear guidance on where to start.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VPZo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VPZo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 424w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 848w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VPZo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png" width="1456" height="652" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:652,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:501293,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/185216606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VPZo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 424w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 848w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!VPZo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43f9ccbf-988c-4eab-9df6-2ee56ff5c5b9_3022x1354.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Recommendations on how to fix each content gap, with guidance on what to document and why.</figcaption></figure></div><h2>Start here</h2><p>Next time you look at your docs, don&#8217;t ask &#8220;did we cover everything?&#8221;</p><p>Ask &#8220;what are users still asking, and why?&#8221;</p><p>The answer will show you exactly what needs to change.</p>]]></content:encoded></item><item><title><![CDATA[How to get useful documentation feedback (not comma debates)]]></title><description><![CDATA[Vague requests get surface feedback. Here's how to ask questions that actually help.]]></description><link>https://blog.techdocs.studio/p/how-to-get-useful-documentation-feedback</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-get-useful-documentation-feedback</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 14 Jan 2026 20:20:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/19c4eeea-c2aa-43b1-aeca-27087bcaaada_5568x3712.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week, I sent a tutorial draft to two teammates.</p><p><em>&#8220;Hey, can you review this?&#8221;</em></p><p>Two days later I had 10 comments. Four were about commas. Two more debated whether colons introducing lists should be bold. Another spent three paragraphs on whether &#8220;setup&#8221; should be one word or two.</p><p>Not a single comment mentioned that step 4 was completely broken. The command I told users to run didn&#8217;t actually work.</p><h2>Why vague requests produce surface feedback</h2><p>When you ask &#8220;can you review this?&#8221; with no direction, reviewers default to whatever stands out first: typos, formatting, word choice. Easy to spot, easy to comment on.</p><p>&#8220;Review this&#8221; could mean:</p><ul><li><p>Check if the logic makes sense</p></li><li><p>Verify the code runs</p></li><li><p>Look for security issues</p></li><li><p>Test the user flow</p></li><li><p>Proofread for typos</p></li><li><p>Check if the tone is right</p></li></ul><p>Without knowing what you need, people pick the easiest path.</p><h2>The cost of unfocused reviews</h2><p>You spend hours sorting through comments that don&#8217;t help. Reviewers spend their energy on things you&#8217;ll ignore or fix in a later phase. And the real issues never get caught.</p><p>I&#8217;ve watched teams spend three review cycles debating admonition colors while nobody noticed the registration flow was broken. Product and docs ship, users can&#8217;t sign up, and someone says &#8220;but we had five people review it.&#8221; They did. They reviewed the wrong things.</p><h2>How to ask for useful feedback</h2><p>Tell exactly what to look at:</p><ul><li><p><em>&#8220;Does the getting started flow make sense?&#8221;</em></p></li><li><p><em>&#8220;Are the code examples working on your end?&#8221;</em></p></li><li><p><em>&#8220;Is the reference documentation for this function complete?&#8221;</em></p></li></ul><p>And tell them what to ignore:</p><ul><li><p><em>&#8220;Don&#8217;t test authentication, QA is handling that&#8221;</em></p></li><li><p><em>&#8220;Ignore formatting, I&#8217;ll run the linter&#8221;</em></p></li><li><p><em>&#8220;Skip the intro section, it&#8217;s placeholder text&#8221;</em></p></li><li><p><em>&#8220;Don&#8217;t worry about performance yet, that&#8217;s next sprint&#8221;</em></p></li></ul><p>The second half matters as much as the first. Telling people what to skip is what frees them to focus on what you actually need.</p><h2><strong>If you&#8217;re the one being asked to review</strong></h2><p>This works the other way too. Someone sends you <em>&#8220;can you review this?&#8221;</em> with no context. Ask what kind of feedback they&#8217;re looking for. It takes 30 seconds and saves you both from a useless cycle.</p><p>Ask <em>&#8220;What kind of feedback are you looking for?&#8221;</em></p><p>Takes 30 seconds. Saves both of you from a useless review cycle.</p><p>That doesn&#8217;t mean ignoring obvious problems. If you spot a bug or a broken link while reviewing, point it out. If something&#8217;s unclear, say so. Leave things better than you found them. But keep the goal in mind: if someone asked you to review the tutorial flow and you spend 15 minutes hunting for Oxford commas, you&#8217;ve lost the plot.</p><h2>How to make this normal</h2><p>Next time you ask for a review, add one specific question. When someone asks you to review something, ask what they&#8217;re looking for.</p><p>A simple template helps:</p><ul><li><p><strong>What changed:</strong> brief summary</p></li><li><p><strong>What to focus on:</strong> specific concerns</p></li><li><p><strong>What to skip:</strong> things handled elsewhere</p></li><li><p><strong>Questions:</strong> what you&#8217;re unsure about</p></li></ul><h2>What it comes down to</h2><p>Everybody wants to help. But without direction, it&#8217;s easy to lose focus on whatever jumps out first, and that&#8217;s almost never what you need.</p><p>If you want useful feedback, ask useful questions. Be specific, point toward what matters, and call out what to ignore. You&#8217;ll get faster reviews, better feedback, and fewer arguments.</p>]]></content:encoded></item><item><title><![CDATA[New product, no docs yet? Start with documentation strategy]]></title><description><![CDATA[Why writing first creates chaos and how to plan your docs for success]]></description><link>https://blog.techdocs.studio/p/how-to-plan-documentation-strategy</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-plan-documentation-strategy</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 06 Jan 2026 18:47:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d10e1205-32b2-498e-9d15-e26b51d2c916_4761x3174.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>New product. No documentation. Zero.<br><br>The instinct is to start writing immediately, to get something out there and show progress. A smarter approach is to spend a few weeks on strategy first. Who is your audience? What do they need? Which content types matter? What&#8217;s a real priority versus nice-to-have?<br><br>It feels slow, but once you have that clarity, writing moves fast.</p><p>Most documentation disasters come from organic growth. One team adds a page here, another adds one over there, and nobody is thinking about the whole. Structure only becomes a concern after hundreds of pages exist, by which point nothing is easy to find.</p><p>The pattern is always the same: content, then more content, then nobody can find anything. Then someone finally asks &#8220;should we reorganize this?&#8221; when reorganization means touching 300 pages and breaking every bookmark and search result.</p><p><strong>Strategy &#8594; Structure &#8594; Content.</strong></p><p><strong>Not Content &#8594; More Content &#8594; Chaos.</strong></p><h2>What documentation strategy actually means</h2><p>Strategy doesn&#8217;t mean a 40-page plan. It means answering a few critical questions before anyone writes a word.</p><p><strong>Who are you writing for?</strong> </p><p>Not &#8220;developers.&#8221; That&#8217;s too vague. Define specific personas in specific situations. A developer integrating your API under deadline pressure needs different content than an enterprise architect evaluating your security model. Pick a primary audience. Acknowledge the others exist, but know who you&#8217;re optimizing for.<br><br><strong>What job is each piece of documentation doing?</strong></p><p>Documentation serves different purposes:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-8Kx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-8Kx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!-8Kx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!-8Kx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!-8Kx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-8Kx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Di&#225;taxis&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="Di&#225;taxis" title="Di&#225;taxis" srcset="https://substackcdn.com/image/fetch/$s_!-8Kx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!-8Kx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!-8Kx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!-8Kx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44a53ec6-4689-4bb2-bea4-f65a6da5b116_1920x1080.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"><em>Documentation types based on the <a href="https://diataxis.fr/">Di&#225;taxis framework</a> by Daniele Procida.</em></figcaption></figure></div><ul><li><p>Teaching a concept through example (tutorial)</p></li><li><p>Solving a specific problem (how-to guide)</p></li><li><p>Looking up syntax (reference)</p></li><li><p>Understanding why something works this way (explanation)</p></li></ul><p>These aren&#8217;t interchangeable. A reference doc won&#8217;t teach a beginner. A tutorial won&#8217;t help someone troubleshooting at 2am. Your strategy needs to decide which jobs matter most for your product and your users, then commit to doing those jobs well.</p><p><strong>What&#8217;s the minimum content that unlocks the product?</strong></p><p>You don&#8217;t need comprehensive API docs on day one. You don&#8217;t need advanced guides for features nobody&#8217;s using yet. You need whatever removes the biggest obstacle between a new user and their first success.</p><p>Everything else can wait. The question isn&#8217;t &#8220;what should we document eventually?&#8221; It&#8217;s &#8220;what&#8217;s blocking someone right now?&#8221;</p><p><strong>What should each page cover?</strong></p><p>Once you know which content types you need, define what makes each one complete. Tutorials should list prerequisites up front and guide users to a working example. API references need request examples, response formats, and error codes. How-to guides should state the outcome at the start and show the steps clearly. Explanations need context on why things work the way they do.</p><p>This is where templates help. They ensure consistency and completeness across your documentation. But templates only work after you&#8217;ve defined your strategy. Without clarity on what each page type requires, templates just give you consistently incomplete content that raises more questions than it answers.</p><h2><strong>The early content trap</strong></h2><p>In practice, you can ship some early content while doing this thinking. You should, even. But those quick wins shouldn&#8217;t define the strategy.</p><p>You&#8217;ve seen how this goes. You ship a tutorial because five users asked for it, then a troubleshooting doc because support is overwhelmed, then someone adds an FAQ, then best practices. Each one makes sense in isolation. None of them were planned together. Six months later you have 50 pages organized by the order they were written, not the order anyone needs them.</p><p>A strategic early win looks different. You know it&#8217;s one piece of a larger system. You know where it lives, and what comes before and after it. Even if you haven&#8217;t written those other pieces yet, you&#8217;ve left room for them.</p><p>It&#8217;s the difference between &#8220;we need a tutorial, someone write it&#8221; and &#8220;we need a tutorial that assumes zero prior knowledge, gets someone to a working integration in under 10 minutes, and hands them off to either the API reference or advanced tutorials depending on what they want to do next.&#8221; Same deliverable, completely different foundation.</p><h2>What changes when you do this right</h2><p>The writing gets faster, because you&#8217;re not reinventing structure with every new page or second-guessing where something belongs. </p><p>Maintenance gets easier, because when the product changes you know exactly which docs need updating and how the pieces relate. </p><p>Users find what they need, not because your search is amazing but because the structure matches how they think about problems. A</p><p>nd new contributors can add content confidently, because the system makes it obvious where things go.</p><p>None of this happens if you start with content and hope structure emerges. Structure rarely emerges on its own. Chaos does.</p><h2>How to start</h2><p>You don&#8217;t need perfect answers to those strategy questions. You need good-enough answers and permission to revisit them.</p><p>Spend a week, maybe two. Talk to five users about what they&#8217;re trying to do. Look at your support tickets to see what&#8217;s actually confusing people. Then sketch the 10 to 15 core topics your documentation needs to cover and how they connect.</p><p>The approach I use is to <strong>map navigation flows for each persona first</strong>. Where does a junior developer enter your documentation? What&#8217;s their path to first success, and what do they need next? Where does a senior architect start, and what questions do they need answered to evaluate your product? Sketch these journeys: where each audience enters, what they read, and where they go when they&#8217;re stuck.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x2FO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x2FO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png 424w, https://substackcdn.com/image/fetch/$s_!x2FO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png 848w, https://substackcdn.com/image/fetch/$s_!x2FO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png 1272w, https://substackcdn.com/image/fetch/$s_!x2FO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x2FO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png" width="1456" height="553" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:553,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114617,&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/183669072?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.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_!x2FO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png 424w, https://substackcdn.com/image/fetch/$s_!x2FO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png 848w, https://substackcdn.com/image/fetch/$s_!x2FO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.png 1272w, https://substackcdn.com/image/fetch/$s_!x2FO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416f5aac-a1e1-4537-a589-308b2c145d7d_1848x702.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><blockquote><p>Example navigation flows for two different personas. Use it to identify key content and paths.</p></blockquote><p>These flows reveal what content you actually need, not just what seems logical to document, and they give you your structure. </p><p>Structure isn&#8217;t about folders. It&#8217;s about reflecting how users think about your product. If they think in workflows, organize by workflow. If they think in features, organize by feature. Don&#8217;t organize by how your engineering team structured the codebase, because nobody outside your company thinks that way.</p><p>Then<strong> build a grid in a spreadsheet</strong>, one row per page or section you think you&#8217;ll need. Give it columns for the page title, the persona it serves, the content type (tutorial, reference, how-to, explanation), the priority (must-have for launch, nice-to-have, future), and a short description of what the page covers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oABr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oABr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png 424w, https://substackcdn.com/image/fetch/$s_!oABr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png 848w, https://substackcdn.com/image/fetch/$s_!oABr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png 1272w, https://substackcdn.com/image/fetch/$s_!oABr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oABr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png" width="1456" height="460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:460,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136987,&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/183669072?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.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_!oABr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png 424w, https://substackcdn.com/image/fetch/$s_!oABr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png 848w, https://substackcdn.com/image/fetch/$s_!oABr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.png 1272w, https://substackcdn.com/image/fetch/$s_!oABr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7da4b05-4a37-40d8-82d8-34c1d0035b61_1632x516.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">Example content planning grid showing modules, personas, content types, priorities, and descriptions. </figcaption></figure></div><p>Columns for:</p><ul><li><p><strong>Module / page title</strong></p></li><li><p><strong>Persona:</strong> who is this for?</p></li><li><p><strong>Content type:</strong> tutorial, reference, how-to, explanation</p></li><li><p><strong>Priority:</strong> must-have for launch, nice-to-have, future</p></li><li><p><strong>Description:</strong> Brief description of what the page covers, required subheadings.</p></li></ul><p>The grid forces you to think about the whole system at once instead of page by page. You&#8217;ll spot gaps (&#8221;wait, we have five reference docs but no how-tos?&#8221;) and redundancies (&#8221;these three pages are basically the same thing&#8221;).</p><p>One thing I&#8217;ve found useful: <strong>identify your action-oriented content first, the tutorials and how-to guides, then build reference and explanation docs around them</strong>. Those supporting docs can be referenced from multiple guides, so you&#8217;re not repeating the same API details in every tutorial. The guides stay focused on the task while the depth lives somewhere reusable.</p><p><strong>Together, the flows and the grid become your roadmap.</strong> When someone asks &#8220;should we document X?&#8221; you can see where it fits, or doesn&#8217;t. When priorities shift, you adjust the plan instead of 47 individual pages.</p><p>Then you start writing. But now you&#8217;re writing into a framework, not into a void.</p><p>Strategy doesn&#8217;t slow you down. It&#8217;s what makes fast sustainable.</p><h2>Planning your documentation strategy?</h2><p>If you&#8217;re staring at documentation chaos or launching something new and want to avoid building problems into your foundation, <a href="https://techdocs.studio/services/content-architecture-planning">we can help</a>. </p><p>We work with teams to design content architecture that scales: mapping personas, defining structure, and creating the roadmap before anyone writes a word.</p>]]></content:encoded></item><item><title><![CDATA[Reflecting on 2025: Growth and learning]]></title><description><![CDATA[A look back at a year of progress, collaboration, and results at TechDocs Studio]]></description><link>https://blog.techdocs.studio/p/reflecting-on-2025-growth-learning</link><guid isPermaLink="false">https://blog.techdocs.studio/p/reflecting-on-2025-growth-learning</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 31 Dec 2025 09:16:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3198aed7-6eda-4409-a5b9-a0888438f6f5_5184x3456.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>From solo freelance work to a formal company. What a year! </p><p>2025 was full of growth and learning. <br><br>At <strong><a href="https://techdocs.studio">TechDocs Studio</a></strong>, we helped clients build scalable documentation infrastructure, automate workflows, and improve their docs, seeing firsthand how targeted improvements transform daily work for teams. <br><br>We also reinvested in our own products, including <strong><a href="https://biel.ai">Biel.ai</a></strong> and <strong><a href="https://pushfeedback.com">PushFeedback</a></strong>, tackling common documentation challenges our customers face. Watching these tools start to make a real difference has been incredibly rewarding.<br><br>This year reinforced that growth is not just about new contracts, but about trust, collaboration, and celebrating small wins together.<br><br>I&#8217;m grateful to everyone who made this year possible:</p><ul><li><p>&#120278;&#120316;&#120319;&#120306; &#120321;&#120306;&#120302;&#120314;: <strong>&#192;lex</strong>, <strong>Ra&#250;l</strong>. Thank you for bringing skill, dedication, joy to every project.</p></li><li><p>&#120289;&#120306;&#120324; &#120304;&#120313;&#120310;&#120306;&#120315;&#120321;&#120320;: <strong>Kristy-Leigh</strong>, <strong>Matthew</strong>, <strong>Rustom</strong>, <strong>Alex</strong>, <strong>Jimmy</strong>. Thank you for trusting us.</p></li><li><p>&#120287;&#120316;&#120315;&#120308;-&#120321;&#120306;&#120319;&#120314; &#120320;&#120322;&#120317;&#120317;&#120316;&#120319;&#120321;&#120306;&#120319;&#120320;: Anna, <strong>Tzach</strong>, <strong>Elena</strong>, Jorge, Alberto, Rich, Nate. Thank you for your continued trust and support over the years.</p></li><li><p>&#120280;&#120315;&#120302;&#120303;&#120313;&#120306;&#120319;&#120320;: <strong>Pablo</strong>, <strong>Juan Luis</strong>. Thank you for connecting us with exceptional people.</p></li><li><p>&#120281;&#120306;&#120306;&#120305;&#120303;&#120302;&#120304;&#120312; &#120304;&#120309;&#120302;&#120314;&#120317;&#120310;&#120316;&#120315;&#120320;: <strong>Lars</strong>, <strong>Tim</strong>, <strong>Harshil</strong>, <strong>Seonaid</strong>, Elena K. Your feedback improved our tools for everyone.</p></li><li><p>&#120284;&#120315;&#120320;&#120317;&#120310;&#120319;&#120302;&#120321;&#120310;&#120316;&#120315;: <strong>Ivan</strong>, <strong>Sabela</strong>, <strong>Cristina</strong>, <strong>Aleix</strong>, <strong>Xavi</strong>. I&#8217;ve learned a ton from all of you.</p></li><li><p>&#120290;&#120317;&#120306;&#120319;&#120302;&#120321;&#120310;&#120316;&#120315;&#120302;&#120313; &#120320;&#120322;&#120317;&#120317;&#120316;&#120319;&#120321;: <strong>Davinia</strong> for keeping our finances in order, <strong>Gonzalo</strong> for managing customer relations.</p></li></ul><p>...and to everyone we worked with behind the scenes, thank you for your support.</p><p>If you&#8217;re curious about what we built in 2025, you can explore our projects at <a href="http://techdocs.studio/work">techdocs.studio/work</a>:</p><h4><strong>Aligning Coiled&#8217;s documentation theme with their brand identity</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nG_n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nG_n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nG_n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png" width="1210" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de056b0c-8540-4827-98e7-06be526015c8_1210x727.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Coiled project screenshot&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="Coiled project screenshot" title="Coiled project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!nG_n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.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>Following the successful launch of Coiled&#8217;s new website, we developed a custom Sphinx documentation theme that aligned with their updated brand identity, ensuring a cohesive user experience across docs.coiled.io and the main marketing site.</p><p><strong><a href="https://techdocs.studio/work/coiled-docs">Read case study</a></strong></p><div><hr></div><h4><strong>Custom Sphinx theme development for FiftyOne documentation</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rYck!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rYck!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!rYck!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rYck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png" width="1210" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Voxel51 project screenshot&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="Voxel51 project screenshot" title="Voxel51 project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!rYck!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!rYck!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.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>We upgraded FiftyOne&#8217;s documentation from Sphinx 3 to the latest version, created a custom theme aligned with the new Voxel51 brand guidelines, and implemented advanced search capabilities with PushFeedback integration for continuous improvement.</p><p><strong><a href="https://techdocs.studio/work/voxel51">Read case study</a></strong></p><div><hr></div><h4><strong>From Webflow to Next.js: Creating a developer-first website for Coiled</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gom0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gom0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 424w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 848w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1272w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gom0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png" width="1210" height="711" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:711,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Coiled project screenshot&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="Coiled project screenshot" title="Coiled project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!Gom0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 424w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 848w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1272w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.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>Migrated Coiled&#8217;s website from Webflow to a modern, component-based static site generator, empowering their team to manage content like they manage code.</p><p><strong><a href="https://techdocs.studio/work/coiled">Read case study</a></strong></p><div><hr></div><h4><strong>Automating API reference generation from OpenAPI and GraphQL schemas</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P2kG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P2kG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 424w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 848w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1272w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P2kG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png" width="1210" height="702" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3941050d-468e-425d-96c1-b38698ada110_1210x702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:702,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;MONEI project screenshot&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="MONEI project screenshot" title="MONEI project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!P2kG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 424w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 848w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1272w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.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>Migrated MONEI&#8217;s docs to Docusaurus v3, implemented cross-site search, and autogenerated consistent API documentation from OpenAPI and GraphQL contracts.</p><p><strong><a href="https://techdocs.studio/work/monei">Read case study</a></strong></p><div><hr></div><h4><strong>Unifying Blue Robotics&#8217; documentation with a custom Sphinx theme</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WpaP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WpaP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 424w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 848w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1272w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WpaP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png" width="1210" height="729" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:729,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Blue Robotics project screenshot&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="Blue Robotics project screenshot" title="Blue Robotics project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!WpaP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 424w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 848w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1272w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.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>Developed a custom Sphinx theme with Material design aesthetics, implemented multi-language support, and set up a custom CI/CD pipeline for version management across their documentation ecosystem.</p><p><strong><a href="https://techdocs.studio/work/bluerobotics">Read case study</a></strong><br><br>Here&#8217;s to 2026: more learning, more impact, and helping teams build documentation that scales!</p><p>&#8212; David</p>]]></content:encoded></item><item><title><![CDATA[Our best tutorial was actually broken (we just couldn't see it)]]></title><description><![CDATA[12 user complaints revealed what our analytics couldn't]]></description><link>https://blog.techdocs.studio/p/our-best-tutorial-was-actually-broken</link><guid isPermaLink="false">https://blog.techdocs.studio/p/our-best-tutorial-was-actually-broken</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 23 Dec 2025 14:47:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/26218e86-5bf4-4c0e-97b0-4d928f05b31f_3553x2572.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A tutorial had a 5-minute average session time. The analytics looked great, the best retention of any page. During a review call, the product lead pulled up the dashboard: &#8220;See? Users love this one.&#8221;</p><p>We suggested adding a feedback widget. A small button: &#8220;Was this helpful?&#8221;</p><p>One week later, 12 users had left feedback. Not one was positive.</p><p>&#8220;Step 3 is missing.&#8221; &#8220;This example doesn&#8217;t work.&#8221; &#8220;I&#8217;ve read this four times and I&#8217;m still confused.&#8221; &#8220;Where&#8217;s the actual code?&#8221;</p><p>Those 5 minutes weren&#8217;t engagement. They were users scrolling up and down, re-reading, trying to figure out what was missing.</p><h2>Good metrics, bad experience</h2><p>The analytics showed what users did. The feedback showed why.</p><p>The team fixed everything in 48 hours: added the missing step, replaced the broken example, clarified the confusing parts, and added code where users expected it.</p><p>Session time dropped to 3 minutes. But now users were finishing successfully instead of giving up confused.</p><h2>You need both</h2><p>Quantitative data shows behavior. Qualitative data explains it.</p><p>Your analytics will tell you users spent 5 minutes on a page. Your users will tell you they spent those 5 minutes confused.</p><p>One number can mean two completely different things.</p>]]></content:encoded></item></channel></rss>