<?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>Mon, 31 Aug 2026 22:15:04 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[15 tips for better AI answers from your docs]]></title><description><![CDATA[What we tell companies after they add an AI chatbot, MCP server, or internal AI assistant to their documentation.]]></description><link>https://blog.techdocs.studio/p/15-tips-for-better-ai-answers-from</link><guid isPermaLink="false">https://blog.techdocs.studio/p/15-tips-for-better-ai-answers-from</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 22 Apr 2026 12:04:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2df755db-74dc-4f03-ae5f-5324bf4dac5b_5472x3648.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We&#8217;ve spent the past two years helping companies connect their documentation to AI assistants and Model Context Protocol (MCP) servers. We also built <a href="https://bie.ai">Biel.ai</a>, so we see the same question as consultants and as builders: <em>how do we make the answers better?<br></em><br>Teams often start by changing the model or rewriting the prompt. That can help, but many weak answers begin earlier. The assistant retrieved the wrong passage, pulled an outdated version, lost the page context during ingestion, or had no reliable source to work with.</p><p>These are the checks we make first.</p><h2>1. Write sections that survive retrieval</h2><p>A reader sees the page around a paragraph. A documentation assistant may receive only that paragraph and its heading.</p><p>Make each section understandable when it is retrieved on its own. Name the product, feature, or task in the heading. Restate prerequisites that change the meaning of the instructions. Replace headings such as &#8220;Configure it&#8221; or &#8220;Next steps&#8221; with headings that say what is being configured and what happens next.</p><p>You do not need to repeat the whole page. You need enough context for one section to remain accurate after it has been separated from the page.</p><h2>2. Start with real user questions</h2><p>Support tickets, site search terms, sales calls, and assistant logs show how people describe their problems. Use that language to check whether the docs contain a direct answer.</p><p>The page does not need to use a question as its title. It does need to cover the question users actually ask. &#8220;Authentication&#8221; may be a tidy section name, but users are more likely to ask why their token expired or how to rotate a key without downtime.</p><h2>3. Show the complete procedure</h2><p>Code examples need imports, configuration, file paths, and any setup required to run them. Procedures need prerequisites, expected results, and the important failure cases.</p><p>This matters because the assistant may retrieve the code block without the paragraph three sections earlier that explains where it belongs. A complete example gives the model fewer gaps to fill and gives the reader something they can verify.</p><h2>4. Use one term for each concept</h2><p>Choose a preferred term and use it consistently. If &#8220;API key,&#8221; &#8220;access token,&#8221; and &#8220;credential&#8221; mean different things in your product, the docs should make that distinction clear.</p><p>Keep known synonyms in a glossary, redirects, search configuration, or retrieval metadata when your system uses them. Do not scatter synonyms through the prose only to improve matching. That makes the documentation harder to read and can blur distinctions the assistant needs to preserve.</p><h2>5. Curate what goes into the index</h2><p>Do not add every page you own by default. Marketing pages, old release notes, duplicate migrations, archived versions, and internal drafts can compete with the current documentation.</p><p>Decide which sources are authoritative for each product and version. Exclude duplicate or obsolete content unless users still need it, and label historical material clearly when you keep it. This is indexing or retrieval scope, not model training.</p><h2>6. Make versions and applicability obvious</h2><p>A correct answer for the wrong version is still a wrong answer.</p><p>State which product, version, deployment model, plan, operating system, or SDK a section applies to. Put that information close to the instructions instead of relying only on a selector elsewhere on the page. When the same procedure covers several variants, say what changes for each one.</p><p>Archive or redirect unsupported versions when possible. If older documentation must remain available, keep it clearly separated from the current set.</p><h2>7. Preserve context when pages are split into chunks</h2><p>Most retrieval systems divide a page into smaller chunks before indexing it. A section called &#8220;Limits&#8221; becomes ambiguous if the chunk no longer carries the page title, heading path, product, or version.</p><p>Inspect the content after ingestion as well as the source page. Each chunk should retain the context needed to identify it. That may include the page title, parent headings, product, version, and a short description of what the section covers.</p><p>Anthropic describes a related technique in its guide to <a href="https://www.anthropic.com/engineering/contextual-retrieval">contextual retrieval</a>: adding chunk-specific context before content is indexed.</p><h2>8. Use metadata for decisions the system can enforce</h2><p>Metadata is most useful when the retrieval layer can filter on it. Product, version, deployment model, audience, lifecycle status, and access level are practical fields because they can stop the wrong source from reaching the model.</p><p>Do not add tags and assume they improve retrieval automatically. Confirm that the ingestion pipeline preserves them and that search applies them. For example, OpenAI&#8217;s retrieval tools support <a href="https://developers.openai.com/api/docs/guides/retrieval#attribute-filtering">attribute filtering before semantic search</a>.</p><h2>9. Keep important information in text</h2><p>Some models can interpret screenshots and diagrams, but documentation pipelines do not all ingest them in the same way. A critical instruction that exists only inside an image is easy to lose.</p><p>Explain the required action, value, or decision in the surrounding text. Use alt text to describe the purpose of the image, and add a caption when the reader needs context. For a diagram, summarize the relationship or sequence the diagram is meant to show.</p><h2>10. Give the ingestion pipeline a clean source</h2><p>Find out what the assistant actually reads. It may crawl the published site, ingest Markdown from a repository, use an API, or receive selected resources through an MCP server.</p><p>If it crawls the site, make the main content available as clean HTML and use stable, crawlable URLs. Google can render JavaScript, but it still recommends server-side or pre-rendering because <a href="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics">not every bot runs JavaScript</a>. If the assistant ingests the repository instead, test the generated text after parsing and remove navigation, cookie banners, and other page furniture.</p><h2>11. Scope by product, version, and access</h2><p>One assistant can cover several products when the system can identify the user&#8217;s context and filter the sources reliably. Separate assistants or MCP servers make more sense when the products have different owners, audiences, or access boundaries.</p><p>Do not split the system per product as a reflex. First decide which content a user should be able to reach and which questions genuinely need information from more than one product. For restricted MCP resources, apply authorization and least-privilege access. The official MCP guidance recommends <a href="https://modelcontextprotocol.io/docs/tutorials/security/authorization), rather than catch-all access">scopes tied to specific tools or capabilities</a>.</p><h2>12. Require sources and a safe fallback</h2><p>An answer should point back to the documentation that supports it. Source links let readers check the details and help your team diagnose why an answer went wrong.</p><p>Decide what the assistant should do when the evidence is missing, conflicting, or outdated. A clear &#8220;I couldn&#8217;t find this in the documentation&#8221; is more useful than a plausible guess. It should also tell the reader where to go next, such as support, a product owner, or the relevant documentation area.</p><h2>13. Build an evaluation set from real questions</h2><p>Collect questions from support, search, onboarding, and assistant logs. Include common tasks, edge cases, ambiguous wording, version-specific questions, and questions the assistant should refuse to answer.</p><p>For each question, record the expected source and the criteria for an acceptable answer. Keep the first set small enough to review by hand, then add new cases as users expose gaps. OpenAI&#8217;s <a href="https://developers.openai.com/api/docs/guides/evaluation-best-practices#example-q-a-over-docs">evaluation guidance for Q&amp;A over documentation</a> recommends combining production data, expert-written answers, and historical logs.</p><h2>14. Test retrieval and the final answer separately</h2><p>When an answer fails, check the retrieved sources before changing the prompt.</p><p>If the correct section never appeared, investigate the content, chunking, metadata, filters, or search configuration. If the correct source appeared but the answer was still wrong, look at the instructions, model, and answer-generation step. Measuring both stages prevents a prompt change from hiding a retrieval problem.</p><p>Run the evaluation set against a staging index whenever you change the corpus, chunking, retrieval settings, prompt, or model. Keep the previous results so you can see what improved and what regressed.</p><h2>15.  Start with a bounded pilot and classify every failure</h2><p>You do not need perfect documentation before testing an assistant. You do need a clear scope. Start with one product, audience, or workflow where the sources are reviewed and users have another route to get help.</p><p>Log weak and unanswered responses, then classify the cause:</p><ul><li><p>The answer is not documented</p></li><li><p>The source is outdated or contradictory</p></li><li><p>The correct source was not retrieved</p></li><li><p>The wrong product or version was selected</p></li><li><p>The user did not have the right access</p></li><li><p>The model misread good evidence</p></li></ul><p>The first two clearly belong in the documentation roadmap. The others point to retrieval, scoping, access, or answer generation. Some failures will need changes in more than one place.</p><p>If you are unsure where to begin, run ten questions that your support team answers every week. Check the sources the assistant retrieved alongside the prose it generated. You will know what to fix next.</p><div><hr></div><p>We built <a href="https://biel.ai">Biel.ai</a> around this approach. Its content-gap analytics show what users are asking, which questions keep coming up, and where your documentation needs work.</p>]]></content:encoded></item><item><title><![CDATA[How to make your docs discoverable to AI agents]]></title><description><![CDATA[The basics that cover 90% of the work, plus what to do if you want to push further.]]></description><link>https://blog.techdocs.studio/p/how-to-make-your-docs-discoverable</link><guid isPermaLink="false">https://blog.techdocs.studio/p/how-to-make-your-docs-discoverable</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Thu, 16 Apr 2026 10:33:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/29f0a494-7a33-4068-ab3b-c35365c4694b_5980x3665.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Mintlify reported earlier this year that <a href="https://www.mintlify.com/blog/ai-traffic">almost half of documentation site traffic</a> now comes from AI, not humans. Claude Code, Cursor, Copilot. They crawl docs to answer developer questions.</p><p>Most docs sites are not set up for this. Some block AI crawlers by default in r<code>obots.txt</code> and don&#8217;t know it. Others rely on JavaScript rendering that crawlers can&#8217;t see. Others have great content that buries the answer under three paragraphs of context.</p><p>Here&#8217;s what we&#8217;ve been testing and fixing across consulting projects.</p><h2>Four tests to run now</h2><h3>Test 1: is your site crawlable without JavaScript?</h3><p>Open your docs in a fresh browser. Disable JavaScript. Reload.</p><p>If the page loads and the content is readable, AI crawlers can probably read it too. If not, you have a problem. Most crawlers don&#8217;t execute JavaScript. They see what curl sees.</p><p>You can also test directly:</p><pre><code><code>curl -A "ClaudeBot" https://your-docs.com/getting-started</code></code></pre><p>If the response is a mostly empty HTML shell with a &lt;script&gt; tag, AI crawlers are getting the same empty shell.</p><h3>Test 2: is your robots.txt blocking AI crawlers?</h3><p>Check https://your-docs.com/robots.txt for these user agents:</p><pre><code><code>GPTBot        # OpenAI
ClaudeBot     # Anthropic
PerplexityBot # Perplexity
CCBot         # Common Crawl (used by many LLMs)
Google-Extended # Google's AI training bot</code></code></pre><p>If any of these are disallowed, AI crawlers are skipping your site. Some CDNs and hosting platforms block AI bots by default as part of &#8220;bot protection&#8221; settings. Worth checking.</p><h3>Test 3: do you rank for questions users actually ask?</h3><p>Pick three questions a developer might ask about your product. Google them with your company name.</p><p>Example: <code>"biel.ai create account"</code>, <code>"biel.ai docusaurus install"</code>, <code>"biel.ai customize widget"</code></p><p>If you don&#8217;t rank in the first results, AI probably can&#8217;t find you either. AI retrieval uses the same signals as search engines, weighted differently. This applies both to live retrieval (what ChatGPT and Claude Code query in real time) and to training data (what the models learned from). No Google ranking usually means no AI ranking in either case.</p><h3>Test 4: does your docs answer common questions up front?</h3><p>Pick three common questions users ask about your product. Open the relevant docs page for each.</p><p>Is the answer on the page? Is it in the first paragraph, or buried three paragraphs deep?</p><p>AI agents retrieve a chunk of content and return an answer based on it. If your page opens with context before the answer, the agent will summarize the context instead. If the answer is missing entirely, the agent will either hallucinate or say it doesn&#8217;t know.</p><h2>The 90%: indexable + useful + popular</h2><p>Those four tests measure three things:</p><ul><li><p><strong>Indexable: </strong>can AI crawlers access your content?</p></li><li><p><strong>Useful: </strong>does your content answer what users ask?</p></li><li><p><strong>Popular: </strong>is your content referenced by high-signal sources?</p></li></ul><p>Cover these three and you&#8217;ve done 90% of the work.</p><h2>The 10%: extra credit</h2><p>We can&#8217;t know exactly which retrieval methods each AI system uses. The more signals we provide, the more discoverable our content becomes. If you&#8217;ve covered the basics and want to push further, here&#8217;s what to add.</p><p><strong>Publish an </strong><code>llms.txt</code><strong> file.</strong> Like <code>sitemap.xml</code> but for LLMs. A plain text file at your site root describing what your documentation contains and how it&#8217;s organized.</p><pre><code># Biel.ai Docs
&gt; AI chatbot for technical documentation

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

## API Reference
- [Authentication](https://docs.biel.ai/api/auth)</code></pre><p>Still emerging, still evolving, but increasingly supported.</p><p><strong>Serve markdown URLs.</strong> Crawlers and agents work best with clean markdown over bloated HTML. You can serve the same page at .md for a cleaner, token-efficient version. Example: yoursite.com/api.md instead of making them parse your HTML, CSS, navigation, and cookie banner.</p><p><strong>Structured data and metadata.</strong> Add Schema.org markup for pricing, FAQs, and product info. Keep Open Graph tags and meta descriptions accurate. Use page metadata to describe what each page is about, including keywords and synonyms for concepts users might call by different names (e.g. &#8220;asset&#8221; vs &#8220;token&#8221;).</p><p><strong>Publish machine-readable schemas. </strong>Make your OpenAPI specs publicly available. Same for GraphQL schemas, Protocol Buffers, or any structured contract your API exposes. Agents can parse these directly, no HTML scraping needed.</p><h2>Measure where you stand</h2><p><a href="https://buildwithfern.com/agent-score">Fern&#8217;s Agent Score</a> evaluates your docs against 22 checks covering most of the above. You get a grade and a list of issues, and a prompt you can paste into Claude Code to fix them automatically.</p><p>We ran it on our own docs and got a <strong>C </strong>on the first run. As they say, &#8220;the shoemaker&#8217;s son always goes barefoot&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jQZX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jQZX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 424w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 848w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1272w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jQZX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png" width="1456" height="873" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:873,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133640,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/194386309?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jQZX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 424w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 848w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1272w, https://substackcdn.com/image/fetch/$s_!jQZX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cb282f3-4034-4af1-aae9-403e076a2044_1615x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But this didn&#8217;t stop <a href="https://biel.ai">Biel.ai</a> from ranking first when asking ChatGPT for the <strong>best AI chatbot for Docusaurus</strong>. Because we focused on the basics first.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D2kW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D2kW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 424w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 848w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1272w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D2kW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png" width="1456" height="827" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:827,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173852,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techdocs.studio/i/194386309?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!D2kW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 424w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 848w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1272w, https://substackcdn.com/image/fetch/$s_!D2kW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c1dc826-bbb4-4be6-bdd2-3e994457ebc1_1705x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Start with the basics</h2><p>The 90% is where most of the value is. Be crawlable, improve the quality of your docs, make them popular. The extra 10% is worth doing if you&#8217;re already in good shape, but don&#8217;t skip the basics to chase it.</p><p>Most docs teams are still catching up. Start with the basics now and your docs will be easier to find when everyone else is still figuring it out.</p>]]></content:encoded></item><item><title><![CDATA[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>Some engineers at Anthropic and OpenAI report that <a href="https://fortune.com/2026/01/29/100-percent-of-code-at-anthropic-and-openai-is-now-ai-written-boris-cherny-roon/">AI now writes 100% of their code</a>. If developers aren&#8217;t writing much of the code themselves, they&#8217;re certainly not browsing your docs to figure out how to write it.</p><p>We&#8217;re seeing this in the documentation projects we work on. AI-driven traffic to docs sites is growing while human visits drop. Mintlify reports that <a href="https://mintlify.com/blog/almost-half-your-docs-traffic-is-ai">almost half of documentation site traffic now comes from AI agents</a>, not humans. Your docs have a new primary reader, and it doesn&#8217;t browse. It queries.</p><h2>From reading to asking</h2><p>Documentation always competed with Stack Overflow, GitHub issues, and asking a coworker on Slack. AI coding assistants just won that competition. When you can describe your problem in natural language and get working code back, in context, inside your editor, there&#8217;s no reason to open a docs site.</p><p>But that doesn&#8217;t mean docs matter less. If anything, accuracy matters more now. A human reading a confusing paragraph will slow down, re-read, maybe search for other sources. An AI will pick an interpretation and ship it.</p><h2>The problem with public AI models</h2><p>When a developer asks an AI about your product, the model either relies on training data or searches the web, and both are broken.</p><p>Training data is stale. If you shipped a new SDK version last month, the model doesn&#8217;t know, and it&#8217;ll suggest deprecated methods with full confidence. Web search relies on SEO, so the model might surface a three-year-old Medium article instead of your current API reference. Your discoverability depends on how well you rank, not on how good your docs are.</p><p>Neither approach has any special relationship with your documentation. The model doesn&#8217;t know your custom error codes or the migration guide you published last Tuesday. So it generates code based on outdated examples and wrong parameter names, and the developer doesn&#8217;t find out the answer was wrong until something breaks.</p><h2>It gets worse for internal docs</h2><p>If public docs have a discoverability problem, internal docs are completely invisible.</p><p>Your internal wiki, your Confluence spaces, your private Notion pages. AI models can&#8217;t see any of it. A new engineer joins your team, asks their AI assistant &#8220;How do I deploy to staging?&#8221;, and gets nothing useful. The model wasn&#8217;t trained on your deployment runbook, and it can&#8217;t search your internal network. Every AI tool your developers use daily is blind to the documentation they need most.</p><h2>Connect your docs to the tools developers actually use</h2><p>There&#8217;s a fix. Instead of hoping AI models happen to find your docs, you can connect your documentation directly to the AI tools developers already use.</p><p>This is what the <strong><a href="https://www.anthropic.com/news/model-context-protocol">Model Context Protocol (MCP)</a></strong> enables. It&#8217;s an open standard that lets AI assistants connect to external data sources, a bridge between an AI coding assistant and your documentation. With an MCP server pointing at your docs, the assistant fetches answers directly from your content in real time, not from training data and not from Google.</p><p>The part worth understanding is how the assistant decides when to use it. You register a description of what your docs contain, and the AI uses that description to decide when to query them. If a developer is working with your SDK and hits an authentication problem, the assistant knows your docs are the right place to look. It isn&#8217;t a keyword search. The AI decides based on context.</p><h2>What this means for documentation teams</h2><p>Your docs go from a website people browse to a data source AI tools query, and that shifts what matters.</p><p>Content quality counts for more, not less. Every ambiguity, every outdated example, every missing step gets amplified, because bad docs now produce bad AI answers at scale. Good docs produce answers that make developers trust your product.</p><p>Internal docs become reachable too. That deployment runbook, your team&#8217;s coding standards, your architecture decision records: MCP can expose them to AI assistants inside your organization.</p><p>And you get better feedback than pageviews ever gave you. When AI assistants query your docs, you can see what questions are being asked, which is direct signal about what developers are actually trying to do.</p><h2>What this doesn&#8217;t fix</h2><p>MCP doesn&#8217;t fix bad docs. If your content is incomplete or outdated, AI will serve incomplete, outdated answers, just faster.</p><p>It doesn&#8217;t eliminate hallucinations either, though it gets things wrong less often when it has access to the right content. Your docs site is still the canonical source of truth. When AI gives a wrong answer, that&#8217;s where developers go to verify. MCP just makes your content reachable from more places.</p><h2>Where to start</h2><p>Start thinking about how AI assistants consume your content, not how humans read it. Structured content, clear headings, explicit examples: these matter even more when your new reader parses pages instead of browsing them.</p><p>Then look into how MCP can work for your docs. Connect it to the tools your team already uses, and see what questions come in.</p><p>Your docs are already being consumed by AI. The only question is whether you&#8217;re serving the right answers or letting the model guess.</p>]]></content:encoded></item><item><title><![CDATA[Reflecting on 2025: Growth and learning]]></title><description><![CDATA[A look back at a year of progress, collaboration, and results at TechDocs Studio]]></description><link>https://blog.techdocs.studio/p/reflecting-on-2025-growth-learning</link><guid isPermaLink="false">https://blog.techdocs.studio/p/reflecting-on-2025-growth-learning</guid><dc:creator><![CDATA[David Garcia]]></dc:creator><pubDate>Wed, 31 Dec 2025 09:16:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3198aed7-6eda-4409-a5b9-a0888438f6f5_5184x3456.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>From solo freelance work to a formal company. What a year! </p><p>2025 was full of growth and learning. <br><br>At <strong><a href="https://techdocs.studio">TechDocs Studio</a></strong>, we helped clients build scalable documentation infrastructure, automate workflows, and improve their docs, seeing firsthand how targeted improvements transform daily work for teams. <br><br>We also reinvested in our own products, including <strong><a href="https://biel.ai">Biel.ai</a></strong> and <strong><a href="https://pushfeedback.com">PushFeedback</a></strong>, tackling common documentation challenges our customers face. Watching these tools start to make a real difference has been incredibly rewarding.<br><br>This year reinforced that growth is not just about new contracts, but about trust, collaboration, and celebrating small wins together.<br><br>I&#8217;m grateful to everyone who made this year possible:</p><ul><li><p>&#120278;&#120316;&#120319;&#120306; &#120321;&#120306;&#120302;&#120314;: <strong>&#192;lex</strong>, <strong>Ra&#250;l</strong>. Thank you for bringing skill, dedication, joy to every project.</p></li><li><p>&#120289;&#120306;&#120324; &#120304;&#120313;&#120310;&#120306;&#120315;&#120321;&#120320;: <strong>Kristy-Leigh</strong>, <strong>Matthew</strong>, <strong>Rustom</strong>, <strong>Alex</strong>, <strong>Jimmy</strong>. Thank you for trusting us.</p></li><li><p>&#120287;&#120316;&#120315;&#120308;-&#120321;&#120306;&#120319;&#120314; &#120320;&#120322;&#120317;&#120317;&#120316;&#120319;&#120321;&#120306;&#120319;&#120320;: Anna, <strong>Tzach</strong>, <strong>Elena</strong>, Jorge, Alberto, Rich, Nate. Thank you for your continued trust and support over the years.</p></li><li><p>&#120280;&#120315;&#120302;&#120303;&#120313;&#120306;&#120319;&#120320;: <strong>Pablo</strong>, <strong>Juan Luis</strong>. Thank you for connecting us with exceptional people.</p></li><li><p>&#120281;&#120306;&#120306;&#120305;&#120303;&#120302;&#120304;&#120312; &#120304;&#120309;&#120302;&#120314;&#120317;&#120310;&#120316;&#120315;&#120320;: <strong>Lars</strong>, <strong>Tim</strong>, <strong>Harshil</strong>, <strong>Seonaid</strong>, Elena K. Your feedback improved our tools for everyone.</p></li><li><p>&#120284;&#120315;&#120320;&#120317;&#120310;&#120319;&#120302;&#120321;&#120310;&#120316;&#120315;: <strong>Ivan</strong>, <strong>Sabela</strong>, <strong>Cristina</strong>, <strong>Aleix</strong>, <strong>Xavi</strong>. I&#8217;ve learned a ton from all of you.</p></li><li><p>&#120290;&#120317;&#120306;&#120319;&#120302;&#120321;&#120310;&#120316;&#120315;&#120302;&#120313; &#120320;&#120322;&#120317;&#120317;&#120316;&#120319;&#120321;: <strong>Davinia</strong> for keeping our finances in order, <strong>Gonzalo</strong> for managing customer relations.</p></li></ul><p>...and to everyone we worked with behind the scenes, thank you for your support.</p><p>If you&#8217;re curious about what we built in 2025, you can explore our projects at <a href="http://techdocs.studio/work">techdocs.studio/work</a>:</p><h4><strong>Aligning Coiled&#8217;s documentation theme with their brand identity</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nG_n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nG_n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nG_n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png" width="1210" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de056b0c-8540-4827-98e7-06be526015c8_1210x727.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Coiled project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Coiled project screenshot" title="Coiled project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!nG_n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!nG_n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde056b0c-8540-4827-98e7-06be526015c8_1210x727.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Following the successful launch of Coiled&#8217;s new website, we developed a custom Sphinx documentation theme that aligned with their updated brand identity, ensuring a cohesive user experience across docs.coiled.io and the main marketing site.</p><p><strong><a href="https://techdocs.studio/work/coiled-docs">Read case study</a></strong></p><div><hr></div><h4><strong>Custom Sphinx theme development for FiftyOne documentation</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rYck!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rYck!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!rYck!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rYck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png" width="1210" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Voxel51 project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Voxel51 project screenshot" title="Voxel51 project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!rYck!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 424w, https://substackcdn.com/image/fetch/$s_!rYck!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 848w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1272w, https://substackcdn.com/image/fetch/$s_!rYck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f39cc68-447f-459a-9ff9-43c92eacf925_1210x727.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We upgraded FiftyOne&#8217;s documentation from Sphinx 3 to the latest version, created a custom theme aligned with the new Voxel51 brand guidelines, and implemented advanced search capabilities with PushFeedback integration for continuous improvement.</p><p><strong><a href="https://techdocs.studio/work/voxel51">Read case study</a></strong></p><div><hr></div><h4><strong>From Webflow to Next.js: Creating a developer-first website for Coiled</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gom0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gom0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 424w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 848w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1272w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gom0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png" width="1210" height="711" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:711,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Coiled project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Coiled project screenshot" title="Coiled project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!Gom0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 424w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 848w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1272w, https://substackcdn.com/image/fetch/$s_!Gom0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cbc302-1552-4e33-866b-22b131efe5e2_1210x711.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Migrated Coiled&#8217;s website from Webflow to a modern, component-based static site generator, empowering their team to manage content like they manage code.</p><p><strong><a href="https://techdocs.studio/work/coiled">Read case study</a></strong></p><div><hr></div><h4><strong>Automating API reference generation from OpenAPI and GraphQL schemas</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P2kG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P2kG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 424w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 848w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1272w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P2kG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png" width="1210" height="702" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3941050d-468e-425d-96c1-b38698ada110_1210x702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:702,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;MONEI project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="MONEI project screenshot" title="MONEI project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!P2kG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 424w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 848w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1272w, https://substackcdn.com/image/fetch/$s_!P2kG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3941050d-468e-425d-96c1-b38698ada110_1210x702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Migrated MONEI&#8217;s docs to Docusaurus v3, implemented cross-site search, and autogenerated consistent API documentation from OpenAPI and GraphQL contracts.</p><p><strong><a href="https://techdocs.studio/work/monei">Read case study</a></strong></p><div><hr></div><h4><strong>Unifying Blue Robotics&#8217; documentation with a custom Sphinx theme</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WpaP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WpaP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 424w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 848w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1272w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WpaP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png" width="1210" height="729" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:729,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Blue Robotics project screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Blue Robotics project screenshot" title="Blue Robotics project screenshot" srcset="https://substackcdn.com/image/fetch/$s_!WpaP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 424w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 848w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1272w, https://substackcdn.com/image/fetch/$s_!WpaP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e7ab38d-cd80-4933-9d03-fb0b98ae1ca9_1210x729.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Developed a custom Sphinx theme with Material design aesthetics, implemented multi-language support, and set up a custom CI/CD pipeline for version management across their documentation ecosystem.</p><p><strong><a href="https://techdocs.studio/work/bluerobotics">Read case study</a></strong><br><br>Here&#8217;s to 2026: more learning, more impact, and helping teams build documentation that scales!</p><p>&#8212; David</p>]]></content:encoded></item><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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>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, which reveals the gaps in your documentation. If 50 people ask about webhook authentication and you don&#8217;t have a guide, that&#8217;s a signal to write one. The questions show you what&#8217;s missing or unclear.</p><p>Also, keep in mind Biel.ai only works as well as the docs behind it. Well-structured, comprehensive docs lead to better answers. Gaps lead to poor ones.</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><em>&#8220;Where are the docs for webhooks?&#8221;</em></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, and 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 answering only from 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 land on 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 never made it into 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. It works with any static site generator, and 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[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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>No 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="https://techdocs.studio/services/custom-documentation-extensions">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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s a feedback widget for documentation sites. Users click, highlight the problem, and submit. You get the feedback where you already 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>A<strong> </strong>free Starter license with unlimited feedback entries on one subdomain of your choice. You keep it after the beta ends.</p><p><strong>How to join: </strong>Go to<strong> </strong><a href="http://www.pushfeedback.com/beta">pushfeedback.com/beta</a> and sign up. You&#8217;ll get a confirmation email with setup instructions. Adding the widget takes about five minutes, just a few lines of code, like Google Analytics.</p><p><strong>What I need from you: </strong>use it, and tell me what works, what doesn't, and what'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 so it fits into your documentation site, whether that&#8217;s 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 the Markdown updates automatically whenever the OpenAPI spec changes.</p><p>For large API specs, the generated Markdown can get unwieldy. It&#8217;s worth post-processing the output to split it by endpoint or resource so the navigation stays manageable.</p><p>From there, configure your static site generator to render 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[Stop fighting with PowerPoint. Write in plain text, export to any format.]]></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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Is Marp right for you?</h2><p>Marp is a good fit when your slides are content-first: technical talks with code examples, text-heavy decks without complex layouts, anything you want under version control, or slides you need to export to several formats. Writing in Markdown is faster than fighting layout tools, and you get the whole docs-as-code workflow for free.<br><br>It&#8217;s the wrong tool when design is the point. Custom layouts, complex animations, and pixel-perfect visuals are all harder than they&#8217;d be in a drag-and-drop editor. And if your team isn&#8217;t comfortable with Markdown or the command line, the learning curve will cost you more than the tool saves.<br><br>The line is simple: if you spend more time on content than design, Marp saves you time. If you need pixel-perfect slides, stay with the 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 what 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, with 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 it 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>