<?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: 🤖 AI & Tools]]></title><description><![CDATA[ Making docs work harder: AI, search, feedback, integrations]]></description><link>https://blog.techdocs.studio/s/enhancing-docs</link><image><url>https://substackcdn.com/image/fetch/$s_!2k14!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff99f17-2d47-4548-9b5d-0caae3d7adeb_1200x1200.png</url><title>Tech Docs: 🤖 AI &amp; Tools</title><link>https://blog.techdocs.studio/s/enhancing-docs</link></image><generator>Substack</generator><lastBuildDate>Sat, 18 Apr 2026 09:21:19 GMT</lastBuildDate><atom:link href="https://blog.techdocs.studio/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[David Garcia]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[david@techdocs.studio]]></webMaster><itunes:owner><itunes:email><![CDATA[david@techdocs.studio]]></itunes:email><itunes:name><![CDATA[David Garcia]]></itunes:name></itunes:owner><itunes:author><![CDATA[David Garcia]]></itunes:author><googleplay:owner><![CDATA[david@techdocs.studio]]></googleplay:owner><googleplay:email><![CDATA[david@techdocs.studio]]></googleplay:email><googleplay:author><![CDATA[David Garcia]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How to make your docs discoverable to AI agents]]></title><description><![CDATA[The basics that cover 90% of the work, plus what to do if you want to push further.]]></description><link>https://blog.techdocs.studio/p/how-to-make-your-docs-discoverable</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-make-your-docs-discoverable</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 16 Apr 2026 10:33:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/29f0a494-7a33-4068-ab3b-c35365c4694b_5980x3665.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Mintlify reported earlier this year that <a href="https://www.mintlify.com/blog/ai-traffic">almost half of documentation site traffic</a> now comes from AI, not humans. Claude Code, Cursor, Copilot. They crawl docs to answer developer questions.</p><p>Most docs sites are not set up for this. Some block AI crawlers by default in r<code>obots.txt</code> and don&#8217;t know it. Others rely on JavaScript rendering that crawlers can&#8217;t see. Others have great content that buries the answer under three paragraphs of context.</p><p>Here&#8217;s what we&#8217;ve been testing and fixing across consulting projects.</p><h2>Four tests to run now</h2><h3>Test 1: is your site crawlable without JavaScript?</h3><p>Open your docs in a fresh browser. Disable JavaScript. Reload.</p><p>If the page loads and the content is readable, AI crawlers can probably read it too. If not, you have a problem. Most crawlers don&#8217;t execute JavaScript. They see what curl sees.</p><p>You can also test directly:</p><pre><code><code>curl -A "ClaudeBot" https://your-docs.com/getting-started</code></code></pre><p>If the response is a mostly empty HTML shell with a &lt;script&gt; tag, AI crawlers are getting the same empty shell.</p><h3>Test 2: is your robots.txt blocking AI crawlers?</h3><p>Check https://your-docs.com/robots.txt for these user agents:</p><pre><code><code>GPTBot        # OpenAI
ClaudeBot     # Anthropic
PerplexityBot # Perplexity
CCBot         # Common Crawl (used by many LLMs)
Google-Extended # Google's AI training bot</code></code></pre><p>If any of these are disallowed, AI crawlers are skipping your site. Some CDNs and hosting platforms block AI bots by default as part of &#8220;bot protection&#8221; settings. Worth checking.</p><h3>Test 3: do you rank for questions users actually ask?</h3><p>Pick three questions a developer might ask about your product. Google them with your company name.</p><p>Example: <code>"biel.ai create account"</code>, <code>"biel.ai docusaurus install"</code>, <code>"biel.ai customize widget"</code></p><p>If you don&#8217;t rank in the first results, AI probably can&#8217;t find you either. AI retrieval uses the same signals as search engines, weighted differently. This applies both to live retrieval (what ChatGPT and Claude Code query in real time) and to training data (what the models learned from). No Google ranking usually means no AI ranking in either case.</p><h3>Test 4: does your docs answer common questions up front?</h3><p>Pick three common questions users ask about your product. Open the relevant docs page for each.</p><p>Is the answer on the page? Is it in the first paragraph, or buried three paragraphs deep?</p><p>AI agents retrieve a chunk of content and return an answer based on it. If your page opens with context before the answer, the agent will summarize the context instead. If the answer is missing entirely, the agent will either hallucinate or say it doesn&#8217;t know.</p><h2>The 90%: indexable + useful + popular</h2><p>Those four tests measure three things:</p><ul><li><p><strong>Indexable: </strong>can AI crawlers access your content?</p></li><li><p><strong>Useful: </strong>does your content answer what users ask?</p></li><li><p><strong>Popular: </strong>is your content referenced by high-signal sources?</p></li></ul><p>Cover these three and you&#8217;ve done 90% of the work.</p><h2>The 10%: extra credit</h2><p>We can&#8217;t know exactly which retrieval methods each AI system uses. The more signals we provide, the more discoverable our content becomes. If you&#8217;ve covered the basics and want to push further, here&#8217;s what to add.</p><p><strong>Publish an </strong><code>llms.txt</code><strong> file.</strong> Like <code>sitemap.xml</code> but for LLMs. A plain text file at your site root describing what your documentation contains and how it&#8217;s organized.</p><pre><code># Biel.ai Docs
&gt; AI chatbot for technical documentation

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

## API Reference
- [Authentication](https://docs.biel.ai/api/auth)</code></pre><p>Still emerging, still evolving, but increasingly supported.</p><p><strong>Serve markdown URLs.</strong> Crawlers and agents work best with clean markdown over bloated HTML. You can serve the same page at .md for a cleaner, token-efficient version. Example: yoursite.com/api.md instead of making them parse your HTML, CSS, navigation, and cookie banner.</p><p><strong>Structured data and metadata.</strong> Add Schema.org markup for pricing, FAQs, and product info. Keep Open Graph tags and meta descriptions accurate. Use page metadata to describe what each page is about, including keywords and synonyms for concepts users might call by different names (e.g. &#8220;asset&#8221; vs &#8220;token&#8221;).</p><p><strong>Publish machine-readable schemas. </strong>Make your OpenAPI specs publicly available. Same for GraphQL schemas, Protocol Buffers, or any structured contract your API exposes. Agents can parse these directly, no HTML scraping needed.</p><h2>Measure where you stand</h2><p><a href="https://buildwithfern.com/agent-score">Fern&#8217;s Agent Score</a> evaluates your docs against 22 checks covering most of the above. You get a grade and a list of issues, and a prompt you can paste into Claude Code to fix them automatically.</p><p>We ran it on our own docs and got a <strong>C </strong>on the first run. As they say, &#8220;the shoemaker&#8217;s son always goes barefoot&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jQZX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jQZX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 424w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 848w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1272w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jQZX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png" width="1456" height="873" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:873,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133640,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/194386309?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jQZX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 424w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 848w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1272w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But this didn&#8217;t stop <a href="https://biel.ai">Biel.ai</a> from ranking first when asking ChatGPT for the <strong>best AI chatbot for Docusaurus</strong>. Because we focused on the basics first.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D2kW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D2kW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 424w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 848w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1272w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D2kW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png" width="1456" height="827" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:827,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173852,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/194386309?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!D2kW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 424w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 848w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1272w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Start with the basics</h2><p>The 90% is where most of the value is. Be crawlable, improve the quality of your docs, make them popular. The extra 10% is worth doing if you&#8217;re already in good shape, but don&#8217;t skip the basics to chase it.</p><p>Most docs teams are still catching up. Start with the basics now and your docs will be easier to find when everyone else is still figuring it out.</p>]]></content:encoded></item><item><title><![CDATA[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[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>Top 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 even writing code themselves, they&#8217;re definitely not browsing your docs to figure out how to write it.</p><p>We'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. 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.</p><p>When you can describe your problem in natural language and get working code back, in context, inside your editor, there'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 just 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. Both are broken.</p><p>Training data is stale. If you shipped a new SDK version last month, the model doesn&#8217;t know. It&#8217;ll suggest deprecated methods with full confidence. Web search relies on SEO. The model might find a three-year-old Medium article instead of your current API reference. Your content&#8217;s discoverability depends on how well you rank, not on how good your docs are.</p><p>Neither approach has a special relationship with your documentation. It doesn&#8217;t know your custom error codes or the migration guide you published last Tuesday.</p><p>The result: AI generates code based on outdated examples and wrong parameter names. The developer doesn&#8217;t even know 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. It can&#8217;t search your internal network.</p><p>Your internal documentation is invisible to every AI tool your developers use daily. That&#8217;s a real problem.</p><h2>Connect your docs to the tools developers actually use</h2><p>There&#8217;s a fix for this. Instead of hoping AI models happen to find your docs, you can connect your documentation directly to the AI tools developers are already using.</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. Think of it as a bridge between an AI coding assistant and your documentation.</p><p>With an MCP server pointing at your docs, the assistant fetches answers directly from your content. Not from training data. Not from Google. From your docs, in real time.</p><p>And here&#8217;s the part most people miss: you register a description of what your docs contain. The AI uses that description to decide when to query your docs. 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&#8217;s not 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. That changes things.</p><p>Content quality matters more, not less. Every ambiguity, every outdated example, every missing step gets amplified. Bad docs produce bad AI answers at scale. Good docs produce answers that make developers trust your product.</p><p>Internal docs become reachable. 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>You also get better feedback. When AI assistants query your docs, you can see what questions are being asked. That&#8217;s direct signal about what developers are trying to do. Better than pageview analytics ever was.</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>And it doesn&#8217;t eliminate hallucinations. But it gets things wrong less 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. How machines query it.</p><p>Structured content, clear headings, explicit examples. These matter even more now. Your new reader doesn&#8217;t browse pages. It parses them.</p><p>Look into how MCP can work for your docs. Connect it to the tools your team already uses. See what questions come in.</p><p>Your docs are already being consumed by AI. The question is whether you&#8217;re serving the right answers or letting the model guess.</p>]]></content:encoded></item><item><title><![CDATA[Reflecting on 2025: Growth and learning]]></title><description><![CDATA[A look back at a year of progress, collaboration, and results at TechDocs Studio]]></description><link>https://blog.techdocs.studio/p/reflecting-on-2025-growth-learning</link><guid isPermaLink="false">https://blog.techdocs.studio/p/reflecting-on-2025-growth-learning</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 31 Dec 2025 09:16:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3198aed7-6eda-4409-a5b9-a0888438f6f5_5184x3456.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>From solo freelance work to a formal company. What a year! </p><p>2025 was full of growth and learning. <br><br>At <strong><a href="https://techdocs.studio">TechDocs Studio</a></strong>, we helped clients build scalable documentation infrastructure, automate workflows, and improve their docs, seeing firsthand how targeted improvements transform daily work for teams. <br><br>We also reinvested in our own products, including <strong><a href="https://biel.ai">Biel.ai</a></strong> and <strong><a href="https://pushfeedback.com">PushFeedback</a></strong>, tackling common documentation challenges our customers face. Watching these tools start to make a real difference has been incredibly rewarding.<br><br>This year reinforced that growth is not just about new contracts, but about trust, collaboration, and celebrating small wins together.<br><br>I&#8217;m grateful to everyone who made this year possible:</p><ul><li><p>&#120278;&#120316;&#120319;&#120306; &#120321;&#120306;&#120302;&#120314;: <strong>&#192;lex</strong>, <strong>Ra&#250;l</strong>. Thank you for bringing skill, dedication, joy to every project.</p></li><li><p>&#120289;&#120306;&#120324; &#120304;&#120313;&#120310;&#120306;&#120315;&#120321;&#120320;: <strong>Kristy-Leigh</strong>, <strong>Matthew</strong>, <strong>Rustom</strong>, <strong>Alex</strong>, <strong>Jimmy</strong>. Thank you for trusting us.</p></li><li><p>&#120287;&#120316;&#120315;&#120308;-&#120321;&#120306;&#120319;&#120314; &#120320;&#120322;&#120317;&#120317;&#120316;&#120319;&#120321;&#120306;&#120319;&#120320;: Anna, <strong>Tzach</strong>, <strong>Elena</strong>, Jorge, Alberto, Rich, Nate. Thank you for your continued trust and support over the years.</p></li><li><p>&#120280;&#120315;&#120302;&#120303;&#120313;&#120306;&#120319;&#120320;: <strong>Pablo</strong>, <strong>Juan Luis</strong>. Thank you for connecting us with exceptional people.</p></li><li><p>&#120281;&#120306;&#120306;&#120305;&#120303;&#120302;&#120304;&#120312; &#120304;&#120309;&#120302;&#120314;&#120317;&#120310;&#120316;&#120315;&#120320;: <strong>Lars</strong>, <strong>Tim</strong>, <strong>Harshil</strong>, <strong>Seonaid</strong>, Elena K. Your feedback improved our tools for everyone.</p></li><li><p>&#120284;&#120315;&#120320;&#120317;&#120310;&#120319;&#120302;&#120321;&#120310;&#120316;&#120315;: <strong>Ivan</strong>, <strong>Sabela</strong>, <strong>Cristina</strong>, <strong>Aleix</strong>, <strong>Xavi</strong>. I&#8217;ve learned a ton from all of you.</p></li><li><p>&#120290;&#120317;&#120306;&#120319;&#120302;&#120321;&#120310;&#120316;&#120315;&#120302;&#120313; &#120320;&#120322;&#120317;&#120317;&#120316;&#120319;&#120321;: <strong>Davinia</strong> for keeping our finances in order, <strong>Gonzalo</strong> for managing customer relations.</p></li></ul><p>...and to everyone we worked with behind the scenes, thank you for your support.</p><p>If you&#8217;re curious about what we built in 2025, you can explore our projects at <a href="http://techdocs.studio/work">techdocs.studio/work</a>:</p><h4><strong>Aligning Coiled&#8217;s documentation theme with their brand identity</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nG_n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nG_n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nG_n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png" width="1210" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de056b0c-8540-4827-98e7-06be526015c8_1210x727.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Coiled project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Coiled project screenshot" title="Coiled project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!nG_n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Following the successful launch of Coiled&#8217;s new website, we developed a custom Sphinx documentation theme that aligned with their updated brand identity, ensuring a cohesive user experience across docs.coiled.io and the main marketing site.</p><p><strong><a href="https://techdocs.studio/work/coiled-docs">Read case study</a></strong></p><div><hr></div><h4><strong>Custom Sphinx theme development for FiftyOne documentation</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rYck!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rYck!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!rYck!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rYck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png" width="1210" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Voxel51 project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Voxel51 project screenshot" title="Voxel51 project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!rYck!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!rYck!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We upgraded FiftyOne&#8217;s documentation from Sphinx 3 to the latest version, created a custom theme aligned with the new Voxel51 brand guidelines, and implemented advanced search capabilities with PushFeedback integration for continuous improvement.</p><p><strong><a href="https://techdocs.studio/work/voxel51">Read case study</a></strong></p><div><hr></div><h4><strong>From Webflow to Next.js: Creating a developer-first website for Coiled</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gom0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gom0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 424w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 848w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1272w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gom0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png" width="1210" height="711" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:711,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Coiled project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Coiled project screenshot" title="Coiled project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!Gom0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 424w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 848w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1272w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Migrated Coiled&#8217;s website from Webflow to a modern, component-based static site generator, empowering their team to manage content like they manage code.</p><p><strong><a href="https://techdocs.studio/work/coiled">Read case study</a></strong></p><div><hr></div><h4><strong>Automating API reference generation from OpenAPI and GraphQL schemas</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P2kG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P2kG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 424w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 848w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1272w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P2kG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png" width="1210" height="702" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3941050d-468e-425d-96c1-b38698ada110_1210x702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:702,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;MONEI project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="MONEI project screenshot" title="MONEI project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!P2kG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 424w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 848w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1272w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Migrated MONEI&#8217;s docs to Docusaurus v3, implemented cross-site search, and autogenerated consistent API documentation from OpenAPI and GraphQL contracts.</p><p><strong><a href="https://techdocs.studio/work/monei">Read case study</a></strong></p><div><hr></div><h4><strong>Unifying Blue Robotics&#8217; documentation with a custom Sphinx theme</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WpaP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WpaP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 424w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 848w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1272w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WpaP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png" width="1210" height="729" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:729,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Blue Robotics project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Blue Robotics project screenshot" title="Blue Robotics project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!WpaP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 424w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 848w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1272w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Developed a custom Sphinx theme with Material design aesthetics, implemented multi-language support, and set up a custom CI/CD pipeline for version management across their documentation ecosystem.</p><p><strong><a href="https://techdocs.studio/work/bluerobotics">Read case study</a></strong><br><br>Here&#8217;s to 2026: more learning, more impact, and helping teams build documentation that scales!</p><p>&#8212; David</p>]]></content:encoded></item><item><title><![CDATA[Three tools, five steps, no consistency ]]></title><description><![CDATA[Why screenshot workflows break (and what I'm building to fix it)]]></description><link>https://blog.techdocs.studio/p/three-tools-five-steps-no-consistency</link><guid isPermaLink="false">https://blog.techdocs.studio/p/three-tools-five-steps-no-consistency</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 09 Dec 2025 14:49:35 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a1b1e3c6-c303-443b-841a-156c67c1ca43_5000x3333.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve created hundreds of screenshots for technical docs.<br><br>One tool to capture, add arrows, and blur things. Another one to add steps. Then making sure it&#8217;s the right size. And somehow, every team member exports theirs at completely different dimensions.<br><br>So I&#8217;m building <strong>Screenshot Studio</strong> to fix this. A professional tool that handles everything from capture to export, with presets so the whole team stays consistent.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y3wC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y3wC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Y3wC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Y3wC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Y3wC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y3wC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg" width="1456" height="792" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:792,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:117112,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://techdocs.substack.com/i/181032781?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.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_!Y3wC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Y3wC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Y3wC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Y3wC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6321ddac-4828-488a-8897-46f749087894_2048x1114.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The waitlist just opened: <strong><a href="https://tally.so/r/RGxzzJ">https://tally.so/r/RGxzzJ</a></strong><br><br>Join for early access and help decide what features to build first.<br><br>What&#8217;s the most annoying part of your screenshot workflow? &#128071;</p>]]></content:encoded></item><item><title><![CDATA[Add an AI Chatbot to your documentation with Biel.ai]]></title><description><![CDATA[Set up Biel.ai on Docusaurus to let users ask questions in natural language.]]></description><link>https://blog.techdocs.studio/p/add-an-ai-chatbot-to-your-documentation</link><guid isPermaLink="false">https://blog.techdocs.studio/p/add-an-ai-chatbot-to-your-documentation</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Mon, 06 Jan 2025 16:23:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/be8ca192-61a5-47b7-a529-b707c20da215_4608x3456.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Users ask &#8220;Where are the docs for XYZ?&#8221; when the answer is right there on page 12. They just can&#8217;t find it.</p><p>An AI chatbot lets them ask in plain language and get instant answers from your existing documentation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FBxQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FBxQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png 424w, https://substackcdn.com/image/fetch/$s_!FBxQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png 848w, https://substackcdn.com/image/fetch/$s_!FBxQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!FBxQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FBxQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png" width="1456" height="797" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:797,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Biel.ai Dashboard&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="Biel.ai Dashboard" title="Biel.ai Dashboard" srcset="https://substackcdn.com/image/fetch/$s_!FBxQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png 424w, https://substackcdn.com/image/fetch/$s_!FBxQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png 848w, https://substackcdn.com/image/fetch/$s_!FBxQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!FBxQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b3812a-3f5c-4cd2-8791-6833786ca3c8_2880x1576.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here&#8217;s how to add <a href="https://biel.ai">Biel.ai</a>  to your documentation. This guide uses Docusaurus, but Biel.ai works with <a href="https://docs.biel.ai/installation/cdn">any static site generator</a>.</p><p><strong>Disclaimer:</strong> I built Biel.ai. It&#8217;s a paid service with a free trial.</p><h2>Prerequisites</h2><ul><li><p>Docusaurus site (existing or new)</p></li></ul><ul><li><p>Node.js v18 or higher</p></li><li><p>A sitemap for your docs site</p></li></ul><h2>Step 1:  Create a Biel.ai account</h2><p>Go to <strong><a href="https://app.biel.ai/">app.biel.ai</a> </strong>and sign up. Follow the on-screen instructions to create your account.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tepu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tepu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png 424w, https://substackcdn.com/image/fetch/$s_!Tepu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png 848w, https://substackcdn.com/image/fetch/$s_!Tepu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!Tepu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tepu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png" width="1456" height="797" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:797,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Create account&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="Create account" title="Create account" srcset="https://substackcdn.com/image/fetch/$s_!Tepu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png 424w, https://substackcdn.com/image/fetch/$s_!Tepu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png 848w, https://substackcdn.com/image/fetch/$s_!Tepu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!Tepu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ff4291-9c33-41f4-a613-14d2c1a6d4ac_2880x1576.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Step 2: Create your first chatbot project</h2><ol><li><p>In your Biel.ai dashboard, click on the <strong>Projects</strong> tab at the top.</p></li><li><p>Click <strong>Create project</strong>.</p></li><li><p>Enter your project details: </p><ul><li><p><strong>Project name:</strong> Choose a unique name.</p></li><li><p><strong>Sources:</strong> Select <strong>Sitemap</strong> and enter the sitemap URL of your Docusaurus site (e.g., <code>docs.domain.com/sitemap.xml</code>).</p></li></ul></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Erg3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Erg3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png 424w, https://substackcdn.com/image/fetch/$s_!Erg3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png 848w, https://substackcdn.com/image/fetch/$s_!Erg3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!Erg3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Erg3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png" width="1456" height="797" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:797,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Create project&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="Create project" title="Create project" srcset="https://substackcdn.com/image/fetch/$s_!Erg3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png 424w, https://substackcdn.com/image/fetch/$s_!Erg3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png 848w, https://substackcdn.com/image/fetch/$s_!Erg3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!Erg3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0405685a-ac65-4f2c-a0ce-7e0ec6e0636a_2880x1576.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol start="4"><li><p>Click <strong>Save</strong>.</p></li></ol><p>You&#8217;ll receive a unique Project ID. Keep this handy, as you&#8217;ll need it later.</p><h2>Step 3: Install the chatbot</h2><ol><li><p>Install the Docusaurus package:</p></li></ol><pre><code><code>npm install docusaurus-biel</code></code></pre><ol start="2"><li><p>Add Biel.ai to your <code>docusaurus.config.js</code> file:</p></li></ol><pre><code><code>plugins: [
    [
        &#8216;docusaurus-biel&#8217;,{
            project: &#8216;&lt;PROJECT_ID&gt;&#8217;,
            version: &#8216;latest&#8217;
        }
    ]
],</code></code></pre><blockquote><p>Replace <code>&lt;PROJECT_ID&gt;</code> with the Project ID you received earlier.</p></blockquote><ol start="3"><li><p>Run your site locally to ensure everything is working properly:</p></li></ol><pre><code><code>npm start</code></code></pre><p>The chatbot appears as a floating widget. Users can ask questions and get answers from your docs:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nIXM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nIXM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png 424w, https://substackcdn.com/image/fetch/$s_!nIXM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png 848w, https://substackcdn.com/image/fetch/$s_!nIXM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!nIXM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nIXM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png" width="1456" height="797" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:797,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI chatbot&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="AI chatbot" title="AI chatbot" srcset="https://substackcdn.com/image/fetch/$s_!nIXM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png 424w, https://substackcdn.com/image/fetch/$s_!nIXM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png 848w, https://substackcdn.com/image/fetch/$s_!nIXM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!nIXM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcdbd52d-d51c-4e6d-a4d3-29625300c557_2880x1576.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Step 4 - Customize your chatbot (optional)</h2><p>You can tweak the chatbot&#8217;s appearance and behavior in the <code>docusaurus.config.js</code> file. For example, you can change the button text or adjust the chatbot&#8217;s position:</p><pre><code><code>plugins: [
    [
        &#8216;docusaurus-biel&#8217;,{
            enable: true,
            project: &#8216;&lt;PROJECT_ID&gt;&#8217;,
            bielButtonText: &#8216;ASK AI&#8217;,
            buttonPosition: &#8216;center-right&#8217;,
            modalPosition: &#8216;sidebar-right&#8217;,
            headerTitle: &#8216;Biel.ai chatbot&#8217;
            buttonStyle: &#8216;dark&#8217;,
        }
    ]
],</code></code></pre><p>For advanced customization options, such as adding an initial message, suggested questions, or further editing the style, refer to <strong><a href="https://docs.biel.ai/category/customization">Customization</a></strong>.</p><h2>What the chatbot conversations tell you</h2><p>The chatbot tracks what users ask. This reveals gaps in your documentation.</p><p>If 50 people ask about webhook authentication but you don&#8217;t have a guide, that&#8217;s a signal to write one. The questions show what&#8217;s missing or unclear.</p><p>The AI only works as well as your documentation. Well-structured, comprehensive docs lead to better answers. Gaps lead to poor responses.</p>]]></content:encoded></item><item><title><![CDATA[Your docs aren't broken. They're just hard to find.]]></title><description><![CDATA[Spent hours creating your docs, but users still can&#8217;t find what they need?]]></description><link>https://blog.techdocs.studio/p/your-docs-arent-brokentheyre-just</link><guid isPermaLink="false">https://blog.techdocs.studio/p/your-docs-arent-brokentheyre-just</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 12 Dec 2024 08:31:04 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9e70ac67-e93e-4970-8990-c307ff6bc170_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#8220;Where are the docs for webhooks?&#8221;</p><p>It&#8217;s right there in the docs. But the user searched &#8220;automatic notifications&#8221; and got nothing. The docs call it webhooks. The user doesn&#8217;t.</p><p>Traditional search works when users know the right terms. They usually don&#8217;t. They describe what they&#8217;re trying to do, not what the feature is called. Your docs could be perfect and users would still miss them because they searched the wrong word.</p><h2>What we built</h2><p>Over the past year, we&#8217;ve been building <a href="https://biel.ai">Biel.ai</a> to solve this. It&#8217;s an AI chatbot that sits on your docs site and answers questions from your existing content. Think of it as ChatGPT, but trained on your product documentation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fzy-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fzy-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png 424w, https://substackcdn.com/image/fetch/$s_!fzy-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png 848w, https://substackcdn.com/image/fetch/$s_!fzy-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png 1272w, https://substackcdn.com/image/fetch/$s_!fzy-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fzy-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png" width="1456" height="797" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:797,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Hero&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="Hero" title="Hero" srcset="https://substackcdn.com/image/fetch/$s_!fzy-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png 424w, https://substackcdn.com/image/fetch/$s_!fzy-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png 848w, https://substackcdn.com/image/fetch/$s_!fzy-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png 1272w, https://substackcdn.com/image/fetch/$s_!fzy-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27e1b6d4-c07b-43b3-8cfe-8a47885a0282_3840x2101.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br>Users ask a question in plain language. Biel finds the answer in your docs and responds. No keyword matching. No browsing through a sidebar hoping to find the right page.</p><h2>What surprised us</h2><p>Biel didn&#8217;t just help users find answers. It showed us what was missing.</p><p>The conversation logs revealed gaps we didn&#8217;t know about. Topics we assumed were covered but weren&#8217;t. Workflows that lived in Slack but not in the docs. Basic things nobody had written down.</p><p>We went from guessing what users needed to seeing it in the data. The chatbot became a feedback tool as much as a support tool.</p><h2>Who this is for</h2><p>If you maintain documentation for a technical product and your users keep asking questions the docs already answer, Biel can help.</p><p>It works with any static site generator. Setup takes about 10 minutes.</p><p>Want to see it on your docs? Send me a message at <a href="mailto:david@techdocs.studio">david@techdocs.studio</a> with your docs URL and I&#8217;ll set up a demo.</p>]]></content:encoded></item><item><title><![CDATA[How to enable documentation pull request previews in GitHub]]></title><description><![CDATA[Set up PushPreview to auto-generate live docs previews for every PR.]]></description><link>https://blog.techdocs.studio/p/how-to-enable-documentation-pull</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-enable-documentation-pull</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 30 Jan 2024 10:03:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7c1e56d5-cbaa-4bc7-be83-4631e67d5221_3993x2995.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You&#8217;re reviewing a documentation pull request. You download the branch, build the docs locally, check if the new screenshots broke the layout, verify the formatting looks right. Repeat for every PR.</p><p><a href="https://pushpreview.com/">PushPreview</a> automates this. It builds a live preview for every pull request and posts the URL in a comment. Reviewers click the link, see the changes, and leave feedback on the actual content instead of fighting with build commands.</p><p>Here&#8217;s how to set it up.</p><p><strong>Disclaimer:</strong> built PushPreview. It&#8217;s free for open-source projects and paid for commercial use.</p><h2><strong>Prerequisites</strong></h2><ul><li><p>GitHub repository with documentation</p></li></ul><ul><li><p>Docs-as-Code setup (Markdown, static site generator)</p></li></ul><ul><li><p>Docs build process (npm, yarn, etc.)</p></li></ul><h2>Step 1 - Create a PushPreview API Key</h2><ol><li><p>Sign up at <a href="https://app.pushpreview.com/accounts/signup/">app.pushpreview.com</a></p></li><li><p>Navigate to the <strong>Teams</strong> tab:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uWr6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uWr6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png 424w, https://substackcdn.com/image/fetch/$s_!uWr6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png 848w, https://substackcdn.com/image/fetch/$s_!uWr6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png 1272w, https://substackcdn.com/image/fetch/$s_!uWr6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uWr6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png" width="1456" height="589" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:589,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Team tab&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="Team tab" title="Team tab" srcset="https://substackcdn.com/image/fetch/$s_!uWr6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png 424w, https://substackcdn.com/image/fetch/$s_!uWr6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png 848w, https://substackcdn.com/image/fetch/$s_!uWr6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png 1272w, https://substackcdn.com/image/fetch/$s_!uWr6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd28372a-c961-4b29-86fe-d86ac8b1880b_2874x1162.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li><li><p>Under <strong>API keys</strong>, click <strong>Create API Key:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ma8c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ma8c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png 424w, https://substackcdn.com/image/fetch/$s_!ma8c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png 848w, https://substackcdn.com/image/fetch/$s_!ma8c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!ma8c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ma8c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png" width="1456" height="769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Create API Key&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="Create API Key" title="Create API Key" srcset="https://substackcdn.com/image/fetch/$s_!ma8c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png 424w, https://substackcdn.com/image/fetch/$s_!ma8c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png 848w, https://substackcdn.com/image/fetch/$s_!ma8c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!ma8c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1f6dc6-965d-4dc9-bb44-b0bae71474df_2846x1504.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li><li><p>Copy the generated API key (you&#8217;ll need it next).</p></li></ol><h2>Step 2 - Configure a GitHub secret</h2><p>Add your PushPreview API key to GitHub:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pbWG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pbWG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png 424w, https://substackcdn.com/image/fetch/$s_!pbWG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png 848w, https://substackcdn.com/image/fetch/$s_!pbWG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!pbWG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pbWG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png" width="1456" height="772" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;GitHub Secrets&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="GitHub Secrets" title="GitHub Secrets" srcset="https://substackcdn.com/image/fetch/$s_!pbWG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png 424w, https://substackcdn.com/image/fetch/$s_!pbWG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png 848w, https://substackcdn.com/image/fetch/$s_!pbWG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!pbWG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7331e25-21d7-4fed-853f-3b04225d29dc_2838x1504.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>For a single repository:</strong></p><ol><li><p>Go to repository <strong>Settings</strong> &gt; <strong>Secrets and variables</strong> &gt; <strong>Actions</strong></p></li><li><p>Click <strong>New repository secret</strong></p></li></ol><p><strong>For multiple repositories (organization-wide):</strong></p><ol><li><p>Go to organization <strong>Settings</strong> &gt; <strong>Secrets and variables</strong> &gt; <strong>Actions</strong></p></li><li><p>Click <strong>New organization secret</strong></p></li></ol><p><strong>Add the secret:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!crTy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!crTy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png 424w, https://substackcdn.com/image/fetch/$s_!crTy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png 848w, https://substackcdn.com/image/fetch/$s_!crTy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png 1272w, https://substackcdn.com/image/fetch/$s_!crTy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!crTy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png" width="1456" height="772" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;GitHub Secrets&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="GitHub Secrets" title="GitHub Secrets" srcset="https://substackcdn.com/image/fetch/$s_!crTy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png 424w, https://substackcdn.com/image/fetch/$s_!crTy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png 848w, https://substackcdn.com/image/fetch/$s_!crTy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png 1272w, https://substackcdn.com/image/fetch/$s_!crTy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97b3f43a-9afc-4a83-9176-af72c4c8bdf0_2841x1506.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Name: <code>PUSHPREVIEW_TOKEN</code></p></li></ul><ul><li><p>Value: Your PushPreview API key</p></li><li><p>Click <strong>Add secret</strong>.</p></li></ul><h2>Step 3: Add the GitHub Action</h2><p>Create <code>.github/workflows/pushpreview.yml</code> in your repository:</p><pre><code><code>name: PushPreview

on:
  pull_request_target:
    types:
      - labeled

jobs:
  preview:
    runs-on: ubuntu-latest
    if: github.event.label.name == &#8216;preview&#8217;
    steps:
      - uses: actions/checkout@v3
      - name: Comment
        run: |
          gh pr comment ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --body &#8220;&#9881;&#65039; Hang tight! PushPreview is building your preview. URL will be shared soon.&#8221;
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Set BASE_URL
        run: echo &#8220;BASE_URL=/github/${{ github.repository }}/${{ github.event.number }}/&#8221; &gt;&gt; $GITHUB_ENV

      - name: Setup environment
        uses: actions/setup-node@v3
        with:
          node-version: 18

      - name: Build site
        run: |
          cd docs
          yarn install --frozen-lockfile
          yarn build

      - name: Generate preview
        uses: PushLabsHQ/pushpreview-action@1.0.5
        with:
          source-directory: ./docs/build
          github-token: ${{ secrets.GITHUB_TOKEN }}
          pushpreview-token: ${{ secrets.PUSHPREVIEW_TOKEN }}</code></code></pre><p>Modify the <code>Setup environment</code> and <code>Build site</code> steps to suit your static site build process:</p><pre><code>- name: Setup environment
uses: actions/setup-node@v3
with:
  node-version: 18

- name: Build site
  run: |
    cd docs
    yarn install --frozen-lockfile
    yarn build</code></pre><p>Ensure the <code>source-directory</code> in the <strong>Generate preview</strong> step points to your HTML files location post-build:</p><pre><code><code>- name: Generate preview
  uses: PushLabsHQ/pushpreview-action@1.0.5
  with:
    source-directory: ./docs/build
    github-token: ${{ secrets.GITHUB_TOKEN }}
    pushpreview-token: ${{ secrets.PUSHPREVIEW_TOKEN }}</code></code></pre><p>Save and push the updated <code>pushpreview.yml</code> to your repository main branch.<br><br><strong>Note:</strong> Enabling pull request previews for Docusaurus? You will also need to follow an extra step. For more information, see <strong><a href="https://docs.pushpreview.com/installation/docusaurus#3-edit-docusaurus-configuration">Pull request previews for Docusaurus</a></strong>.</p><h2>Step 4: Test It</h2><ol><li><p>Create a new pull request.</p></li><li><p>Add the preview label to the PR. (Don&#8217;t see the label? <a href="https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels#creating-a-label">Create it</a>).<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_!gsb5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gsb5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png 424w, https://substackcdn.com/image/fetch/$s_!gsb5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png 848w, https://substackcdn.com/image/fetch/$s_!gsb5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png 1272w, https://substackcdn.com/image/fetch/$s_!gsb5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gsb5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png" width="1456" height="676" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:676,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Add preview label&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="Add preview label" title="Add preview label" srcset="https://substackcdn.com/image/fetch/$s_!gsb5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png 424w, https://substackcdn.com/image/fetch/$s_!gsb5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png 848w, https://substackcdn.com/image/fetch/$s_!gsb5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png 1272w, https://substackcdn.com/image/fetch/$s_!gsb5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f96ac-f9ea-435d-a7ce-f27d53e6d901_1920x892.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li><li><p>Wait for the GitHub Action to run.</p></li><li><p>PushPreview comments on the PR with the preview URL:</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_Apj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_Apj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png 424w, https://substackcdn.com/image/fetch/$s_!_Apj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png 848w, https://substackcdn.com/image/fetch/$s_!_Apj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png 1272w, https://substackcdn.com/image/fetch/$s_!_Apj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_Apj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png" width="1456" height="582" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:582,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Preview link&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="Preview link" title="Preview link" srcset="https://substackcdn.com/image/fetch/$s_!_Apj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png 424w, https://substackcdn.com/image/fetch/$s_!_Apj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png 848w, https://substackcdn.com/image/fetch/$s_!_Apj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png 1272w, https://substackcdn.com/image/fetch/$s_!_Apj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b635ecb-8d1b-4c67-9a7c-21a1658508c2_1920x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li><li><p>Click the URL to see your changes live.</p></li></ol><h2>Troubleshooting</h2><p><strong>Preview fails to build:</strong> Check GitHub Actions logs. Verify your build command works locally. Confirm <code>source-directory</code> points to the right location.</p><p><strong>No comment appears:</strong> Make sure the <code>preview</code> label is added. Check that <code>PUSHPREVIEW_TOKEN</code> is in GitHub secrets. Verify the workflow file is in <code>.github/workflows/</code>.</p><p><strong>Preview shows 404:</strong> Check <code>source-directory</code> contains your built HTML files. For Docusaurus, make sure <code>BASE_URL</code> is set correctly.</p><h2>No more building locally to review docs</h2><p>Every PR gets a live preview automatically. No downloading branches. No local builds. Reviewers see the actual changes and focus on the content.</p><h2></h2><p></p>]]></content:encoded></item><item><title><![CDATA[Pull request previews made simple]]></title><description><![CDATA[No infrastructure to maintain, no admin access needed, fair open-source pricing.]]></description><link>https://blog.techdocs.studio/p/introducing-pushpreview-github-preview</link><guid isPermaLink="false">https://blog.techdocs.studio/p/introducing-pushpreview-github-preview</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Mon, 30 Oct 2023 07:12:30 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c06e9c77-9fab-493f-977c-e457da47e041_4021x3016.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every team I&#8217;ve worked with wants PR previews. Devs, writers, product owners. Everyone wants to see live changes before merging instead of building docs locally.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j00K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j00K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png 424w, https://substackcdn.com/image/fetch/$s_!j00K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png 848w, https://substackcdn.com/image/fetch/$s_!j00K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png 1272w, https://substackcdn.com/image/fetch/$s_!j00K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j00K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png" width="1456" height="382" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:382,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:130627,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j00K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png 424w, https://substackcdn.com/image/fetch/$s_!j00K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png 848w, https://substackcdn.com/image/fetch/$s_!j00K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png 1272w, https://substackcdn.com/image/fetch/$s_!j00K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b20571-b8e4-4af7-97e6-a39e1fb2eba2_1622x426.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But setting them up is painful.</p><p>You end up running parallel infrastructure just for previews. Most solutions need full GitHub org admin access, and security teams won&#8217;t approve it. Open-source projects get charged per user or per build minute. External contributors either can&#8217;t trigger previews or they rack up huge bills.</p><h2>What I built</h2><p>PushPreview is a GitHub Action. Drop <code>/preview</code> in a comment. Get a preview URL.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SaPN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SaPN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png 424w, https://substackcdn.com/image/fetch/$s_!SaPN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png 848w, https://substackcdn.com/image/fetch/$s_!SaPN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png 1272w, https://substackcdn.com/image/fetch/$s_!SaPN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SaPN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png" width="1456" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Hero&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Hero" title="Hero" srcset="https://substackcdn.com/image/fetch/$s_!SaPN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png 424w, https://substackcdn.com/image/fetch/$s_!SaPN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png 848w, https://substackcdn.com/image/fetch/$s_!SaPN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png 1272w, https://substackcdn.com/image/fetch/$s_!SaPN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba0870b-2ed9-4cda-b940-1233ba45bb0c_2850x1406.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>No infrastructure to maintain. No admin access needed. Private and public previews. Auto-cleanup when PRs close.</p><p>For open-source projects, pricing is fair. No per-user charges, no surprises from external contributors.</p><h2>Join the waitlist</h2><p>Sign up at <a href="http://pushpreview.com">pushpreview.com</a>. Questions? david@techdocs.studio</p>]]></content:encoded></item><item><title><![CDATA[PushFeedback beta (Free starter license)]]></title><description><![CDATA[I believe we share a common passion for technical documentation.]]></description><link>https://blog.techdocs.studio/p/beta-invitation-improve-your-technical</link><guid isPermaLink="false">https://blog.techdocs.studio/p/beta-invitation-improve-your-technical</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 01 Aug 2023 06:30:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5d7be91c-bc6f-4501-b9f6-71030e1016ed_4831x3221.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Users find errors in your docs. They don&#8217;t tell you.</p><p>You find out when the next person hits the same broken example. Or worse, you don&#8217;t find out at all.</p><p>I built <strong>PushFeedback</strong> to fix this.</p><h2>What It does</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f8fG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f8fG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!f8fG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!f8fG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!f8fG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f8fG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60598d5b-15b4-4e94-9b6f-4877b4ce845b_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;:582118,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://techdocs.substack.com/i/135608376?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_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_!f8fG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png 424w, https://substackcdn.com/image/fetch/$s_!f8fG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png 848w, https://substackcdn.com/image/fetch/$s_!f8fG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!f8fG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60598d5b-15b4-4e94-9b6f-4877b4ce845b_3024x1714.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A feedback widget for documentation sites. Users click, highlight the problem, submit feedback.</p><p>You get it where you work: GitHub issues, email, Trello, wherever.</p><p>No more &#8220;there&#8217;s a typo somewhere in the docs&#8221; messages. They show you exactly where.</p><h2>Beta access</h2><p>I&#8217;m looking for technical writers and docs teams to test PushFeedback and help shape what gets built next.</p><p><strong>What you get:</strong></p><p><strong>Free Starter license:</strong> unlimited feedback entries on one subdomain of your choice. Keep it after beta ends.</p><p><strong>How to join:<br><br>Go to </strong><a href="http://www.pushfeedback.com/beta">pushfeedback.com/beta</a> and sign up.</p><p>You&#8217;ll get a confirmation email with setup instructions. Adding the widget takes 5 minutes - a few lines of code like Google Analytics.</p><p><strong>What I need from you:</strong></p><p>Use it. Tell me what works, what doesn&#8217;t, what&#8217;s missing.</p><p>Beta spots are limited. Sign up: <a href="http://pushfeedback.com/beta">pushfeedback.com/beta</a></p><p>- David </p>]]></content:encoded></item><item><title><![CDATA[How to convert an OpenAPI document to MarkDown]]></title><description><![CDATA[Use Widdershins to parse OpenAPI 3.0 specs into Markdown for static site generators]]></description><link>https://blog.techdocs.studio/p/how-to-convert-an-openapi-document</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-convert-an-openapi-document</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Sun, 11 Apr 2021 12:02:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/62a0afa5-3f64-4540-9c01-d3ab358094d0_900x600.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You&#8217;ve written an OpenAPI spec. Now you need it as Markdown to integrate with your documentation site built on Sphinx, Docusaurus, or MkDocs.</p><p>Widdershins converts OpenAPI to Markdown. Here&#8217;s how to use it.</p><h2>Prerequisites</h2><ul><li><p>Have a valid <strong>OpenAPI document</strong>.</p></li><li><p>Have <strong>Node.js</strong> installed on your computer.</p></li><li><p>Have basic <strong>command-line</strong> knowledge.</p></li></ul><h2>What&#8217;s Widdershins?</h2><p><strong><a href="https://github.com/Mermade/widdershins">Widdershins</a></strong> is the open-source command-line tool we&#8217;ll use to convert the OpenAPI document to MarkDown. By default, Widdershins outputs MarkDown compatible with renderers such as Slate, ReSlate, and Shins.</p><p>Thanks to its customizable template system, we can customize the output to make it compatible with other static site generators such as Sphinx, Docusaurus or Mkdocs.</p><h2>Installing Widdershins</h2><p>Widdershins can be installed with NPM. In the command prompt, run the following command:</p><pre><code><code>npm install -g widdershins
</code></code></pre><p>After the installation has been completed, you can verify Widdershins installation by running <code>widdershins --version</code> in the command prompt.</p><h2>Parsing OpenAPI to MarkDown</h2><p>Once Widdershins is installed, run the following command in the console prompt:</p><pre><code><code>widdershins openapi.yaml -o openapi.md</code></code></pre><p>Replace <code>openapi.yaml</code> with the path to your OpenAPI file in YAML or JSON.</p><p>The command stores the resulting MarkDown file as <code>openapi.md</code>.</p><h2>Customizing the output with flags</h2><p>Widdershins comes with other built-in options to configure the output. For example, the option <code>omitHeader</code> removes the YAML front-matter in the generated Markdown file.</p><p>&#128073; Check out the complete list of available options in the <strong><a href="https://github.com/Mermade/widdershins#options">official docs</a></strong>.</p><p>In this example, we&#8217;re running the command from the previous step with the new option <code>omitHeader</code>:</p><pre><code><code>widdershins openapi.yaml -o openapi.md --omitHeader</code></code></pre><h2>Using custom-defined templates</h2><p>Suppose you want to change the output&#8217;s format, but you can&#8217;t achieve the level of customization you are looking for by just tweaking Widdershins CLI&#8217;s options. In this case, what we did is override the template Widdershins uses with a custom-defined template.</p><p>Here&#8217;s how:</p><ol><li><p>Create a new directory named <code>.widdershins</code>. Inside, create a second folder named <code>templates</code>.</p></li></ol><pre><code><code>mkdir -p .widdershins/templates
cd .widdershins/templates</code></code></pre><ol start="2"><li><p>Copy the contents from the file <strong><a href="https://github.com/Mermade/widdershins/blob/master/templates/openapi3/main.dot">main.dot</a></strong> in the folder you just created.</p></li></ol><pre><code><code>curl https://raw.githubusercontent.com/Mermade/widdershins/master/templates/openapi3/main.dot &gt; main.dot</code></code></pre><ol start="3"><li><p>Edit <code>main.dot</code> with your favorite code editor. The template engine Widdershins uses is <strong><a href="https://olado.github.io/doT/index.html">doT.js</a></strong>. This enables you to access any variable from the OpenAPI description, even vendor extensions or nested fields.</p></li></ol><p>From my experience, getting started with the template engine could be tricky. Here&#8217;s a cheatsheet with the delimiters I&#8217;ve been using more to render and iterate through variables:</p><p><strong>Evaluate</strong></p><pre><code><code>{{ var enums = []; }} // Executes the JavaScript code between the curly braces.</code></code></pre><p><strong>Print</strong></p><pre><code><code>{{=a}} // Renders the contents of the variable a
{{=a.b}}  // Renders the contents of the nested variable a.b</code></code></pre><p><strong>Conditional</strong></p><pre><code><code>{{? a }} hello {{?}} // If a is true, prints &#8220;hello&#8221;.
{{? !a }} hello {{?}} // If a is false, prints &#8220;hello&#8221;.
{{? a || b }} hello {{?}} // If a or b is true, prints &#8220;hello&#8221;.
{{? a &amp;&amp; b }} hello {{?}} // If a and b is true, prints &#8220;hello&#8221;.</code></code></pre><p><strong>Iteration</strong></p><pre><code><code>{{~ alist:a}} {{= a }} {{~}}  // Iterates throught alist and prints every element.</code></code></pre><ol start="4"><li><p>Run the Widdershins CLI. In this case, add the option <code>-u</code> with the path to <code>.widdershins/templates</code>:</p></li></ol><pre><code><code>widdershins openapi.yaml -o openapi.md -u ./widdershins/templates</code></code></pre><h2>Next steps</h2><p>Once the conversion works, automate it. Add Widdershins to your CI/CD pipeline so Markdown updates automatically when the OpenAPI spec changes.</p><p>For large API specs, the generated Markdown can be massive. Consider post-processing the output to split by endpoint or resource for better navigation.</p><p>Then configure your static site generator to handle the generated Markdown with proper styling and navigation.</p><div><hr></div><p>I write about documentation systems, developer experience, and technical writing. <a href="https://techdocs.substack.com/subscribe">Get new posts by email</a></p>]]></content:encoded></item><item><title><![CDATA[How to create slides from Markdown with Marp]]></title><description><![CDATA[Write presentations in plain text and export to HTML, PDF, or PowerPoint]]></description><link>https://blog.techdocs.studio/p/how-to-create-slides-from-markdown</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-create-slides-from-markdown</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Tue, 08 Dec 2020 12:02:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/75d762e2-de16-493c-ab6b-0ff928bce63e_3000x2143.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JohV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JohV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png 424w, https://substackcdn.com/image/fetch/$s_!JohV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png 848w, https://substackcdn.com/image/fetch/$s_!JohV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png 1272w, https://substackcdn.com/image/fetch/$s_!JohV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JohV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png" width="1400" height="782" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:782,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!JohV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png 424w, https://substackcdn.com/image/fetch/$s_!JohV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png 848w, https://substackcdn.com/image/fetch/$s_!JohV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png 1272w, https://substackcdn.com/image/fetch/$s_!JohV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7358cd5-2c3d-432a-83ca-2bfe2fef880e_1400x782.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Formatting slides takes forever. Choosing fonts, backgrounds, spacing between elements. You spend more time fighting with PowerPoint than writing content.</p><p>Marp converts Markdown files into presentation slides. Write in plain text, add formatting with simple syntax, export to whatever format you need.</p><p>Here&#8217;s how to use it.</p><h2>Creating the presentation</h2><p>No matter which tool you use to create the presentation, the first step is to know what you want to explain. Once you have the topic, open a new file with the extension <code>.md</code>. Then, write your notes for your presentation in plain text using Markdown syntax.</p><blockquote><p><em>New to Markdown? <a href="https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet">Here is a cheat sheet</a> with the most common annotations you&#8217;ll need to format titles, links, and tables.</em></p></blockquote><h2>Split into slides</h2><p>Once you have all the content outlined, split the slides with the annotation <code>---</code>. Here is an example.</p><pre><code># Slide 1

* Item 1
* item 2
* Item 3

---

# Slide 2

## Subtitle

Lorem ipsum dolor sit amet, consectetur adipiscing elit.</code></pre><h2>Export to different formats</h2><p>Marp is the framework we&#8217;ll use to turn Markdown into a beautiful slide deck. Unfortunately, the tool is not available as a web application, so you&#8217;ll need a bit of experience playing with the terminal to use the tool.</p><p>For example, try to run one of the following commands to convert a Markdown slide deck into HTML, PDF, or PTTX. Replace <code>PITCHME.md</code> with your file name.</p><pre><code># Convert slide deck into HTML
npx @marp-team/marp-cli PITCHME.md --html

# Convert slide deck into PDF
npx @marp-team/marp-cli PITCHME.md --pdf

# Convert slide deck into PowerPoint document (PPTX)
npx @marp-team/marp-cli PITCHME.md --pptx</code></pre><p>Do you want to preview the slides while you edit the contents? To run Marp in <strong>watch mode</strong>, run the following command instead:</p><pre><code>npx @marp-team/marp-cli -w PITCHME.md</code></pre><p>Then, open the resulting HTML file with your preferred browser.</p><p>If you use <strong>Visual Studio Code</strong>, you can preview the resulting slides as you write them with the <a href="https://marketplace.visualstudio.com/items?itemName=marp-team.marp-vscode">Marp Extension for VSCode</a>.</p><h2>Adding a theme</h2><p>Let&#8217;s change the style of the presentation. You can use one of the <a href="https://github.com/marp-team/marp-core/tree/master/themes#default">built-in themes</a>. At the top of the MarkDown file, define which theme you want to apply using the directive <code>theme</code>. The file header should look like this:</p><pre><code>---
theme: default
---</code></pre><p>I&#8217;ve decided to go with the theme <code>gaia</code> for my presentation. Moreover, Marp provides other <a href="https://marpit.marp.app/directives?id=local-directives-1">configurable directives</a> that simultaneously apply to all the slides.</p><p>For example, I defined default values for the font color, background image, and enabled pagination for my presentation.</p><pre><code>---
theme: gaia
color: #000
colorSecondary: #333
backgroundColor: #fff
backgroundImage: url(&#8217;https://marp.app/assets/hero-background.jpg&#8217;)
paginate: true
---</code></pre><h2>Styling a single slide</h2><p>In some situations, you&#8217;ll only want to enable a directive for a given slide. You can apply directives selectively with comments. The next code snippet shows how to disable pagination for the first slide.</p><pre><code>&lt;!-- <em>_paginate: false --&gt;

# Slide 1

* Item 1
* item 2
* Item 3
---</em></code></pre><p>Another common directive used per slide is <code>_class</code>. Each theme may come with a set of predefined classes. For example, the theme <code>gaia</code> introduces the class <code>lead</code>. When used, this centers the slide contents.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7D4l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7D4l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png 424w, https://substackcdn.com/image/fetch/$s_!7D4l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png 848w, https://substackcdn.com/image/fetch/$s_!7D4l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png 1272w, https://substackcdn.com/image/fetch/$s_!7D4l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7D4l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png" width="1400" height="719" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:719,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!7D4l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png 424w, https://substackcdn.com/image/fetch/$s_!7D4l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png 848w, https://substackcdn.com/image/fetch/$s_!7D4l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png 1272w, https://substackcdn.com/image/fetch/$s_!7D4l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6760fa82-fba9-4252-a110-cf17b704014d_1400x719.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, the first slide used the class centering the title, whereas the second slide didn&#8217;t, and the contents appear aligned on top.</p><p>If you&#8217;re a skilled CSS developer, you might want to create a custom theme from scratch. John Wadleigh explains how to do it in <a href="https://www.ansiblejunky.com/blog/custom-themes-with-marp/">Custom themes with Marp</a>.</p><h2>Working with images</h2><p><em>A picture speaks 1,000 words.</em> Most presentations include images, and Marp extends Markdown to define their size.</p><p>Add an image to your slides and change the size with<code> width</code> and <code>height</code> options.</p><pre><code>![w:32 h:32](image.jpg)</code></pre><p>You can also apply <strong>filters</strong> to images, such as adding opacity, a shadow, or even rotating the image. Here you have all the available <a href="https://marpit.marp.app/image-syntax?id=image-filters">predefined CSS filters</a> supported. For example, the following snippet shows how to convert a photo to grayscale mode.</p><pre><code>![grayscale](image.jpg)</code></pre><p>Marp also brings the option to use images as <strong>backgrounds</strong>. Backgrounds also accept the same filters as images and additional options to position them.</p><p>By default, all background images fit the slide, but you can use the option <code>auto</code> to preserve the original size.</p><pre><code># The image fits the slide
![bg](image.jpg)

# The image is not rescaled
![bg auto](image.jpg)

# The image is scaled in a percentual value
![bg 80%](image.jpg)</code></pre><p>The options <code>left</code> or <code>right</code> position the background to the specified side.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UdiW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UdiW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png 424w, https://substackcdn.com/image/fetch/$s_!UdiW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png 848w, https://substackcdn.com/image/fetch/$s_!UdiW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png 1272w, https://substackcdn.com/image/fetch/$s_!UdiW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UdiW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png" width="1400" height="384" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:384,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!UdiW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png 424w, https://substackcdn.com/image/fetch/$s_!UdiW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png 848w, https://substackcdn.com/image/fetch/$s_!UdiW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png 1272w, https://substackcdn.com/image/fetch/$s_!UdiW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e00f1d-01fd-4343-b284-0cefa253c3ce_1400x384.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>When this works</h2><p>Marp works well for:</p><ul><li><p>Technical presentations with code examples</p></li><li><p>Content-heavy slides without complex layouts</p></li><li><p>Presentations you need to version control</p></li><li><p>Slides that need to export to multiple formats</p></li></ul><p>Marp doesn&#8217;t work well for:</p><ul><li><p>Highly visual presentations with custom layouts</p></li><li><p>Slides with complex animations</p></li><li><p>Presentations where design matters more than content</p></li><li><p>Teams unfamiliar with Markdown or command line</p></li></ul><h2>The tradeoff</h2><p>Writing slides in Markdown is faster for content. No fighting with layout tools. Version control works. Export to any format.</p><p>But there&#8217;s a learning curve. The command-line workflow isn&#8217;t for everyone. Complex designs are harder than drag-and-drop tools.</p><p>If you spend more time writing content than designing slides, Marp saves time. If you need pixel-perfect custom layouts, stick with visual tools.</p>]]></content:encoded></item><item><title><![CDATA[How to split a large OpenAPI document into multiple files]]></title><description><![CDATA[Six steps to break monolithic API specs into maintainable modules.]]></description><link>https://blog.techdocs.studio/p/how-to-split-a-large-openapi-document</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-split-a-large-openapi-document</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 20 Feb 2020 15:02:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0dd8ed9d-1ba3-4877-86e6-e5d0b53ed3cb_4000x3000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So, you have written a large OpenAPI spec. At this point, you may have considered making the document modular by dividing it into smaller separate files.</p><p>In this article, we will break the <strong><a href="https://petstore.swagger.io/">Petstore example</a></strong> from the official OpenAPI documentation into smaller files.</p><p>A little side note before we start: This guide will be more helpful if you&#8217;ve documented an API project before by following the OpenAPI Specification. But don&#8217;t worry if you&#8217;re starting a new OpenAPI document from scratch. You&#8217;ll find a skeleton project ready to be adapted at the end of the post.</p><h2>Prerequisites</h2><p>This guide assumes that you&#8217;re familiar with the <strong><a href="https://swagger.io/specification/">OpenAPI Specification 3.0</a></strong> (previously known as Swagger). If you haven&#8217;t worked with the standard, I recommend you read first <strong><a href="https://swagger.io/docs/specification/about/">What is OpenAPI?</a></strong>. Then, try to write your first OpenAPI document.</p><h2>Step 1: Reuse responses</h2><p>It&#8217;s easier to start splitting an OpenAPI document if you&#8217;re already reusing schemas.</p><p>Say you have two endpoints: one listing all pets, another retrieving a single pet. Both return a <code>Pet</code> object.</p><pre><code><code>paths:
  /pets:
    get:
      summary: List all pets
      operationId: listPets
      tags:
        - pets
      parameters:
        - name: limit
          in: query
          description: How many items to return at one time (max 100)
          required: false
          schema:
            type: integer
            format: int32
      responses:
        &#8216;200&#8217;:
          description: A paged array of pets
          [...]
          content:
            application/json:    
              schema:
                  type: object
                  required:
                    - id
                    - name
                  properties:
                    id:
                      type: integer
                      format: int64
                    name:
                      type: string
                    tag:
                      type: string
  /pets/{petId}:
    get:
      summary: Info for a specific pet
      operationId: showPetById
      parameters:
        - name: petId
          in: path
          required: true
          description: The id of the pet to retrieve
          schema:
            type: string
      responses:
        &#8216;200&#8217;:
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                  type: object
                  required:
                    - id
                    - name
                  properties:
                    id:
                      type: integer
                      format: int64
                    name:
                      type: string
                    tag:
                      type: string</code></code></pre><p>Don&#8217;t define it twice. Following this example, define the schema once under <code>components/schemas</code> and reference it with <code>$ref</code>:</p><pre><code><code>paths:
  /pets/{petId}:
    get:
      summary: Info for a specific pet
      operationId: showPetById
      parameters:
        - name: petId
          in: path
          required: true
          description: The id of the pet to retrieve
          schema:
            type: string
      responses:
        &#8216;200&#8217;:
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                $ref: &#8220;#/components/schemas/Pet&#8221;
components:
  schemas:
    Pet:
      type: object
      required:
        - id
        - name
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        tag:
          type: string</code></code></pre><h2>Step 2 : Reuse parameters</h2><p>Now that you&#8217;re comfortable reusing schemas in the same file, let&#8217;s reuse the parameter <code>petId</code> from the operation <code>showPetById</code>.</p><p>As in the previous step, move the parameter from the path to the <code>components/parameters</code> section and use $ref to reference the component. </p><p>Here is an example:</p><pre><code><code>paths:
  /pets/{petId}:
    get:
      summary: Info for a specific pet
      operationId: showPetById
      parameters:
        - $ref: &#8216;#/components/parameters/petId&#8217;
[...]
components:
  parameters:
    petId:
        name: petId
        in: path
        required: true
        description: The id of the pet to retrieve
        schema:
            type: string</code></code></pre><h2><strong>Step 3 : Import from separate file</strong></h2><p>By reusing definitions, your file should now be shorter, even before starting to split it. If you&#8217;re already pleased with the file organization, you can stop reading now... You&#8217;re still with me? Then let&#8217;s make our file more modular!</p><p>Do you remember the keyword we&#8217;ve been using to reuse content? <code>$ref</code> not only allows us to import objects from the same file but from other sources like a separate file or a remote URL as well.</p><p>Create a new file named <code>schemas/Pet.yaml</code> for the <code>Pet</code> schema. Then, move the definition to the new file. Here&#8217;s how the resulting file should look like:</p><pre><code><code>// schemas/Pet.yaml
type: object
required:
- id
- name
properties:
id:
  type: integer
  format: int64
name:
  type: string
tag:
  type: string</code></code></pre><p>Now, point <code>$ref</code> to the new file&#8217;s location.</p><pre><code><code>// openapi.yaml
$ref: &#8220;./schemas/Pet.yaml&#8221;</code></code></pre><p>Finally, do the same for the other objects that you might want to split into separate files.</p><h2>Step 4: Move resources to a separate file</h2><p>Until now, you&#8217;ve seen how to organize response objects and parameters. However, if the document defines several endpoints, you&#8217;ll likely still have a large file that&#8217;s difficult to maintain. Next, we&#8217;ll organize the resource paths into multiple files.</p><p>For example, you could create the file <code>path/pet.yaml</code>. This file should define all the available operations, which their associated parameters and responses for the endpoint <code>/pets/{petId}</code>:</p><pre><code><code>//paths/pets.yaml
get:
  summary: Info for a specific pet
  operationId: showPetById
  tags:
    - pets
  parameters:
    - $ref: &#8220;../parameters/path/petId.yaml&#8221;
  responses:
    &#8216;200&#8217;:
      description: Expected response to a valid request
      content:
        application/json:
          schema:
            $ref: &#8220;../schemas/Pet.yaml&#8221;
    default:
      $ref: &#8220;../responses/UnexpectedError.yaml&#8221;</code></code></pre><p>Then, import each path definition from the main OpenAPI document as we have been doing with the schemas and parameters.</p><pre><code><code>//openapi.yaml
...
paths:
  /pets/{petId}:
      $ref: &#8220;./paths/pet.yaml</code></code></pre><p>Finally, repeat the process for every other resource you want to import from a separate file.</p><h2>Step 5: Organize with index files</h2><p>Let&#8217;s go one step further! We can split up the project even more to achieve better organization. Our goal is to end up with a main OpenAPI document as tiny as the following one:</p><pre><code><code>// openapi.yaml
openapi: &#8220;3.0.0&#8221;
info:
  version: 1.0.0
  title: Swagger Petstore
  description: Multi-file boilerplate for OpenAPI Specification.
  license:
    name: MIT
servers:
  - url: http://petstore.swagger.io/v1
paths:
  /pets:
    $ref: &#8220;./paths/pets.yaml&#8221;
  /pets/{petId}:
    $ref: &#8220;./paths/pet.yaml&#8221;
components:
  parameters:
    $ref: &#8220;./parameters/_index.yaml&#8221;
  schemas:
    $ref: &#8220;./schemas/_index.yaml&#8221;
  responses:
    $ref: &#8220;./responses/_index.yaml&#8221;</code></code></pre><p>To achieve this, create the following <code>_index.yaml</code> files:</p><ul><li><p><code>parameters/_index.yaml</code></p></li><li><p><code>schemas/_index.yaml</code></p></li><li><p><code>responses/_index.yaml</code></p></li></ul><p>Then, move to every file its definitions. For instance, <code>./schemas/_index.yaml</code> for the Petstore example would look like:</p><pre><code><code>Pet:
  $ref: &#8220;./Pet.yaml&#8221;
Pets:
  $ref: &#8220;./Pets.yaml&#8221;
Error:
  $ref: &#8220;./Error.yaml&#8221;</code></code></pre><h2>Step 6: Bundle back to one file</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zhpv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zhpv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png 424w, https://substackcdn.com/image/fetch/$s_!Zhpv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png 848w, https://substackcdn.com/image/fetch/$s_!Zhpv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png 1272w, https://substackcdn.com/image/fetch/$s_!Zhpv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zhpv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png" width="1200" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Zhpv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png 424w, https://substackcdn.com/image/fetch/$s_!Zhpv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png 848w, https://substackcdn.com/image/fetch/$s_!Zhpv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png 1272w, https://substackcdn.com/image/fetch/$s_!Zhpv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf091c41-0d09-43ce-b301-d8457107c4a3_1200x400.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Some of the OpenAPI based tools support only a single file as an input. To continue using the spec with those tools, we&#8217;ll compile all the different files we&#8217;ve created with the command-line tool <strong><a href="https://github.com/APIDevTools/swagger-cli">swagger-cli</a></strong>.</p><p>1. Open a new terminal. Then, install the package <code>swagger-cli</code> globally:</p><pre><code><code>npm install -g swagger-cli</code></code></pre><p>2. Run the command to merge all the files into one:</p><pre><code><code>swagger-cli bundle openapi.yaml --outfile _build/openapi.yaml --type yaml</code></code></pre><p>3. If everything goes well, you should see a single OpenAPI file compiled under the <code>_build</code> directory.</p><h2>Putting all together</h2><p>Splitting a large OpenAPI spec into multiple files makes it more maintainable. In my experience, it also makes other developers more willing to contribute. When the project is well organized, proposing changes feels less intimidating.</p><p>Here&#8217;s the repository with the Petstore example divided into multiple files: <a href="https://github.com/dgarcia360/openapi-boilerplate">openapi-boilerplate</a>. Feel free to reuse it as a starting point.</p><div><hr></div><p>I write about documentation systems, developer experience, and technical writing. <a href="https://techdocs.substack.com/subscribe">Get new posts by email</a></p>]]></content:encoded></item></channel></rss>