<?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>Tue, 01 Sep 2026 00:23:12 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[5 ways to organize multi-product documentation]]></title><description><![CDATA[What to do when your product line outgrows one documentation structure.]]></description><link>https://blog.techdocs.studio/p/5-ways-to-organize-multi-product</link><guid isPermaLink="false">https://blog.techdocs.studio/p/5-ways-to-organize-multi-product</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 11 Aug 2026 15:13:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/194caac6-de3f-4082-b34e-d117d22248c5_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It usually starts this way: you have one product and one documentation site. The product line grows, so you add another section to the sidebar. Then another. Each addition makes sense on its own, and for a while the structure works.</p><p>Eventually, the same navigation is serving products with different audiences, owners, and release schedules. Reorganizing the links is no longer enough. You need to decide what the documentation should still share.</p><p>Here are five ways to structure it, from one shared sidebar to separate sites connected by a common hub.</p><h2>1. One sidebar for multiple products</h2><p>One sidebar can support several products when they belong to the same workflow and serve the same audience.</p><p>Readers can move between products without returning to a portal. For the documentation team, it also means one search index and navigation model.</p><p><a href="https://docs.docker.com/desktop/">Docker Docs</a> shows the pattern clearly. Its global sidebar includes Docker Desktop, Engine, Offload, Build, Build Cloud, Compose, Hub, Scout, and other products. They share one navigation because they support a connected workflow: develop locally, build container images, define multi-container applications, share images, and check their security.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pA1P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pA1P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png 424w, https://substackcdn.com/image/fetch/$s_!pA1P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png 848w, https://substackcdn.com/image/fetch/$s_!pA1P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png 1272w, https://substackcdn.com/image/fetch/$s_!pA1P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pA1P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png" width="1456" height="798" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:798,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:487926,&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/210100773?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.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_!pA1P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png 424w, https://substackcdn.com/image/fetch/$s_!pA1P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png 848w, https://substackcdn.com/image/fetch/$s_!pA1P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.png 1272w, https://substackcdn.com/image/fetch/$s_!pA1P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16eb9bde-e18a-4325-bbc5-77af7b5ca822_2991x1639.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 aria-hidden="true" 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><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>Docker keeps related development and supply-chain products inside one documentation sidebar.</em></figcaption></figure></div><p>The length of the sidebar matters less than whether its categories make sense to the same reader. Split the experience when product teams need different structures or readers regularly encounter irrelevant sections.</p><h2>2. Shared documentation with language-specific code</h2><p>SDKs for Ruby, Python, Java, Node.js, Go, and .NET may look like separate products internally. To the reader, they are often different ways to complete the same task. Publishing a complete guide for each SDK duplicates the prerequisites, warnings, and troubleshooting.</p><p><a href="https://docs.stripe.com/sdks/server-side">Stripe&#8217;s server-side SDK documentation</a> keeps the task and explanation shared while letting readers select the language used by installation instructions and code examples.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Aj17!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Aj17!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!Aj17!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!Aj17!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!Aj17!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Aj17!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/416aa7d6-bf65-4c8c-9c20-1122871062fa_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;:647961,&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/210100773?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_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_!Aj17!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!Aj17!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!Aj17!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!Aj17!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F416aa7d6-bf65-4c8c-9c20-1122871062fa_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 aria-hidden="true" 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><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>Stripe changes the language-specific implementation without duplicating the surrounding task content.</em></figcaption></figure></div><p>This works when the goal and sequence stay the same and only the code, package names, or small technical details change. Create separate doc sets when setup, concepts, or constraints also diverge. A mobile SDK and a server SDK may share a brand but still need different user journeys.</p><h2>3. Shared documentation with a page-level variant selector</h2><p>Sometimes the reader needs more than a different code sample. The same task may have different steps for a cloud plan, an enterprise edition, or a self-managed release.</p><p>If most of the explanation is shared, a page-level selector can carry that context across the site. The reader chooses once, and the documentation shows the relevant pages, steps, and navigation.</p><p><a href="https://docs.github.com/en/get-started/using-github-docs/about-versions-of-github-docs">GitHub Docs</a> uses a selector at the top of the page. Readers can switch between Free, Pro, and Team, GitHub Enterprise Cloud, and supported GitHub Enterprise Server releases. The selected context becomes part of the URL and controls which content appears.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SKha!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SKha!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!SKha!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!SKha!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!SKha!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SKha!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6cf4ebea-e785-42c1-8f5e-eafc50aa1238_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;:607327,&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/210100773?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_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_!SKha!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!SKha!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!SKha!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!SKha!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cf4ebea-e785-42c1-8f5e-eafc50aa1238_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 aria-hidden="true" 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><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>GitHub lets readers choose a product and release context that applies across the documentation.</em></figcaption></figure></div><p>GitHub maintains these variations from a single source using metadata and conditional content, as described in its <a href="https://docs.github.com/en/contributing/writing-for-github-docs/versioning-documentation">versioning documentation</a>. This works when every edition can still share one information architecture, but the instructions differ often enough to distract readers.</p><p>When only a few procedures differ, the selector can stay local to those sections. <a href="https://docs.camunda.io/docs/apis-tools/web-modeler-api/authentication/?environment=self-managed">Camunda&#8217;s API documentation</a> uses SaaS and Self-Managed tabs to change authentication steps and commands without changing the surrounding page.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FIoj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FIoj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!FIoj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!FIoj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!FIoj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FIoj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_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;:575144,&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/210100773?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_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_!FIoj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!FIoj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!FIoj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!FIoj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee25ed5f-96c3-4fb7-ab92-7c6c8e5f7e3c_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 aria-hidden="true" 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><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>Camunda keeps both environments on the same page and lets readers switch between the instructions.</em></figcaption></figure></div><p>If each variant needs different navigation, ownership, or release workflows, a selector may be hiding a larger architectural split.</p><h2>4. Separate product areas within one documentation site</h2><p>Some products belong to the same platform but need different documentation structures. Putting both in one sidebar would mix concepts, setup paths, and reference material that only apply to one product.</p><p><a href="https://planetscale.com/docs">PlanetScale&#8217;s documentation</a> gives Vitess and Postgres their own entries in the top navigation. Selecting either product opens a focused documentation area with its own sidebar. Shared platform, API, and CLI documentation remains available from the same header.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8tPx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8tPx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png 424w, https://substackcdn.com/image/fetch/$s_!8tPx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png 848w, https://substackcdn.com/image/fetch/$s_!8tPx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!8tPx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8tPx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:462601,&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/210100773?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.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_!8tPx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png 424w, https://substackcdn.com/image/fetch/$s_!8tPx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png 848w, https://substackcdn.com/image/fetch/$s_!8tPx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!8tPx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727811e3-7d5a-4a3c-93bc-812151f6a9e3_3000x1714.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 aria-hidden="true" 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><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>PlanetScale separates its two database products without sending readers to different documentation sites.</em></figcaption></figure></div><p>This is easier to navigate than a product directory when there are only a few clear choices. Each product can have its own information architecture while the company keeps one documentation domain, search experience, and visual system.</p><p>For a larger catalog, the same idea needs another layer. <a href="https://developers.cloudflare.com/directory/">Cloudflare&#8217;s documentation directory</a> adds search, product descriptions, and category filters before readers enter product-specific documentation.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F6Iu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F6Iu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png 424w, https://substackcdn.com/image/fetch/$s_!F6Iu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png 848w, https://substackcdn.com/image/fetch/$s_!F6Iu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!F6Iu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F6Iu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png" width="1456" height="829" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:829,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:464488,&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/210100773?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.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_!F6Iu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png 424w, https://substackcdn.com/image/fetch/$s_!F6Iu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png 848w, https://substackcdn.com/image/fetch/$s_!F6Iu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!F6Iu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7a37a87-e665-4459-9d94-96b95d703424_3012x1714.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 aria-hidden="true" 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><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>Cloudflare uses a directory to route readers across a much larger product catalog.</em></figcaption></figure></div><p>At that scale, product names alone are not enough. The directory needs descriptions, categories, synonyms, and task-oriented routes for readers who know their problem but not the product that solves it.</p><h2>5. A hub connecting federated documentation sites</h2><p>Separate sites make sense when products within the same company have distinct brands or audiences, or when different teams own them and need autonomy over their documentation. Each team can shape its site around its product and users. A central hub explains how the products relate and gives readers one place to start.</p><p>We built this model for <a href="https://docs.scylladb.com/stable/">ScyllaDB</a>. ScyllaDB Cloud, the database server, drivers, Operator, Monitoring Stack and Migrator can keep their own documentation and release processes. The central portal gives readers one place to begin.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J8yM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J8yM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png 424w, https://substackcdn.com/image/fetch/$s_!J8yM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png 848w, https://substackcdn.com/image/fetch/$s_!J8yM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png 1272w, https://substackcdn.com/image/fetch/$s_!J8yM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J8yM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png" width="1456" height="835" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:835,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:363301,&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/210100773?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.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_!J8yM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png 424w, https://substackcdn.com/image/fetch/$s_!J8yM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png 848w, https://substackcdn.com/image/fetch/$s_!J8yM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.png 1272w, https://substackcdn.com/image/fetch/$s_!J8yM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcca1c53-28a6-46a6-bd37-48e9a96f5d27_2985x1711.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 aria-hidden="true" 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><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>ScyllaDB presents one documentation entry point while product and component sites retain separate ownership.</em></figcaption></figure></div><p>In this case, the architecture follows the ownership model. Product teams maintain documentation close to their code, while shared theme packages and integrations make the sites feel like one system. Our <a href="https://techdocs.studio/work/scylladb">ScyllaDB case study</a> describes this &#8220;docs in tree&#8221; approach in more detail.</p><p>A federated model still needs shared theme packages, cross-site search, analytics, metadata, and an owner for the hub. That platform work is justified when forcing autonomous teams into one repository would create more coordination than it removes.</p><h2>Which multi-product documentation architecture should you choose?</h2><p>Before choosing a pattern, answer four questions:</p><ol><li><p><strong>Audience:</strong> Do the same people use these products in the same journey?</p></li><li><p><strong>Ownership:</strong> Does one team maintain the documentation, or do product teams need autonomy?</p></li><li><p><strong>Release cadence:</strong> Can the content build, version, and publish together?</p></li><li><p><strong>Overlap:</strong> Is most of the content shared, or only the brand and visual design?</p></li></ol><p>Use the simplest option that matches those answers. If the same audience and team can navigate and maintain the content, keep it together. Split the experience when readers or owners need a clearer boundary.</p><p>If you are reorganizing an existing site, <a href="https://blog.techdocs.studio/p/how-we-scope-large-docs-migrations">run a pilot project</a> before committing the full documentation set to the new structure.</p><div><hr></div><p>How are you organizing documentation across products? Reply and tell me what&#8217;s working and what isn&#8217;t.</p>]]></content:encoded></item><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 joined the company, the default onboarding plan was another person. A senior colleague sat with them, walked them through the initial setup, answered questions, and showed them where to start.</p><p>It worked for one hire. As the company grew, the team repeated the same walkthrough every time someone joined. The result depended on who was available and what they remembered to explain. Two people joining in the same month could receive very different introductions to the same system.</p><p>The person leading the onboarding also lost days repeating work they had covered with the previous hire.</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 make this process repeatable. Here&#8217;s how we approached it.</p><h2>One-to-one teaching doesn&#8217;t scale, and it isn&#8217;t consistent</h2><p>Pairing still mattered. Senior colleagues provided context, answered difficult questions, and explained the decisions behind the system. But much of the initial setup followed the same path every time.</p><p>When that path lived in someone&#8217;s head, each mentor taught it differently. One remembered an important step. Another skipped it. One explained the complete workflow. Another assumed the new hire would pick it up later.</p><p>Codelabs captured the common path. New hires could work through the basics independently, while mentors remained available for questions that required context or judgment.</p><h2>Start with the work new hires actually do</h2><p>We listed the tasks a new hire handled in the first few weeks and used those to scope the documentation. The org chart stayed out of it.<br><br>New hires ran many of the same workflows regardless of team. Those workflows crossed several systems and ownership boundaries, where <a href="https://blog.techdocs.studio/p/codelabs-are-the-internal-docs-your">reference docs leave gaps</a> tends to leave gaps.</p><p>A small set of codelabs covered the most common first-month tasks. Each one focused on a path that new hires would actually follow.</p><h2>Use the same structure every time</h2><p>Every codelab followed the same structure: a real scenario, a clear starting point, one supported path, checkpoints, and a reference solution.</p><p>When a thousand people work through the same exercises, they need to know what to expect. A common format also makes the codelabs easier to review and maintain.</p><p>I covered this structure in <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 no longer took three weeks. New hires could follow the documentation and ship their first change without waiting for a senior engineer to walk them through it.</p><p>Mentors spent less time repeating setup. Everyone completed the same exercises, so the team also gained a shared baseline. When someone said, &#8220;I did the onboarding codelab,&#8221; everyone knew what they had learned.</p><p>The documentation handled the repeatable parts of onboarding. Mentors could focus on questions that needed context, judgment, or experience.</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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 spent the past two years helping companies connect their documentation to AI assistants and Model Context Protocol (MCP) servers. We also built <a href="https://bie.ai">Biel.ai</a>, so we see the same question as consultants and as builders: <em>how do we make the answers better?<br></em><br>Teams often start by changing the model or rewriting the prompt. That can help, but many weak answers begin earlier. The assistant retrieved the wrong passage, pulled an outdated version, lost the page context during ingestion, or had no reliable source to work with.</p><p>These are the checks we make first.</p><h2>1. Write sections that survive retrieval</h2><p>A reader sees the page around a paragraph. A documentation assistant may receive only that paragraph and its heading.</p><p>Make each section understandable when it is retrieved on its own. Name the product, feature, or task in the heading. Restate prerequisites that change the meaning of the instructions. Replace headings such as &#8220;Configure it&#8221; or &#8220;Next steps&#8221; with headings that say what is being configured and what happens next.</p><p>You do not need to repeat the whole page. You need enough context for one section to remain accurate after it has been separated from the page.</p><h2>2. Start with real user questions</h2><p>Support tickets, site search terms, sales calls, and assistant logs show how people describe their problems. Use that language to check whether the docs contain a direct answer.</p><p>The page does not need to use a question as its title. It does need to cover the question users actually ask. &#8220;Authentication&#8221; may be a tidy section name, but users are more likely to ask why their token expired or how to rotate a key without downtime.</p><h2>3. Show the complete procedure</h2><p>Code examples need imports, configuration, file paths, and any setup required to run them. Procedures need prerequisites, expected results, and the important failure cases.</p><p>This matters because the assistant may retrieve the code block without the paragraph three sections earlier that explains where it belongs. A complete example gives the model fewer gaps to fill and gives the reader something they can verify.</p><h2>4. Use one term for each concept</h2><p>Choose a preferred term and use it consistently. If &#8220;API key,&#8221; &#8220;access token,&#8221; and &#8220;credential&#8221; mean different things in your product, the docs should make that distinction clear.</p><p>Keep known synonyms in a glossary, redirects, search configuration, or retrieval metadata when your system uses them. Do not scatter synonyms through the prose only to improve matching. That makes the documentation harder to read and can blur distinctions the assistant needs to preserve.</p><h2>5. Curate what goes into the index</h2><p>Do not add every page you own by default. Marketing pages, old release notes, duplicate migrations, archived versions, and internal drafts can compete with the current documentation.</p><p>Decide which sources are authoritative for each product and version. Exclude duplicate or obsolete content unless users still need it, and label historical material clearly when you keep it. This is indexing or retrieval scope, not model training.</p><h2>6. Make versions and applicability obvious</h2><p>A correct answer for the wrong version is still a wrong answer.</p><p>State which product, version, deployment model, plan, operating system, or SDK a section applies to. Put that information close to the instructions instead of relying only on a selector elsewhere on the page. When the same procedure covers several variants, say what changes for each one.</p><p>Archive or redirect unsupported versions when possible. If older documentation must remain available, keep it clearly separated from the current set.</p><h2>7. Preserve context when pages are split into chunks</h2><p>Most retrieval systems divide a page into smaller chunks before indexing it. A section called &#8220;Limits&#8221; becomes ambiguous if the chunk no longer carries the page title, heading path, product, or version.</p><p>Inspect the content after ingestion as well as the source page. Each chunk should retain the context needed to identify it. That may include the page title, parent headings, product, version, and a short description of what the section covers.</p><p>Anthropic describes a related technique in its guide to <a href="https://www.anthropic.com/engineering/contextual-retrieval">contextual retrieval</a>: adding chunk-specific context before content is indexed.</p><h2>8. Use metadata for decisions the system can enforce</h2><p>Metadata is most useful when the retrieval layer can filter on it. Product, version, deployment model, audience, lifecycle status, and access level are practical fields because they can stop the wrong source from reaching the model.</p><p>Do not add tags and assume they improve retrieval automatically. Confirm that the ingestion pipeline preserves them and that search applies them. For example, OpenAI&#8217;s retrieval tools support <a href="https://developers.openai.com/api/docs/guides/retrieval#attribute-filtering">attribute filtering before semantic search</a>.</p><h2>9. Keep important information in text</h2><p>Some models can interpret screenshots and diagrams, but documentation pipelines do not all ingest them in the same way. A critical instruction that exists only inside an image is easy to lose.</p><p>Explain the required action, value, or decision in the surrounding text. Use alt text to describe the purpose of the image, and add a caption when the reader needs context. For a diagram, summarize the relationship or sequence the diagram is meant to show.</p><h2>10. Give the ingestion pipeline a clean source</h2><p>Find out what the assistant actually reads. It may crawl the published site, ingest Markdown from a repository, use an API, or receive selected resources through an MCP server.</p><p>If it crawls the site, make the main content available as clean HTML and use stable, crawlable URLs. Google can render JavaScript, but it still recommends server-side or pre-rendering because <a href="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics">not every bot runs JavaScript</a>. If the assistant ingests the repository instead, test the generated text after parsing and remove navigation, cookie banners, and other page furniture.</p><h2>11. Scope by product, version, and access</h2><p>One assistant can cover several products when the system can identify the user&#8217;s context and filter the sources reliably. Separate assistants or MCP servers make more sense when the products have different owners, audiences, or access boundaries.</p><p>Do not split the system per product as a reflex. First decide which content a user should be able to reach and which questions genuinely need information from more than one product. For restricted MCP resources, apply authorization and least-privilege access. The official MCP guidance recommends <a href="https://modelcontextprotocol.io/docs/tutorials/security/authorization), rather than catch-all access">scopes tied to specific tools or capabilities</a>.</p><h2>12. Require sources and a safe fallback</h2><p>An answer should point back to the documentation that supports it. Source links let readers check the details and help your team diagnose why an answer went wrong.</p><p>Decide what the assistant should do when the evidence is missing, conflicting, or outdated. A clear &#8220;I couldn&#8217;t find this in the documentation&#8221; is more useful than a plausible guess. It should also tell the reader where to go next, such as support, a product owner, or the relevant documentation area.</p><h2>13. Build an evaluation set from real questions</h2><p>Collect questions from support, search, onboarding, and assistant logs. Include common tasks, edge cases, ambiguous wording, version-specific questions, and questions the assistant should refuse to answer.</p><p>For each question, record the expected source and the criteria for an acceptable answer. Keep the first set small enough to review by hand, then add new cases as users expose gaps. OpenAI&#8217;s <a href="https://developers.openai.com/api/docs/guides/evaluation-best-practices#example-q-a-over-docs">evaluation guidance for Q&amp;A over documentation</a> recommends combining production data, expert-written answers, and historical logs.</p><h2>14. Test retrieval and the final answer separately</h2><p>When an answer fails, check the retrieved sources before changing the prompt.</p><p>If the correct section never appeared, investigate the content, chunking, metadata, filters, or search configuration. If the correct source appeared but the answer was still wrong, look at the instructions, model, and answer-generation step. Measuring both stages prevents a prompt change from hiding a retrieval problem.</p><p>Run the evaluation set against a staging index whenever you change the corpus, chunking, retrieval settings, prompt, or model. Keep the previous results so you can see what improved and what regressed.</p><h2>15.  Start with a bounded pilot and classify every failure</h2><p>You do not need perfect documentation before testing an assistant. You do need a clear scope. Start with one product, audience, or workflow where the sources are reviewed and users have another route to get help.</p><p>Log weak and unanswered responses, then classify the cause:</p><ul><li><p>The answer is not documented</p></li><li><p>The source is outdated or contradictory</p></li><li><p>The correct source was not retrieved</p></li><li><p>The wrong product or version was selected</p></li><li><p>The user did not have the right access</p></li><li><p>The model misread good evidence</p></li></ul><p>The first two clearly belong in the documentation roadmap. The others point to retrieval, scoping, access, or answer generation. Some failures will need changes in more than one place.</p><p>If you are unsure where to begin, run ten questions that your support team answers every week. Check the sources the assistant retrieved alongside the prose it generated. You will know what to fix next.</p><div><hr></div><p>We built <a href="https://biel.ai">Biel.ai</a> around this approach. Its content-gap analytics show what users are asking, which questions keep coming up, and where your documentation needs work.</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 aria-hidden="true" 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><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 aria-hidden="true" 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><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>A client asked us to review their getting started guide. The manual installation path had a long sequence of commands and code examples, so we followed it from the beginning and ran everything.</p><p>Some examples worked. Others did not compile. One called a method that no longer existed. Another used a dependency version from two releases earlier.</p><p>You could not tell from the page. The formatting was clean, the syntax highlighting worked, and each code block had an explanation. The failures appeared only when we ran the code.</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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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></channel></rss>