<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ninad Pathak</title>
    <description>The latest articles on DEV Community by Ninad Pathak (@ninadpathak).</description>
    <link>https://dev.to/ninadpathak</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1101907%2F556479de-4632-4efc-8f9b-a0d98d03258f.png</url>
      <title>DEV Community: Ninad Pathak</title>
      <link>https://dev.to/ninadpathak</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ninadpathak"/>
    <language>en</language>
    <item>
      <title>API Documentation Best Practices: Reference, Guides, and Working Requests</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Wed, 19 Aug 2026 18:01:26 +0000</pubDate>
      <link>https://dev.to/ninadpathak/api-documentation-best-practices-reference-guides-and-working-requests-5a65</link>
      <guid>https://dev.to/ninadpathak/api-documentation-best-practices-reference-guides-and-working-requests-5a65</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/api-documentation-best-practices-reference-guides-and-working-requests/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/api-documentation-best-practices-reference-guides-and-working-requests/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An API portal can list every endpoint and still leave a developer unable to send a request. The missing work is usually distributed across a quickstart, reference, and error guidance, which makes an incomplete path look finished in a navigation tree.&lt;/p&gt;

&lt;p&gt;The reader outcome is concrete: someone with a test credential can make one request, inspect its exact contract, and recover from a predictable failure. That path is the unit to design and test before adding more endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  API documentation system: assign each page a job
&lt;/h2&gt;

&lt;p&gt;A quickstart owns first success. It names the access required, gives one complete request, shows an expected response, and links to the next task before the reader must hunt for vocabulary or configuration.&lt;/p&gt;

&lt;p&gt;Reference owns exact behavior. The &lt;a href="https://spec.openapis.org/oas/latest.html" rel="noopener noreferrer"&gt;OpenAPI Specification&lt;/a&gt; models paths, operations, parameters, request bodies, responses, security, and reusable components, which makes it a strong contract baseline when the source description is reviewed with the API.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reader moment&lt;/th&gt;
&lt;th&gt;Page that owns it&lt;/th&gt;
&lt;th&gt;Evidence that the page works&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;I have credentials and need a first response&lt;/td&gt;
&lt;td&gt;Quickstart&lt;/td&gt;
&lt;td&gt;Complete request and expected response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I need the exact field or limit&lt;/td&gt;
&lt;td&gt;Reference&lt;/td&gt;
&lt;td&gt;Parameter, type, default, constraint, and response schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The request failed&lt;/td&gt;
&lt;td&gt;Error or troubleshooting guide&lt;/td&gt;
&lt;td&gt;Status, cause, diagnostic detail, recovery, and escalation boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product behavior changed&lt;/td&gt;
&lt;td&gt;Migration guide or release note&lt;/td&gt;
&lt;td&gt;Affected version, required action, and replacement path&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://docs.stripe.com/api" rel="noopener noreferrer"&gt;Stripe's API reference&lt;/a&gt; gives readers a route through objects, endpoints, parameters, and response data. Its reference strength does not remove the need for a guide that explains which request is worth sending first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write one working request before expanding the reference
&lt;/h2&gt;

&lt;p&gt;Choose a request with a safe test credential, a small response, and a result a reader can recognize. A list endpoint is often a useful first move because it proves authentication, base URL, method, and response handling without asking someone to change production data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.example.com/v1/projects &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$API_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The guide needs the expected result beside the command. If a successful response contains &lt;code&gt;projects&lt;/code&gt;, say so, then link &lt;code&gt;limit&lt;/code&gt;, pagination, field definitions, rate behavior, and every response shape to reference where they can stay exact.&lt;/p&gt;

&lt;p&gt;A copyable request is not sufficient when its failure state is opaque. Postman describes API documentation as covering endpoints, methods, resources, authentication, parameters, headers, and examples, and each item should remove a decision the reader would otherwise have to guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep reference and guides connected without merging them
&lt;/h2&gt;

&lt;p&gt;Reference answers questions that have stable names. It should make the endpoint, authentication scheme, parameters, request body, response schema, errors, and limits easy to scan without turning every page into a tutorial.&lt;/p&gt;

&lt;p&gt;A guide connects those details into a task. Authentication belongs in both places when the guide explains how to obtain and send credentials while the reference records header format, scope behavior, and error schema.&lt;/p&gt;

&lt;p&gt;The strongest objection is that an OpenAPI-generated reference should eliminate this split. Generated reference can remain more complete as endpoints change, yet it cannot decide which object proves a new integration works, whether a retry is safe, or which production choices belong after the first response.&lt;/p&gt;

&lt;p&gt;Keep the generated contract close to the source and keep the guide close to the reader's task. That boundary becomes more important as an API gains pagination, webhooks, SDKs, version changes, and different authentication modes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Link the API documentation route to its next decision
&lt;/h2&gt;

&lt;p&gt;Link from the quickstart to the exact endpoint reference after the reader has a request to inspect. Link from reference to a guide when the reader needs a workflow, and link each recoverable error to a diagnostic path instead of a generic support page.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ninadpathak.com/articles/technical-documentation-template/" rel="noopener noreferrer"&gt;documentation template&lt;/a&gt; shows the smaller site structure that separates a first task, reference, and troubleshooting. The &lt;a href="https://ninadpathak.com/articles/how-to-organize-a-documentation-site/" rel="noopener noreferrer"&gt;documentation organization guide&lt;/a&gt; shows how those routes become navigation without creating duplicate homes for the same task.&lt;/p&gt;

&lt;p&gt;Version changes need their own route because a valid request can become unsafe when its credentials, field names, or response behavior change. Use the &lt;a href="https://ninadpathak.com/articles/how-to-document-multiple-product-versions/" rel="noopener noreferrer"&gt;product-version documentation guide&lt;/a&gt; to keep supported instructions reachable and to give retired routes an honest migration destination.&lt;/p&gt;

&lt;p&gt;Build the first request path before filling an API portal with pages. When a developer can get credentials, send one safe request, inspect the contract, and recover from a known failure, the rest of the documentation has a route that can grow without losing its reader.&lt;/p&gt;




&lt;p&gt;Built while writing this: the &lt;a href="https://ninadpathak.com/linter/" rel="noopener noreferrer"&gt;technical writing linter&lt;/a&gt;. Free, runs in the browser, no signup.&lt;/p&gt;

</description>
      <category>apidocumentation</category>
      <category>devrel</category>
      <category>technicalwriting</category>
    </item>
    <item>
      <title>How to Document Multiple Product Versions</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Tue, 18 Aug 2026 18:01:21 +0000</pubDate>
      <link>https://dev.to/ninadpathak/how-to-document-multiple-product-versions-4oi0</link>
      <guid>https://dev.to/ninadpathak/how-to-document-multiple-product-versions-4oi0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/how-to-document-multiple-product-versions/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/how-to-document-multiple-product-versions/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A version switcher can make incompatible instructions look like interchangeable pages. A current page, a supported older page, and a retired page need different URL behavior before a canonical tag or redirect can be correct.&lt;/p&gt;

&lt;p&gt;The policy is simple: keep instructions reachable and self-canonical while the product version remains supported. Redirect a retired task only when the destination still gives the reader a valid path, and preserve a historical version when its instructions remain useful evidence rather than a trap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product documentation versioning checklist
&lt;/h2&gt;

&lt;p&gt;Use this table to establish the policy before configuring navigation or search metadata. It separates a version that a developer can still use from one that only needs a record of where the old URL went.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version state&lt;/th&gt;
&lt;th&gt;URL behavior&lt;/th&gt;
&lt;th&gt;Canonical&lt;/th&gt;
&lt;th&gt;Reader-facing label&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Current supported version&lt;/td&gt;
&lt;td&gt;Stable, direct URL&lt;/td&gt;
&lt;td&gt;Self-canonical&lt;/td&gt;
&lt;td&gt;Current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Older supported version&lt;/td&gt;
&lt;td&gt;Stable, direct URL&lt;/td&gt;
&lt;td&gt;Self-canonical&lt;/td&gt;
&lt;td&gt;Supported version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retired version with an equivalent replacement&lt;/td&gt;
&lt;td&gt;Permanent redirect to the replacement&lt;/td&gt;
&lt;td&gt;No page to canonicalize after redirect&lt;/td&gt;
&lt;td&gt;Retired and redirected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical version with distinct instructions&lt;/td&gt;
&lt;td&gt;Stable, direct URL&lt;/td&gt;
&lt;td&gt;Self-canonical&lt;/td&gt;
&lt;td&gt;Historical or unsupported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A canonical consolidates duplicate or very similar pages. It is not a safe way to merge materially different setup steps, API fields, authentication rules, or migration boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit documentation versions before choosing redirects
&lt;/h2&gt;

&lt;p&gt;Start by treating each version as a reader task. A path is distinct when following one version's instructions against another version can fail, change data, or produce an unsupported integration.&lt;/p&gt;

&lt;p&gt;Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls" rel="noopener noreferrer"&gt;canonicalization guidance&lt;/a&gt; frames canonicalization as a preference among duplicate or very similar URLs. That boundary matters in product documentation because versioned pages often look similar in a template but carry different behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Define which versions are supported
&lt;/h3&gt;

&lt;p&gt;Publish a small support matrix close to the version switcher and on the page itself. State the version, support state, relevant release date, and the route to migration guidance when the page is no longer current.&lt;/p&gt;

&lt;p&gt;The word &lt;code&gt;latest&lt;/code&gt; is not enough. It becomes misleading as soon as a developer lands on a bookmarked versioned URL or copies a command into a long-running service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep supported versions on distinct self-canonical URLs
&lt;/h3&gt;

&lt;p&gt;A supported version needs a stable URL, a visible label, and its own self-referencing canonical. That gives the developer a link they can share and stops the current version from silently claiming ownership of instructions that are still valid elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docusaurus.io/docs/versioning" rel="noopener noreferrer"&gt;Docusaurus versioning&lt;/a&gt; preserves a copy of documentation when a new version is created, which is the useful model here. The preserved set remains inspectable as the current documentation continues to change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redirect only when the replacement preserves the task
&lt;/h3&gt;

&lt;p&gt;A permanent redirect is a strong signal that the target replaces the original URL. Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/301-redirects" rel="noopener noreferrer"&gt;redirect documentation&lt;/a&gt; describes redirects as a canonicalization signal, so send a retired documentation URL to a target that can actually replace its reader outcome.&lt;/p&gt;

&lt;p&gt;Redirecting &lt;code&gt;/docs/v1/authentication/&lt;/code&gt; to a general release note fails that test. Redirect it to the equivalent current authentication guide only when the current guide includes the migration boundary, or keep a historical page that says why the old path no longer works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Link readers to the right documentation version
&lt;/h2&gt;

&lt;p&gt;A version switcher should change the page, not only the label. Keep version choices in ordinary crawlable links, then make the active version visible near code blocks, prerequisites, and migration notices.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ninadpathak.com/articles/what-a-documentation-homepage-must-help-users-do/" rel="noopener noreferrer"&gt;documentation homepage guide&lt;/a&gt; explains why a route label needs to predict the page that follows. Apply the same standard here: &lt;code&gt;v2 supported documentation&lt;/code&gt; is useful, while &lt;code&gt;Other versions&lt;/code&gt; makes a developer open another interface before learning whether their task is covered.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ninadpathak.com/articles/seo-for-technical-documentation/" rel="noopener noreferrer"&gt;documentation SEO guide&lt;/a&gt; shows how to audit the canonical, title, links, image text, and sitemap after the route policy is settled. Version policy comes first because search metadata cannot repair a path that sends a developer to the wrong instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve historical pages that still explain a real state
&lt;/h2&gt;

&lt;p&gt;An unsupported page can still earn a stable URL when it documents a deployment a reader must maintain, a security boundary, or a migration that cannot be reversed. Mark its support state plainly and link to the current version without pretending both pages say the same thing.&lt;/p&gt;

&lt;p&gt;The competent objection is that keeping old pages adds maintenance and duplicate-content risk. That is true when old pages are vague copies, but deleting or canonicalizing a page with different working instructions sends developers to an answer that may be wrong for their installed version.&lt;/p&gt;

&lt;p&gt;A versioned documentation system works when the URL, page label, canonical, redirect behavior, and migration path tell the same story. Start with the routes developers already bookmark, then test the policy whenever a release changes which instructions remain safe to follow.&lt;/p&gt;




&lt;p&gt;Built while writing this: the &lt;a href="https://ninadpathak.com/ai-overviews-checker/" rel="noopener noreferrer"&gt;AI Overviews extractability checker&lt;/a&gt;. Free, runs in the browser, no signup.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>devrel</category>
      <category>documentationseo</category>
    </item>
    <item>
      <title>What a Documentation Homepage Must Help Users Do</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Mon, 17 Aug 2026 18:02:53 +0000</pubDate>
      <link>https://dev.to/ninadpathak/what-a-documentation-homepage-must-help-users-do-29d5</link>
      <guid>https://dev.to/ninadpathak/what-a-documentation-homepage-must-help-users-do-29d5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/what-a-documentation-homepage-must-help-users-do/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/what-a-documentation-homepage-must-help-users-do/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A documentation homepage has a narrow job: help someone choose a useful next move before they understand the whole product. I reviewed &lt;a href="https://docs.stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;, &lt;a href="https://docs.github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, &lt;a href="https://developer.chrome.com/docs" rel="noopener noreferrer"&gt;Chrome&lt;/a&gt;, and &lt;a href="https://developers.google.com/maps/documentation" rel="noopener noreferrer"&gt;Google Maps&lt;/a&gt; documentation homepages while building the route audit below, and the layouts vary far more than the underlying behavior.&lt;/p&gt;

&lt;p&gt;Each homepage gives a reader a route, not just a collection of things to browse. That distinction is what separates a documentation landing page from an equal-weight card wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the documentation homepage four reader routes
&lt;/h2&gt;

&lt;p&gt;A homepage should help a new user start, a returning user resume work, a blocked user recover, and an evaluator understand the product surface. These are jobs, not mandatory visual sections.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reader situation&lt;/th&gt;
&lt;th&gt;Homepage promise&lt;/th&gt;
&lt;th&gt;A useful destination&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New to the product&lt;/td&gt;
&lt;td&gt;Complete the first supported result&lt;/td&gt;
&lt;td&gt;Quickstart or first request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Returning to implementation&lt;/td&gt;
&lt;td&gt;Find an exact object or workflow&lt;/td&gt;
&lt;td&gt;API reference or task guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocked by a failure&lt;/td&gt;
&lt;td&gt;Recover without searching the whole library&lt;/td&gt;
&lt;td&gt;Troubleshooting or error guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evaluating the product&lt;/td&gt;
&lt;td&gt;See which capability route applies&lt;/td&gt;
&lt;td&gt;Product overview or capability guide&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The five homepages I inspected make different design choices, but they all make at least one route obvious. Stripe leads toward getting started and a runnable example, while GitLab places frequent answers ahead of broader product areas.&lt;/p&gt;

&lt;p&gt;GitHub groups its library by jobs such as collaborative coding and CI/CD. Google Maps pairs a first action with capability routes, which keeps product discovery from replacing task completion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the first action more prominent than exploration
&lt;/h2&gt;

&lt;p&gt;A new reader often arrives with a simple question: can I make this work? Put the shortest supported path near the top, then let broader product exploration follow.&lt;/p&gt;

&lt;p&gt;Chrome’s documentation homepage establishes what the library contains, then gives product areas clear entry links. The point is not to copy Chrome’s layout.&lt;/p&gt;

&lt;p&gt;Make the first decision smaller than “choose from everything we have.”&lt;/p&gt;

&lt;p&gt;A card wall fails when every destination carries the same visual weight, even though one route is the safe first step and another is a niche reference page. Cards are fine when they identify a reader, a job, and a destination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make labels describe the route
&lt;/h2&gt;

&lt;p&gt;A reader should be able to predict the next page from the label alone. &lt;code&gt;Send your first request&lt;/code&gt; and &lt;code&gt;Troubleshoot failed requests&lt;/code&gt; expose an outcome, while &lt;code&gt;Resources&lt;/code&gt; and &lt;code&gt;Learn more&lt;/code&gt; make the reader open a page to discover what it contains.&lt;/p&gt;

&lt;p&gt;That rule applies to links, headings, and navigation labels. Use the same language across them where possible, then review the outline with the method in &lt;a href="https://ninadpathak.com/articles/how-to-write-task-based-documentation-headings/" rel="noopener noreferrer"&gt;How to Write Task-Based Documentation Headings&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the homepage as a route inventory
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://ninadpathak.com/static/downloads/documentation-homepage-audit/README.md" rel="noopener noreferrer"&gt;documentation homepage route audit&lt;/a&gt; turns the four route jobs into explicit fields a team can inspect. Its included fixture demonstrates the expected shape; it does not prove that the routes work for real readers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 audit_homepage_routes.py example-homepage-routes.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PASS
4 routes cover: exploration, first action, recovery, returning task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script cannot prove that a reader will understand your labels. It can catch a more basic failure before the homepage ships: a route inventory that has forgotten the person who needs help after the happy path breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep homepage scope separate from site organization
&lt;/h2&gt;

&lt;p&gt;A homepage should route readers into the documentation system. It should not carry the full burden of URL migration, sidebar design, canonical ownership, or every product page.&lt;/p&gt;

&lt;p&gt;For that wider work, use &lt;a href="https://ninadpathak.com/articles/how-to-organize-a-documentation-site/" rel="noopener noreferrer"&gt;How to Organize Documentation That Has Drifted&lt;/a&gt;. Start the homepage audit with the page’s likely entry tasks, then make each chosen route lead to a page that actually completes its promise.&lt;/p&gt;

&lt;p&gt;A good documentation homepage makes the next decision easier. If a reader still has to infer where to begin, which page owns their task, or where to recover from failure, the homepage is still acting like a card wall.&lt;/p&gt;




&lt;p&gt;Built while writing this: the &lt;a href="https://ninadpathak.com/linter/" rel="noopener noreferrer"&gt;technical writing linter&lt;/a&gt;. Free, runs in the browser, no signup.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>devrel</category>
      <category>informationarchitecture</category>
    </item>
    <item>
      <title>How to Write Task-Based Documentation Headings</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Sun, 16 Aug 2026 18:01:24 +0000</pubDate>
      <link>https://dev.to/ninadpathak/how-to-write-task-based-documentation-headings-5gfa</link>
      <guid>https://dev.to/ninadpathak/how-to-write-task-based-documentation-headings-5gfa</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/how-to-write-task-based-documentation-headings/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/how-to-write-task-based-documentation-headings/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A heading should tell a scanning reader what the section contains. For a procedure, name the result or task.&lt;/p&gt;

&lt;p&gt;For a concept, name the concept. For a failure, name the condition and the recovery path.&lt;/p&gt;

&lt;p&gt;That is the whole rule. Task-based headings are not a mandate to put a verb in every heading.&lt;/p&gt;

&lt;p&gt;An illustrative heading rewrite&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="/static/images/articles/how-to-write-task-based-documentation-headings/task-heading-anatomy.svg" width="1344" height="640" alt="An illustrative example rewrites the label Setup as Configure the client with an API key, identifying an action, object, and context."&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This example shows the difference between a topic label and a heading that states the work the section covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Match the heading to the section's job
&lt;/h2&gt;

&lt;p&gt;A heading is a navigation label, a link target, and a promise about the content below it. &lt;a href="https://developers.google.com/style/headings" rel="noopener noreferrer"&gt;Google's documentation style guide&lt;/a&gt; recommends descriptive, unique headings and task-based tutorial titles when a document primarily guides work.&lt;/p&gt;

&lt;p&gt;Start by deciding what the section does. A procedure helps a reader reach a result, while an explanation answers a conceptual question.&lt;/p&gt;

&lt;p&gt;A reference section identifies a field, object, or API behavior. A recovery section handles a known failure condition.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section job&lt;/th&gt;
&lt;th&gt;Generic label&lt;/th&gt;
&lt;th&gt;Illustrative rewrite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Procedure&lt;/td&gt;
&lt;td&gt;Setup&lt;/td&gt;
&lt;td&gt;Create the project and install the CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration&lt;/td&gt;
&lt;td&gt;Configuration&lt;/td&gt;
&lt;td&gt;Configure the client with an API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verification&lt;/td&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;Verify the endpoint accepts a signed test event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery&lt;/td&gt;
&lt;td&gt;Errors&lt;/td&gt;
&lt;td&gt;Recover when signature verification fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explanation&lt;/td&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Token scopes and integration access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reference&lt;/td&gt;
&lt;td&gt;Options&lt;/td&gt;
&lt;td&gt;Retry policy options for background jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The right-hand column is not a universal template. It shows how the heading can name the reader's task or the subject of the section instead of only naming a broad topic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write task headings for procedural sections
&lt;/h2&gt;

&lt;p&gt;Use a task heading when the section tells the reader how to change a system or reach a checked result. The heading should usually make the outcome visible before the reader opens the section.&lt;/p&gt;

&lt;p&gt;For example, &lt;code&gt;Configure the client with an API key&lt;/code&gt; tells the reader what they will do and what it applies to. &lt;code&gt;Configuration&lt;/code&gt; tells them only that the topic is configuration.&lt;/p&gt;

&lt;p&gt;Add context when it changes the next action. An environment, prerequisite, failure condition, or target object belongs in the heading only if omitting it would make the task ambiguous.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://diataxis.fr/how-to-guides/" rel="noopener noreferrer"&gt;Diátaxis describes how-to guides as goal-oriented directions&lt;/a&gt;. That is a useful check for documentation headings: prefer the reader's goal over a list of product controls.&lt;/p&gt;

&lt;p&gt;For example, &lt;code&gt;Delay retries after a rate-limit response&lt;/code&gt; explains the intended behavior. &lt;code&gt;Set the retry_after field&lt;/code&gt; can be correct, but it makes the reader inspect the section before learning why that setting matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use descriptive noun phrases for concepts and references
&lt;/h2&gt;

&lt;p&gt;A verb makes sense when the reader is meant to act. It becomes awkward when the section exists to explain a concept or document a specific item.&lt;/p&gt;

&lt;p&gt;Use a descriptive noun phrase for those sections. &lt;code&gt;Token scopes and integration access&lt;/code&gt; gives the reader a clear subject and boundary. &lt;code&gt;Overview&lt;/code&gt; does not.&lt;/p&gt;

&lt;p&gt;The same rule applies to reference material. &lt;code&gt;Webhook signature headers&lt;/code&gt; is a useful anchor because it names the object being documented. &lt;code&gt;Details&lt;/code&gt; forces the reader to open the section to learn what those details are about.&lt;/p&gt;

&lt;p&gt;A practical test is simple: can someone predict the section's subject from the heading alone? If the best answer is only "information about this topic," the label needs more work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep heading hierarchy separate from heading wording
&lt;/h2&gt;

&lt;p&gt;A precise heading can still be placed at the wrong level. &lt;a href="https://www.w3.org/WAI/tutorials/page-structure/headings/" rel="noopener noreferrer"&gt;The World Wide Web Consortium's headings tutorial&lt;/a&gt; explains that heading ranks communicate page structure and support in-page navigation for browsers and assistive technology.&lt;/p&gt;

&lt;p&gt;Use one page title for the page's primary job. Use major section headings for the main tasks or concepts, then nest headings only for work that belongs within a parent section.&lt;/p&gt;

&lt;p&gt;Do not choose a heading level because of its visual size. CSS can change how a heading looks.&lt;/p&gt;

&lt;p&gt;Its level still changes the document outline and navigation structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review the outline before the prose
&lt;/h2&gt;

&lt;p&gt;Read the headings without the body copy. The review asks a narrower question than an editorial review: does the outline show the tasks, concepts, decisions, and recovery paths that the page promises to cover?&lt;/p&gt;

&lt;p&gt;A procedural guide might have an outline like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Configure webhooks
Create the endpoint that receives events
Verify the endpoint accepts a signed test event
Recover when signature verification fails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an example outline, not a claim about every webhook guide. It works because each heading names a distinct part of the reader's path.&lt;/p&gt;

&lt;p&gt;Compare it with labels such as &lt;code&gt;Setup&lt;/code&gt;, &lt;code&gt;Testing&lt;/code&gt;, and &lt;code&gt;Errors&lt;/code&gt;. Those labels may be acceptable inside a tightly scoped interface, but they do not describe a task or subject by themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rewrite headings where the reader needs to choose a next step
&lt;/h2&gt;

&lt;p&gt;Start with the headings that carry the most navigation work: the first action, prerequisites, verification, risky decisions, and recovery. Those sections are where a reader is most likely to scan for a specific answer.&lt;/p&gt;

&lt;p&gt;Do not rewrite every heading into an imperative. A section that explains token scopes should say so.&lt;/p&gt;

&lt;p&gt;A section that documents a request field should name that field. A section that guides a reader through a result should state the result.&lt;/p&gt;

&lt;p&gt;For a full tutorial structure, see &lt;a href="https://ninadpathak.com/articles/how-to-write-a-technical-tutorial-that-actually-teaches/" rel="noopener noreferrer"&gt;How to Write a Technical Tutorial That Actually Teaches&lt;/a&gt;. Before publishing, use the &lt;a href="https://ninadpathak.com/articles/documentation-review-checklist-before-you-publish/" rel="noopener noreferrer"&gt;documentation review checklist&lt;/a&gt; to check the rendered outline, links, and navigation.&lt;/p&gt;

&lt;p&gt;The useful standard is not "every heading starts with a verb." It is simpler: a reader should be able to tell why a section exists before they have to read it.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>software</category>
      <category>writing</category>
    </item>
    <item>
      <title>Accessibility Testing for Documentation: A Release Checklist</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Sat, 15 Aug 2026 18:01:49 +0000</pubDate>
      <link>https://dev.to/ninadpathak/accessibility-testing-for-documentation-a-release-checklist-1om7</link>
      <guid>https://dev.to/ninadpathak/accessibility-testing-for-documentation-a-release-checklist-1om7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/documentation-accessibility-checklist/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/documentation-accessibility-checklist/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Accessibility testing matters for documentation because a page can look finished and still leave a reader unable to complete its task. A bold heading, a link named “here,” or a screenshot holding the only success signal can turn setup instructions into a visual-only path.&lt;/p&gt;

&lt;p&gt;Use this release checklist when you need to decide what to automate, what needs manual testing, and which failure should block a documentation deploy. I built and ran a &lt;a href="https://ninadpathak.com/static/downloads/documentation-accessibility-checker.zip" rel="noopener noreferrer"&gt;documentation accessibility checker&lt;/a&gt; against a broken fixture and its repaired version so the human review can focus on the experience a parser cannot judge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility testing checklist for a documentation release
&lt;/h2&gt;

&lt;p&gt;Run this table against generated HTML and the rendered page. It separates repeatable source failures from the reader-path checks that only a person can complete.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page element&lt;/th&gt;
&lt;th&gt;What must survive&lt;/th&gt;
&lt;th&gt;Quick check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Heading&lt;/td&gt;
&lt;td&gt;Section structure&lt;/td&gt;
&lt;td&gt;One page title, ordered heading levels, and no headings created only with visual styling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;Copyable instructions&lt;/td&gt;
&lt;td&gt;Actual text, a declared language, a starting state, and an observable result near the command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Destination and behavior&lt;/td&gt;
&lt;td&gt;Link text names the destination and signals a download, new tab, or same-page jump when that behavior matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;Relationships between values&lt;/td&gt;
&lt;td&gt;A simple data table has headers, and layout is not built with table markup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visual&lt;/td&gt;
&lt;td&gt;Information beyond pixels&lt;/td&gt;
&lt;td&gt;Meaningful images have useful alternatives, decorative images have empty alternatives, and complex visuals have nearby equivalent detail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rendered page&lt;/td&gt;
&lt;td&gt;Keyboard and zoom use&lt;/td&gt;
&lt;td&gt;Focus remains visible, interactive controls work from a keyboard, and reflow does not hide the task&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="/static/downloads/documentation-accessibility-checker.zip"&gt;Download the documentation accessibility checker (.zip)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The script is deliberately narrow. It flags missing image alternatives, vague links, heading jumps, tables without header cells, and code elements without a language class.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test documentation structure before visual styling
&lt;/h2&gt;

&lt;p&gt;A documentation page needs structure that exists in the document model, not only in its theme. &lt;a href="https://developers.google.com/style/accessibility" rel="noopener noreferrer"&gt;Google’s accessibility guidance&lt;/a&gt; recommends descriptive headings in a logical hierarchy, and &lt;a href="https://accessibility.huit.harvard.edu/identify-headings-lists-and-tables" rel="noopener noreferrer"&gt;Harvard’s structural guidance&lt;/a&gt; makes the consequence clear: assistive technologies can navigate structure only when the markup carries it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use headings to expose the task route
&lt;/h3&gt;

&lt;p&gt;Keep one page title, then use heading levels to describe the task in dependency order. A level should never be selected for its font size because CSS can change appearance without breaking the document outline.&lt;/p&gt;

&lt;p&gt;Read the headings without their paragraphs. A reader should be able to tell where to begin, what action follows, and where to verify success.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep lists and tables semantic
&lt;/h3&gt;

&lt;p&gt;Use a list when several items belong together and a table only when readers need to compare consistent fields. A data table needs header cells, and a table used for visual layout invents a relationship that a screen reader will announce as data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webaccess.msu.edu/tutorials/basics/checklist" rel="noopener noreferrer"&gt;Microsoft State University’s checklist&lt;/a&gt; recommends simple tables with row and column headers. If the relationships cannot be stated clearly in headers, split the table or use prose and a list instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test code and links on the reader’s path
&lt;/h2&gt;

&lt;p&gt;A code block is part of the interface. The reader should be able to copy it, recognize its language, understand the required state, and confirm what a successful result looks like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Put commands in text and name their language
&lt;/h3&gt;

&lt;p&gt;Do not hide a command in a screenshot. Text can be copied, enlarged, searched, translated, and read by assistive technology, which is why Google’s guide advises against images of code and terminal output.&lt;/p&gt;

&lt;p&gt;Use the code fence or HTML class that tells the renderer what language it contains. Put prerequisites and a success signal in nearby text rather than relying on an image caption.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run from a disposable test workspace.&lt;/span&gt;
python3 check_documentation_accessibility.py rendered-page.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expected result is a &lt;code&gt;PASS&lt;/code&gt; line that names the file checked. A failure should name the structural issue so the author can repair it without guessing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Give links a destination readers can choose
&lt;/h3&gt;

&lt;p&gt;A link list is often how people scan a technical page. “Click here” becomes meaningless when it is separated from its paragraph, but “Read the documentation review checklist” tells the reader what they will get.&lt;/p&gt;

&lt;p&gt;Name unusual behavior near the link when it changes the next move. A download, external application, same-page jump, or new tab should not be a surprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test visual information has an equivalent text path
&lt;/h2&gt;

&lt;p&gt;An alternative is not a caption copied into an &lt;code&gt;alt&lt;/code&gt; attribute. It is the information someone needs when they cannot use the visual presentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write alternatives for the visual’s job
&lt;/h3&gt;

&lt;p&gt;Describe the result or decision the visual supports. If a screenshot proves that a request returned &lt;code&gt;200&lt;/code&gt;, say that, and keep the matching response detail in nearby text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.openedx.org/en/latest/educators/references/accessibility/accessibility_best_practices_checklist.html" rel="noopener noreferrer"&gt;Open edX’s checklist&lt;/a&gt; draws the useful boundary: a meaningful graphic needs equivalent information, and a complex graph or diagram may need adjacent text or a data table. Decorative images should use an empty alternative so they do not add noise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check contrast and non-color cues together
&lt;/h3&gt;

&lt;p&gt;A red error state must also say that the request failed. Color can reinforce a label, but it cannot be the only way to understand status, priority, or a comparison.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://www.w3.org/WAI/WCAG22/quickref/" rel="noopener noreferrer"&gt;WCAG 2.2 Quick Reference&lt;/a&gt; to inspect the relevant success criteria for text alternatives, information and relationships, contrast, keyboard operation, and link purpose. The standard is a reference point, not a replacement for trying the page’s real task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run automated checks before manual documentation testing
&lt;/h2&gt;

&lt;p&gt;Automation can confirm markup patterns. It cannot tell whether focus is easy to find, whether a code sample wraps into unreadable fragments, or whether the page still makes sense at high zoom.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automate repeatable source failures
&lt;/h3&gt;

&lt;p&gt;I used the checker below on a fixture with one page title, ordered headings, a declared Bash block, descriptive link text, table headers, and an image alternative. The run passed after I restored those contracts.&lt;/p&gt;

&lt;p&gt;Documentation accessibility checker on the repaired fixture&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="/static/images/articles/documentation-accessibility-checklist/checker-pass.png" alt="MacBook Air terminal window showing python3 check_documentation_accessibility.py rendered-page.html and a passing structural accessibility result"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The checker reports a passed structural check for the repaired fixture. It does not claim to test keyboard operation, color contrast, or screen-reader output.&lt;/p&gt;

&lt;p&gt;Run it against generated HTML, not only the source Markdown. The rendered page is where plugins, templates, syntax highlighters, and image components can change the structure you intended.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test the reader’s route with a keyboard and zoom
&lt;/h3&gt;

&lt;p&gt;Tab through the page from the browser address bar. The current control should stay visible, links and controls should work without a pointer, and the order should match the reading order.&lt;/p&gt;

&lt;p&gt;Then zoom until the page reflows and read the page with a screen reader when possible. The &lt;a href="https://ninadpathak.com/articles/documentation-review-checklist-before-you-publish/" rel="noopener noreferrer"&gt;documentation review checklist&lt;/a&gt; covers the wider release review, including links, metadata, and the rendered frame.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make accessibility testing a documentation release gate
&lt;/h2&gt;

&lt;p&gt;Put this checklist beside the page template and run the checker in the same preview step that validates links and examples. The &lt;a href="https://ninadpathak.com/articles/documentation-style-guide-template/" rel="noopener noreferrer"&gt;documentation style guide template&lt;/a&gt; can record the owner, release trigger, and manual-test boundary for rules that change with the product.&lt;/p&gt;

&lt;p&gt;Accessibility gets cheaper when it is part of the authoring contract rather than a repair after launch. Start with one task page, preserve the semantics that explain its route, and let the rendered review show what the source alone cannot prove.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>documentation</category>
      <category>testing</category>
    </item>
    <item>
      <title>Documentation Style Guide Template for Developer Teams</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Fri, 14 Aug 2026 18:03:38 +0000</pubDate>
      <link>https://dev.to/ninadpathak/documentation-style-guide-template-for-developer-teams-3mb5</link>
      <guid>https://dev.to/ninadpathak/documentation-style-guide-template-for-developer-teams-3mb5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/documentation-style-guide-template/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/documentation-style-guide-template/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Documentation drifts when a feature changes and the name in the UI no longer matches the command in the guide. Tone alone cannot fix a decision that nobody can inspect or update.&lt;/p&gt;

&lt;p&gt;I built the attached template to make decisions and their supporting evidence visible. It also records when a release change should trigger review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download the documentation style guide template
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/static/templates/developer-documentation-style-guide-template.md"&gt;Download the documentation style guide template&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep the file beside the product source. When a feature is renamed or a command changes, review the matching row in the same pull request instead of relying on someone to remember a separate editorial process.&lt;/p&gt;

&lt;p&gt;The first useful use is one guide that changes often. Fill its bracketed fields with product facts, run the checker, and let the next release show which parts of the template need more detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define terminology that readers can verify
&lt;/h2&gt;

&lt;p&gt;A terminology entry needs an approved name, a short definition, an owner, and a date when someone last checked it. That turns a naming dispute into a question a reviewer can settle against the product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/style/word-list" rel="noopener noreferrer"&gt;Google’s word list&lt;/a&gt; is a useful reference because it records preferred wording and usage decisions. Your product needs the same discipline for names that exist only in its permissions model, API, migration flow, or interface.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When a term appears&lt;/th&gt;
&lt;th&gt;What the guide should record&lt;/th&gt;
&lt;th&gt;What the reviewer can check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A new product capability&lt;/td&gt;
&lt;td&gt;Approved name and definition&lt;/td&gt;
&lt;td&gt;The same name appears in UI, docs, and release notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A renamed concept&lt;/td&gt;
&lt;td&gt;Deprecated name and migration reason&lt;/td&gt;
&lt;td&gt;Readers can connect the old term to the current path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A role or permission&lt;/td&gt;
&lt;td&gt;Exact role name and responsibility&lt;/td&gt;
&lt;td&gt;The described access matches the released product&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep a deprecated term only when readers can still encounter it. An error message or compatibility field may need it, but an old marketing name does not need permanent search weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Match page shape to the reader task
&lt;/h2&gt;

&lt;p&gt;Each page form needs a completion signal that tells the reader when the task is complete.&lt;/p&gt;

&lt;p&gt;A tutorial should leave you with a working response or screen state. A reference should answer a stable question.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/style/ui-elements" rel="noopener noreferrer"&gt;Google’s UI guidance&lt;/a&gt; recommends writing instructions around the result the reader needs. Use an exact label when the control matters, then give enough context for a reader to recognize the correct screen.&lt;/p&gt;

&lt;p&gt;One rule carries a lot of weight for a small team: one page owns one reader question. Link out when a prerequisite, field definition, or recovery path belongs somewhere else.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ninadpathak.com/articles/technical-documentation-template/" rel="noopener noreferrer"&gt;technical documentation template&lt;/a&gt; shows how page jobs become a small site structure. The &lt;a href="https://ninadpathak.com/articles/how-to-organize-a-documentation-site/" rel="noopener noreferrer"&gt;documentation organization guide&lt;/a&gt; helps when existing pages compete for the same question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Record the evidence behind code examples
&lt;/h2&gt;

&lt;p&gt;A code rule that says “use fenced blocks” leaves out the part that matters. Readers need the runtime, package version, starting state, command, and observable result that made the snippet safe to copy.&lt;/p&gt;

&lt;p&gt;The template places a compact environment table before the command so a reviewer can see what the example depends on. That catches the hidden service, credential, or local file that turns a plausible snippet into a support ticket.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run from: [working directory]&lt;/span&gt;
&lt;span class="c"&gt;# Requires: [access, environment variables, or local service]&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;copyable &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://developers.google.com/style/code-syntax" rel="noopener noreferrer"&gt;Google’s code-syntax guidance&lt;/a&gt; covers the presentation of code and command syntax. The local rule here is narrower: when product behavior can change, place the verification source and failure boundary beside the example.&lt;/p&gt;

&lt;p&gt;I ran the included validator against the downloadable template in a fresh Python 3.13.5 environment. It confirmed the required sections, evidence markers, and editable cells that a team must replace with product facts.&lt;/p&gt;

&lt;p&gt;The checker cannot tell whether an API response still matches production or whether a screenshot shows the current interface. It fails when someone removes the fields that make those claims inspectable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep UI references tied to a released interface
&lt;/h2&gt;

&lt;p&gt;UI documentation fails when a writer describes a control from memory. The prose can be polished and still send someone to a label that was renamed, moved, or placed behind a permission.&lt;/p&gt;

&lt;p&gt;The template pairs visible wording with a release URL, build, or screenshot and a verification date. That gives the product owner a narrow claim to confirm during release review.&lt;/p&gt;

&lt;p&gt;GitLab’s &lt;a href="https://docs.gitlab.com/development/documentation/styleguide/" rel="noopener noreferrer"&gt;documentation style guide&lt;/a&gt; and Microsoft’s &lt;a href="https://learn.microsoft.com/en-us/style-guide/welcome/" rel="noopener noreferrer"&gt;style guide&lt;/a&gt; are useful references for a maintained editorial system. Neither can decide whether your “Create environment” button became “New environment,” so keep a local source of truth for the product your readers use.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ninadpathak.com/articles/documentation-review-checklist-before-you-publish/" rel="noopener noreferrer"&gt;documentation review checklist&lt;/a&gt; covers links, accessibility, metadata, and rendered behavior. Use this template earlier, before the team decides what a reference means.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give each rule an owner and an update trigger
&lt;/h2&gt;

&lt;p&gt;A style guide can become bureaucracy. That happens when it turns into a catalog of preferences that does not prevent a reader mistake or map to a product change.&lt;/p&gt;

&lt;p&gt;Keep rules that stop readers from choosing the wrong term, running an incomplete command, following a stale interface path, or missing the page that owns a question. Each row needs an owner and an update trigger such as a renamed feature, revised permission, changed response shape, or a support issue that exposed an ambiguous page.&lt;/p&gt;

&lt;p&gt;Download the template, fill it against a frequently edited guide, and run &lt;a href="https://ninadpathak.com/static/templates/check_documentation_style_guide.py" rel="noopener noreferrer"&gt;the included checker&lt;/a&gt; before asking the rest of the team to adopt it.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Internal vs. External Documentation: What Belongs Where</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Thu, 13 Aug 2026 18:01:37 +0000</pubDate>
      <link>https://dev.to/ninadpathak/internal-vs-external-documentation-what-belongs-where-3147</link>
      <guid>https://dev.to/ninadpathak/internal-vs-external-documentation-what-belongs-where-3147</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/internal-vs-external-documentation/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/internal-vs-external-documentation/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Internal documentation helps your team operate the system. External documentation helps customers, partners, and public developers use the supported product.&lt;/p&gt;

&lt;p&gt;When both tasks exist, publish a public task page and keep a separate private operating record. Classify each subject as &lt;strong&gt;internal&lt;/strong&gt;, &lt;strong&gt;external&lt;/strong&gt;, or &lt;strong&gt;split&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Internal vs. external documentation: choose by reader task
&lt;/h2&gt;

&lt;p&gt;Google's &lt;a href="https://developers.google.com/tech-writing/one/audience" rel="noopener noreferrer"&gt;technical writing guidance on audience&lt;/a&gt; defines an audience by the knowledge and skills it needs for a task. Use that task, not a person's job title, to decide where a page belongs.&lt;/p&gt;

&lt;p&gt;Ask four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does someone outside the organization need this information to evaluate, use, integrate with, administer, or recover the product?&lt;/li&gt;
&lt;li&gt;Does the subject contain credentials, private topology, unpublished plans, exploit detail, personnel information, or candid incident analysis?&lt;/li&gt;
&lt;li&gt;Does an internal operator need implementation context that an external reader does not?&lt;/li&gt;
&lt;li&gt;Who owns the source of truth, and which product or process change makes it stale?&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;source&amp;gt;
&amp;lt;img src="/static/images/articles/internal-vs-external-documentation/documentation-placement-flowchart.svg" width="672" height="472" alt="Documentation placement flowchart. If no external reader needs the information, keep it internal when an operator needs it or review whether the page has a task. If an external reader needs it, split public and private context when both remain necessary; otherwise publish it externally."&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;Each path ends in internal, review, split, or external documentation without crossing connector lines.&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Internal vs. external documentation comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Internal documentation&lt;/th&gt;
&lt;th&gt;External documentation&lt;/th&gt;
&lt;th&gt;Split documentation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary reader&lt;/td&gt;
&lt;td&gt;Employee, contractor, or approved operator&lt;/td&gt;
&lt;td&gt;Customer, partner, public developer, or product administrator&lt;/td&gt;
&lt;td&gt;Both groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reader task&lt;/td&gt;
&lt;td&gt;Build, deploy, operate, support, decide, or change the system&lt;/td&gt;
&lt;td&gt;Evaluate, start, integrate, configure, use, migrate, or recover&lt;/td&gt;
&lt;td&gt;Complete an external task while preserving private operating context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical detail&lt;/td&gt;
&lt;td&gt;Architecture decisions, private dependencies, internal commands, staffing, controls, and candid analysis&lt;/td&gt;
&lt;td&gt;Supported behavior, prerequisites, procedures, examples, limits, errors, and recovery&lt;/td&gt;
&lt;td&gt;Public contract on one side, implementation and sensitive context on the other&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access&lt;/td&gt;
&lt;td&gt;Identity and role based&lt;/td&gt;
&lt;td&gt;Public or customer authenticated&lt;/td&gt;
&lt;td&gt;Separate access and separate documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update trigger&lt;/td&gt;
&lt;td&gt;Process, topology, control, tooling, or ownership change&lt;/td&gt;
&lt;td&gt;Product contract, interface, workflow, or release change&lt;/td&gt;
&lt;td&gt;Either side changes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;IBM's &lt;a href="https://www.ibm.com/think/topics/code-documentation" rel="noopener noreferrer"&gt;code documentation overview&lt;/a&gt; makes the same practical distinction. Coding standards and development-environment setup serve internal work, while public API reference, integration notes, configuration, and README files can serve external work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What belongs in internal documentation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Architecture decisions and system design
&lt;/h3&gt;

&lt;p&gt;Keep architecture decision records, private topology, capacity assumptions, data classifications, vendor constraints, and unreleased plans with the team that operates them. A public architecture page should explain only the integration model, trust boundary, data flow, or deployment responsibility that changes a customer's decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Runbooks and internal recovery procedures
&lt;/h3&gt;

&lt;p&gt;Keep privileged commands, escalation paths, rollback criteria, dashboards, and candid failure analysis behind the appropriate access boundary. External troubleshooting should start from an observable symptom, give a safe recovery path, and state when to contact support.&lt;/p&gt;

&lt;h3&gt;
  
  
  Employee onboarding and working agreements
&lt;/h3&gt;

&lt;p&gt;Local access, internal repositories, approval paths, team ownership, coding standards, and deployment responsibilities belong in contributor onboarding. Atlassian's &lt;a href="https://www.atlassian.com/work-management/knowledge-sharing/documentation" rel="noopener noreferrer"&gt;internal documentation guidance&lt;/a&gt; treats this material as living team knowledge, which means it still needs ownership and review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What belongs in external documentation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Product scope and getting started
&lt;/h3&gt;

&lt;p&gt;Publish prerequisites, the supported first action, expected result, and the next useful page when an outside reader needs them to start. A documented happy path should not require a support conversation to complete.&lt;/p&gt;

&lt;h3&gt;
  
  
  Public interfaces and product contracts
&lt;/h3&gt;

&lt;p&gt;Publish API endpoints, SDK methods, command flags, configuration fields, error behavior, limits, compatibility promises, and supported authentication flows. The reader needs the request shape, authorization requirement, response, failure behavior, and relevant limits, not the service graph that fulfills the request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Releases, migrations, and customer recovery
&lt;/h3&gt;

&lt;p&gt;Publish release notes, migration guides, deprecation notices, and troubleshooting when product behavior changes or a supported task can fail. The page must answer whether the reader is affected, what to change, when to change it, and how to confirm recovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to split internal and external documentation
&lt;/h2&gt;

&lt;p&gt;A split is not a redacted internal page. It is a public document with a customer task and a private document with the operating detail required to maintain that public promise.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shared subject&lt;/th&gt;
&lt;th&gt;Internal documentation&lt;/th&gt;
&lt;th&gt;External documentation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Production incident&lt;/td&gt;
&lt;td&gt;Timeline, contributing conditions, response decisions, corrective work, and private evidence&lt;/td&gt;
&lt;td&gt;Customer impact, affected period, restored state, customer action, and follow-up commitment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System architecture&lt;/td&gt;
&lt;td&gt;Decisions, private topology, controls, dependencies, and operational constraints&lt;/td&gt;
&lt;td&gt;Supported deployment model, integration boundary, data flow, and customer responsibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Key handling, abuse controls, rotation operations, and internal escalation&lt;/td&gt;
&lt;td&gt;Authentication flow, scopes, supported credentials, errors, rotation task, and recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product release&lt;/td&gt;
&lt;td&gt;Launch plan, rollout criteria, internal risks, and rollback decision&lt;/td&gt;
&lt;td&gt;Shipped behavior, impact, required action, compatibility, and migration path&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Link the private source to the public contract it maintains. Give each page its own owner and update trigger, because a supported authentication flow can change without changing the internal key-rotation runbook.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation placement audit template
&lt;/h2&gt;

&lt;p&gt;Start with an inventory. Record whether an external reader has a task, whether private context exists, whether an internal operator has a separate task, who owns the page, and what makes it stale.&lt;/p&gt;

&lt;p&gt;I encoded that inventory in a small &lt;a href="https://ninadpathak.com/static/templates/documentation_placement_audit.py" rel="noopener noreferrer"&gt;documentation placement audit&lt;/a&gt; and ran it against an eight-artifact &lt;a href="https://ninadpathak.com/static/templates/documentation-placement-audit.json" rel="noopener noreferrer"&gt;sample manifest&lt;/a&gt;. The run classified three artifacts as internal, three as external, and two as split.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 documentation_placement_audit.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AUDIT PASSED: 8 artifacts, internal=3, external=3, split=2, review=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inspect the generated &lt;a href="https://ninadpathak.com/static/templates/documentation-placement-audit-report.csv" rel="noopener noreferrer"&gt;CSV report&lt;/a&gt; before adapting the fields to your own inventory. The script exposes mixed audiences and missing ownership, but a security or legal reviewer still decides what the organization may publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation ownership and update triggers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Placement&lt;/th&gt;
&lt;th&gt;Primary owner&lt;/th&gt;
&lt;th&gt;Useful update triggers&lt;/th&gt;
&lt;th&gt;Completion signal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Internal&lt;/td&gt;
&lt;td&gt;Team closest to the system or process&lt;/td&gt;
&lt;td&gt;Topology, workflow, control, tooling, incident, or ownership change&lt;/td&gt;
&lt;td&gt;An operator can complete the internal job safely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External&lt;/td&gt;
&lt;td&gt;Product documentation, developer experience, or product team&lt;/td&gt;
&lt;td&gt;Interface, behavior, prerequisite, limit, error, version, or support-pattern change&lt;/td&gt;
&lt;td&gt;An outside reader can complete the promised task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Split&lt;/td&gt;
&lt;td&gt;Named owner for each side, with one contract between them&lt;/td&gt;
&lt;td&gt;Any change that makes the public promise and private operation disagree&lt;/td&gt;
&lt;td&gt;Both pages agree on supported behavior without sharing private context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GitLab's &lt;a href="https://docs.gitlab.com/development/documentation/styleguide/" rel="noopener noreferrer"&gt;documentation style guide&lt;/a&gt; treats product documentation as a maintained source of truth for implementation, use, and troubleshooting. Apply the same maintenance discipline to private operational material.&lt;/p&gt;

&lt;p&gt;Start with the external task. If the answer also requires private operating context, create paired documents instead of widening one page until it serves neither reader well.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://ninadpathak.com/articles/types-of-technical-documentation/" rel="noopener noreferrer"&gt;types of technical documentation&lt;/a&gt; to choose the artifact each reader needs. If duplicate pages and navigation drift already hide the canonical answer, &lt;a href="https://ninadpathak.com/articles/how-to-organize-a-documentation-site/" rel="noopener noreferrer"&gt;organize the documentation site&lt;/a&gt; before adding more pages.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>software</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Types of Technical Documentation: 8 Essential Types, Plus Agent Instructions</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Wed, 12 Aug 2026 18:02:05 +0000</pubDate>
      <link>https://dev.to/ninadpathak/types-of-technical-documentation-8-essential-types-plus-agent-instructions-fk3</link>
      <guid>https://dev.to/ninadpathak/types-of-technical-documentation-8-essential-types-plus-agent-instructions-fk3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/types-of-technical-documentation/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/types-of-technical-documentation/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Technical documentation is not one thing. It is the set of documents that help someone use a product, understand a system, operate it safely, or change it without losing important context.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three audiences for technical documentation
&lt;/h2&gt;

&lt;p&gt;The most useful classification separates technical documentation by the person who needs it. ClickHelp makes a similar distinction between process documents and user documents, while Squarespace Engineering frames documentation around reader behavior, patience, experience, and goal.&lt;/p&gt;

&lt;p&gt;That gives you three useful groups. User-facing documents help customers or developers adopt a product.&lt;/p&gt;

&lt;p&gt;Process documents help the people building and operating it. Agent instructions give coding agents repository-specific context that would be distracting or irrelevant in a human-facing guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  User-facing documentation helps someone use the product
&lt;/h2&gt;

&lt;p&gt;These are the documents a customer, developer, administrator, or new user opens when they want to get started, complete a task, find a precise answer, or fix a failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Getting-started guides and quickstarts
&lt;/h3&gt;

&lt;p&gt;A getting-started guide takes someone from no working setup to a first result. It should name prerequisites, show the smallest supported path, and make success visible.&lt;/p&gt;

&lt;p&gt;React’s &lt;a href="https://react.dev/learn" rel="noopener noreferrer"&gt;Learn section&lt;/a&gt; moves from an introduction to concepts and hands-on learning without treating a new reader as if they already know the framework. A quickstart is not a full manual.&lt;/p&gt;

&lt;p&gt;Its job is to establish confidence and give the reader a sensible next page.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tutorials
&lt;/h3&gt;

&lt;p&gt;A tutorial teaches a capability through a guided sequence. It can combine several tasks because the reader is learning a skill, not only changing one setting.&lt;/p&gt;

&lt;p&gt;Squarespace Engineering distinguishes tutorials from how-to guides on that point. A tutorial demonstrates a use case or concept, while a how-to guide completes one bounded task.&lt;/p&gt;

&lt;p&gt;Keep checkpoints in the path so the reader can see whether they are still on track.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. How-to guides
&lt;/h3&gt;

&lt;p&gt;A how-to guide answers a specific operational question such as “rotate an API key,” “configure single sign-on,” or “add a webhook endpoint.” The reader already understands enough of the product to name the job.&lt;/p&gt;

&lt;p&gt;A strong guide states the starting condition, required access, procedure, success state, and recovery boundary. It does not repeat the product introduction or explain every adjacent feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Reference documentation
&lt;/h3&gt;

&lt;p&gt;Reference is where exact details live. API endpoints, request fields, SDK methods, configuration values, defaults, limits, return types, and error conditions belong here because readers need information they can scan and depend on.&lt;/p&gt;

&lt;p&gt;Stripe’s &lt;a href="https://docs.stripe.com/api" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; shows the central contract clearly. A reader can move from an object to its endpoints and fields without reading a tutorial first.&lt;/p&gt;

&lt;p&gt;Reference can include examples, but the examples should clarify the contract rather than turn the page into a learning path.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Troubleshooting guides
&lt;/h3&gt;

&lt;p&gt;Troubleshooting starts with a symptom, not a feature. The reader has already hit a failure and needs a way to identify the cause, recover safely, or know when to escalate.&lt;/p&gt;

&lt;p&gt;Kubernetes’ &lt;a href="https://kubernetes.io/docs/tasks/debug/" rel="noopener noreferrer"&gt;troubleshooting documentation&lt;/a&gt; organizes debugging work around the problem a user must diagnose. Good troubleshooting pages include the observable symptom, a diagnostic check, likely causes, a safe fix, and the point where guessing becomes risky.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Release notes and migration guides
&lt;/h3&gt;

&lt;p&gt;Release notes tell people what changed. Migration guides tell them what they need to do about that change.&lt;/p&gt;

&lt;p&gt;Treat those as related but different documents. A release note can announce a deprecated API version or a changed permission model.&lt;/p&gt;

&lt;p&gt;A migration guide should provide the affected starting state, replacement path, compatibility boundary, and a way to confirm completion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Process documentation helps a team build and operate the system
&lt;/h2&gt;

&lt;p&gt;Product documentation is only one part of technical documentation. Teams also need durable records that explain why a system exists in its current form and how to maintain it.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://ninadpathak.com/articles/internal-vs-external-documentation/" rel="noopener noreferrer"&gt;internal vs. external documentation decision&lt;/a&gt; to keep private operating context separate from the public task or contract.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Architecture and design documents
&lt;/h3&gt;

&lt;p&gt;Architecture documents describe the system’s components, boundaries, data flows, dependencies, and important decisions. A design document is often narrower, explaining a proposed change before implementation begins.&lt;/p&gt;

&lt;p&gt;These documents should answer questions that source code cannot answer quickly. They should make system boundaries and important decisions inspectable.&lt;/p&gt;

&lt;p&gt;For example, explain why a queue was selected over a synchronous call, which service owns a data set, and what assumptions make a deployment safe. A diagram can help, but it does not replace those decisions and constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Runbooks, onboarding guides, test plans, and standards
&lt;/h3&gt;

&lt;p&gt;Some process documents exist because somebody must perform the same work safely more than once. Runbooks describe routine or incident procedures.&lt;/p&gt;

&lt;p&gt;Onboarding guides give a new teammate the systems, access, and conventions they need. Test plans name the scope, method, risks, and expected outcome of verification work.&lt;/p&gt;

&lt;p&gt;Style guides and contribution guides belong here too. They turn unwritten conventions into something a contributor can inspect before they create avoidable review work.&lt;/p&gt;

&lt;p&gt;Tango’s &lt;a href="https://www.tango.ai/blog/types-of-technical-documents" rel="noopener noreferrer"&gt;collection of technical document types&lt;/a&gt; is useful for this broader view. It includes product manuals, quick-reference guides, requirements, project plans, roadmaps, test plans, release notes, and style guides rather than reducing technical documentation to API pages and tutorials.&lt;/p&gt;

&lt;h2&gt;
  
  
  The newer type: instructions for coding agents
&lt;/h2&gt;

&lt;p&gt;A repository can now have another reader that needs documentation: a coding agent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; is an open Markdown convention for repository instructions aimed at coding agents. Its purpose is not to replace a README.&lt;/p&gt;

&lt;p&gt;A README still helps people understand a project, install it, contribute to it, and find the public interface. An AGENTS.md file can hold the build commands, test commands, code conventions, security concerns, deployment details, and local rules that an agent needs when changing the repository.&lt;/p&gt;

&lt;p&gt;This is a useful addition because human contributors and coding agents need overlapping but different context. A human may need a project overview and contribution path.&lt;/p&gt;

&lt;p&gt;An agent may need the exact command sequence, test scope, nearest-file instruction rule, and prohibited changes before it edits code.&lt;/p&gt;

&lt;p&gt;Keep the boundary visible. Do not hide human onboarding inside an agent file, and do not expect a long README to provide the focused instruction an agent needs during an edit.&lt;/p&gt;

&lt;p&gt;If both audiences work in the repository, maintain both documents and link between them where the information overlaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build documentation from the work people need to finish
&lt;/h2&gt;

&lt;p&gt;You do not need every document type on launch day. Start by listing the moments where users and operators need an answer that cannot safely remain in chat history, a ticket, or one person’s memory.&lt;/p&gt;

&lt;p&gt;For a public API, that first package may include a quickstart, API reference, authentication guide, error guide, and release notes. For an internal service, it may start with an architecture document, onboarding guide, deployment runbook, and incident procedure.&lt;/p&gt;

&lt;p&gt;For an agent-enabled repository, add AGENTS.md when the agent needs instructions that should remain close to the code.&lt;/p&gt;

&lt;p&gt;Then give each document a clear owner and update trigger. An API schema change should trigger reference review.&lt;/p&gt;

&lt;p&gt;A revised deployment flow should trigger runbook review. A recurring support issue should trigger troubleshooting work.&lt;/p&gt;

&lt;p&gt;A changed build command should trigger README and agent-instruction review.&lt;/p&gt;

&lt;p&gt;I reviewed the ranking pages for this query, including ClickHelp, Tango, and Squarespace Engineering, alongside the AGENTS.md guidance. The useful conclusion is not that every team needs the same list.&lt;/p&gt;

&lt;p&gt;Documentation becomes easier to maintain when each type has a named audience, a distinct job, and a change that tells its owner when to revisit it.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://ninadpathak.com/articles/technical-documentation-template/" rel="noopener noreferrer"&gt;technical documentation template&lt;/a&gt; to turn that inventory into a working plan. Then use the &lt;a href="https://ninadpathak.com/articles/technical-documentation-best-practices-tested-real-developer-docs/" rel="noopener noreferrer"&gt;technical documentation best practices&lt;/a&gt; to test whether each page helps someone complete the job it promises.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
      <category>writing</category>
    </item>
    <item>
      <title>What Is Technical Documentation, and What Should It Include?</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Tue, 11 Aug 2026 18:02:28 +0000</pubDate>
      <link>https://dev.to/ninadpathak/what-is-technical-documentation-and-what-should-it-include-29lc</link>
      <guid>https://dev.to/ninadpathak/what-is-technical-documentation-and-what-should-it-include-29lc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/what-is-technical-documentation-and-what-should-it-include/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/what-is-technical-documentation-and-what-should-it-include/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Technical documentation is the material that helps someone understand, use, integrate with, or safely operate a system. It works when a reader can take the next step without guessing.&lt;/p&gt;

&lt;p&gt;Think of it as a route through a product. A tutorial gets someone moving, reference answers an exact question, explanation gives a decision context, and troubleshooting helps when the route breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What technical documentation should include
&lt;/h2&gt;

&lt;p&gt;Start with the reader task, not a list of page types. A developer evaluating a product needs different information from someone sending a first API request or investigating an error.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reader task&lt;/th&gt;
&lt;th&gt;Document that owns it&lt;/th&gt;
&lt;th&gt;What must be visible&lt;/th&gt;
&lt;th&gt;What shows it is enough&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Decide whether the product fits&lt;/td&gt;
&lt;td&gt;Orientation or README&lt;/td&gt;
&lt;td&gt;Scope, non-scope, supported use cases, and a starting link&lt;/td&gt;
&lt;td&gt;The reader can name the first relevant path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complete a first integration&lt;/td&gt;
&lt;td&gt;Quickstart or tutorial&lt;/td&gt;
&lt;td&gt;Prerequisites, one supported path, expected output, and a failure link&lt;/td&gt;
&lt;td&gt;The reader reaches a recognizable result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Understand a system choice&lt;/td&gt;
&lt;td&gt;Explanation&lt;/td&gt;
&lt;td&gt;Terms, model, constraints, and links to task pages&lt;/td&gt;
&lt;td&gt;The reader can explain the choice before implementing it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change an existing behavior&lt;/td&gt;
&lt;td&gt;How-to guide&lt;/td&gt;
&lt;td&gt;Starting state, procedure, success state, and recovery boundary&lt;/td&gt;
&lt;td&gt;The reader can perform the change safely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Look up an exact question&lt;/td&gt;
&lt;td&gt;Reference&lt;/td&gt;
&lt;td&gt;Names, types, defaults, constraints, and exceptions&lt;/td&gt;
&lt;td&gt;The reader can find the answer without inference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diagnose a failure&lt;/td&gt;
&lt;td&gt;Troubleshooting&lt;/td&gt;
&lt;td&gt;Symptom, diagnostic check, cause, recovery, and escalation boundary&lt;/td&gt;
&lt;td&gt;The reader can choose the next safe action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Respond to a product change&lt;/td&gt;
&lt;td&gt;Release note or migration guide&lt;/td&gt;
&lt;td&gt;Impact, required action, version or date, and a migration path&lt;/td&gt;
&lt;td&gt;The reader can decide whether action is required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The idea is, one page should not teach a beginner, document every field, explain the architecture, and debug production failures. Split those jobs so each page can answer its question completely.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://diataxis.fr/" rel="noopener noreferrer"&gt;Diátaxis framework&lt;/a&gt; separates tutorials, how-to guides, reference, and explanation for the same reason. The names help, but the reader task decides whether a page belongs in one category or another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the smallest package that lets someone succeed
&lt;/h2&gt;

&lt;p&gt;A small team does not need seven finished document types before launch. It needs enough material for the first reader to understand the product, finish one supported task, and locate the stable details or recovery guidance that task depends on.&lt;/p&gt;

&lt;p&gt;For an API, that often means an orientation page, a quickstart, and reference for the endpoint or SDK used in that quickstart. Add troubleshooting when a failed setup has a meaningful diagnostic path, then add release material when product changes can affect an existing integration.&lt;/p&gt;

&lt;p&gt;For a CLI, orientation should explain the tool’s job and supported environments. The quickstart should produce one visible command result, while reference owns commands, flags, exit behavior, and configuration.&lt;/p&gt;

&lt;p&gt;An internal platform may need a different starting package. Access, a supported setup path, ownership, and the operating rules that change a team’s next action can matter before a public-style product portal.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://ninadpathak.com/articles/internal-vs-external-documentation/" rel="noopener noreferrer"&gt;internal vs. external documentation decision&lt;/a&gt; when the same subject needs both private operating context and a public task-focused treatment.&lt;/p&gt;

&lt;p&gt;Google’s &lt;a href="https://developers.google.com/tech-writing/one/documents" rel="noopener noreferrer"&gt;technical writing guidance&lt;/a&gt; recommends defining scope, non-scope, and audience before expanding a draft. That decision keeps a page from collecting unrelated jobs as it grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give each document a boundary
&lt;/h2&gt;

&lt;p&gt;An orientation page helps a reader decide where to begin. It should answer what the product does, who it is for, what it does not cover, and where the first supported task starts.&lt;/p&gt;

&lt;p&gt;A quickstart proves one supported path. It should link to reference when exact options matter and to troubleshooting when a failure would block the first result.&lt;/p&gt;

&lt;p&gt;An explanation page gives a model for a design choice. It should make the next task easier without forcing the reader to learn every concept before they can do useful work.&lt;/p&gt;

&lt;p&gt;A how-to guide changes one behavior from a known starting state. Keep details that remain stable across many tasks in reference, and keep recurring failures in troubleshooting.&lt;/p&gt;

&lt;p&gt;Reference owns the public API surface. Google’s &lt;a href="https://developers.google.com/style/api-reference-comments" rel="noopener noreferrer"&gt;API reference guidance&lt;/a&gt; calls out methods, parameters, returns, and exceptions because implementation depends on exact behavior rather than narrative approximation.&lt;/p&gt;

&lt;p&gt;Troubleshooting starts from a recognizable symptom and gives a diagnostic check, likely cause, safe recovery, and escalation boundary. A generic support link cannot tell someone whether a retry is safe.&lt;/p&gt;

&lt;p&gt;Release notes explain changed behavior and required action. They should link to the canonical guide or migration page instead of repeating every instruction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make coverage inspectable before writing prose
&lt;/h2&gt;

&lt;p&gt;A document list can hide missing ownership. I ran a small &lt;a href="https://ninadpathak.com/static/templates/documentation-deliverables-manifest.yaml" rel="noopener noreferrer"&gt;documentation deliverables manifest&lt;/a&gt; for a webhook API example so every planned page has one reader task, success signal, owner, review trigger, and deferral condition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.venv/bin/python static/templates/validate_documentation_deliverables.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The validator passed with seven owned reader tasks. That result does not tell you whether every paragraph is good, but it does expose a missing task owner before a repository fills with overlapping pages.&lt;/p&gt;

&lt;p&gt;Documentation deliverables manifest validation&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="/static/images/articles/what-is-technical-documentation-and-what-should-it-include/documentation-deliverables-manifest.png?v=0c2f9fe6" alt="Terminal output showing a documentation deliverables manifest with seven owned reader tasks passed validation"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The validator checks each planned deliverable for a reader task, completion signal, owner, update trigger, and deferral condition.&lt;/p&gt;

&lt;p&gt;Use this kind of check before writing a documentation site from scratch. It is planning evidence, not a replacement for task testing, source checks, or editorial review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assign an owner and an update trigger
&lt;/h2&gt;

&lt;p&gt;A review date alone does not keep documentation current. Give each deliverable an owner and a product change that requires review, such as a schema change, permission change, new release behavior, support issue, or incident.&lt;/p&gt;

&lt;p&gt;GitLab’s &lt;a href="https://docs.gitlab.com/development/documentation/" rel="noopener noreferrer"&gt;documentation guidance&lt;/a&gt; treats documentation as maintained product material for configuring, using, and troubleshooting a system. Update the page when product behavior makes its existing instructions unsafe or incomplete.&lt;/p&gt;

&lt;p&gt;A useful review trigger connects the document to the change that can invalidate it. A schema change should prompt reference review, a revised onboarding flow should prompt quickstart review, and a recurring failure should prompt troubleshooting work.&lt;/p&gt;

&lt;p&gt;Use a &lt;a href="https://ninadpathak.com/articles/technical-documentation-template/" rel="noopener noreferrer"&gt;technical documentation template&lt;/a&gt; when you are ready to turn these decisions into a repository. Then &lt;a href="https://ninadpathak.com/articles/technical-documentation-best-practices-tested-real-developer-docs/" rel="noopener noreferrer"&gt;test whether a page helps someone finish a task&lt;/a&gt; before calling it complete.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://ninadpathak.com/articles/documentation-review-checklist-before-you-publish/" rel="noopener noreferrer"&gt;documentation review checklist&lt;/a&gt; before publication. If duplicate or stale answers are the problem, start by &lt;a href="https://ninadpathak.com/articles/how-to-organize-a-documentation-site/" rel="noopener noreferrer"&gt;organizing documentation that has drifted&lt;/a&gt; instead of adding another page.&lt;/p&gt;

</description>
      <category>developers</category>
      <category>documentation</category>
      <category>software</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Technical Documentation Best Practices, Tested on Real Developer Docs</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Mon, 10 Aug 2026 18:03:04 +0000</pubDate>
      <link>https://dev.to/ninadpathak/technical-documentation-best-practices-tested-on-real-developer-docs-27co</link>
      <guid>https://dev.to/ninadpathak/technical-documentation-best-practices-tested-on-real-developer-docs-27co</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/technical-documentation-best-practices-tested-real-developer-docs/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/technical-documentation-best-practices-tested-real-developer-docs/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A documentation page can be accurate and still fail the moment a reader leaves the happy path. The useful test is smaller: can someone complete one task, recognize the result, and recover from the failure most likely to interrupt it?&lt;/p&gt;

&lt;p&gt;The review uses &lt;a href="https://fastapi.tiangolo.com/tutorial/handling-errors/" rel="noopener noreferrer"&gt;FastAPI’s error-handling guide&lt;/a&gt;, &lt;a href="https://docs.stripe.com/api/idempotent_requests" rel="noopener noreferrer"&gt;Stripe’s idempotency reference&lt;/a&gt;, and &lt;a href="https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api" rel="noopener noreferrer"&gt;GitHub’s REST API rate-limit guide&lt;/a&gt;. A live source check returned &lt;code&gt;200&lt;/code&gt; for all three pages and confirmed the terms this review discusses: &lt;code&gt;HTTPException&lt;/code&gt;, &lt;code&gt;Idempotency-Key&lt;/code&gt;, and &lt;code&gt;x-ratelimit-remaining&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ninadpathak.com/static/templates/documentation-review-card.md" rel="noopener noreferrer"&gt;Download the documentation task review card&lt;/a&gt; and use it on a single important page before you expand a docs section. It turns a vague request for “better docs” into evidence a writer, engineer, and maintainer can inspect together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical documentation best practices that help readers finish a task
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Start with a task and a success state
&lt;/h3&gt;

&lt;p&gt;Readers do not arrive to learn an internal content model. They arrive with a job: return a useful error, retry a request safely, or understand why a request stopped working.&lt;/p&gt;

&lt;p&gt;FastAPI’s guide starts with an error response before it introduces &lt;code&gt;HTTPException&lt;/code&gt;. Its useful choice is the connection between condition, HTTP status, and response body, which lets the reader identify the state they created.&lt;/p&gt;

&lt;p&gt;A documentation page should make one finish line visible:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page type&lt;/th&gt;
&lt;th&gt;Reader task&lt;/th&gt;
&lt;th&gt;What proves completion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tutorial&lt;/td&gt;
&lt;td&gt;Complete a first useful action&lt;/td&gt;
&lt;td&gt;A command, response, or screen state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How-to&lt;/td&gt;
&lt;td&gt;Change one system behavior&lt;/td&gt;
&lt;td&gt;The input and expected result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reference&lt;/td&gt;
&lt;td&gt;Resolve a stable question&lt;/td&gt;
&lt;td&gt;A field, default, constraint, or type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troubleshooting&lt;/td&gt;
&lt;td&gt;Recover from a known failure&lt;/td&gt;
&lt;td&gt;Symptom, diagnostic, cause, and recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A reference page can stay compact instead of carrying a full end-to-end scenario. It still needs to identify the question it owns and the boundary that changes the answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Put recovery next to the action that can fail
&lt;/h3&gt;

&lt;p&gt;The most expensive documentation gap is often distance. A reader sees a happy-path request in one guide, hits a timeout, and has to search a separate FAQ to learn whether retrying will duplicate work.&lt;/p&gt;

&lt;p&gt;Stripe’s idempotency reference makes retry behavior part of the request contract. The relevant reader decision is not simply “add a header.”&lt;/p&gt;

&lt;p&gt;The decision is whether the same operation can be retried safely, what identifies that operation, and when changed parameters break the assumption.&lt;/p&gt;

&lt;p&gt;Use the same structure for any action with a meaningful failure mode:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Show the expected success state.&lt;/li&gt;
&lt;li&gt;Name the response, error, or condition that signals failure.&lt;/li&gt;
&lt;li&gt;Explain the repair, retry, or backoff decision.&lt;/li&gt;
&lt;li&gt;State the condition that makes that repair unsafe.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A common objection is that this makes a quickstart longer. That is true for a simple, reversible task with an obvious error.&lt;/p&gt;

&lt;p&gt;Once permissions, retries, asynchronous work, or quotas can change the outcome, leaving recovery elsewhere is not brevity. It is an undocumented implementation decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make limits observable before they become incidents
&lt;/h3&gt;

&lt;p&gt;A warning that an API “may throttle traffic” cannot help a client decide whether to queue work, slow down, or investigate configuration. The page needs a signal the client can inspect.&lt;/p&gt;

&lt;p&gt;GitHub’s rate-limit documentation distinguishes rate-limit behavior and exposes headers such as &lt;code&gt;x-ratelimit-remaining&lt;/code&gt;. That gives a developer an observable state to log or automate instead of a generic support symptom.&lt;/p&gt;

&lt;p&gt;For each limit, answer these questions in the same place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What resource is limited?&lt;/li&gt;
&lt;li&gt;Which header, field, dashboard value, or response shows remaining capacity?&lt;/li&gt;
&lt;li&gt;What state marks exhaustion?&lt;/li&gt;
&lt;li&gt;What should the client do next?&lt;/li&gt;
&lt;li&gt;When should the client stop retrying or escalate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the review card’s limit table to make this operational. If the writer cannot fill the signal and recovery columns, the documentation has not yet given the reader enough control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Give every reader question one owner
&lt;/h3&gt;

&lt;p&gt;Documentation drifts when tutorials, reference pages, release notes, and support articles all explain the same behavior differently. More navigation does not fix that conflict.&lt;/p&gt;

&lt;p&gt;Assign one page to own the task, then link outward for prerequisites, stable parameter detail, and deeper recovery. The &lt;a href="https://ninadpathak.com/articles/how-to-organize-a-documentation-site/" rel="noopener noreferrer"&gt;documentation organization guide&lt;/a&gt; explains how to split those page roles, while the &lt;a href="https://ninadpathak.com/articles/documentation-review-checklist-before-you-publish/" rel="noopener noreferrer"&gt;documentation review checklist&lt;/a&gt; covers the release checks that follow.&lt;/p&gt;

&lt;p&gt;The owner should also know what invalidates the page: a changed permission, renamed control, new response shape, revised quota, or support issue that reveals an absent recovery path. A review date alone cannot keep documentation current.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the review card before you publish
&lt;/h2&gt;

&lt;p&gt;The card is deliberately small. It asks for a reader, starting state, task, success state, risky action, failure signal, recovery boundary, limit signal, and page owner.&lt;/p&gt;

&lt;p&gt;Run it on the highest-risk page first, not every page at once. A payment request, authentication guide, migration path, or quota-sensitive endpoint is a better starting point than a low-stakes glossary entry.&lt;/p&gt;

&lt;p&gt;The point is not to make documentation longer. It is to stop forcing a reader to infer the state that determines whether the next action is safe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ninadpathak.com/static/templates/documentation-review-card.md" rel="noopener noreferrer"&gt;Download the review card&lt;/a&gt;, fill it against one rendered page, and turn the unanswered cells into the next documentation change.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>software</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Technical Documentation Template: Build Product Docs With a Tested Structure</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Sun, 09 Aug 2026 18:02:39 +0000</pubDate>
      <link>https://dev.to/ninadpathak/technical-documentation-template-build-product-docs-with-a-tested-structure-39m7</link>
      <guid>https://dev.to/ninadpathak/technical-documentation-template-build-product-docs-with-a-tested-structure-39m7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/technical-documentation-template/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/technical-documentation-template/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Creating documentation often forces several decisions at once: where readers begin, how they complete the first task, where exact details belong, and how they recover when a step fails. A template reduces that first pass to a structure you can inspect and adapt.&lt;/p&gt;

&lt;p&gt;I built this template to solve a narrow problem: an empty documentation repository leaves every contributor to invent navigation, page responsibilities, and release checks again. It provides five focused pages, a local validator, and a strict build path so the structure is useful before the product-specific writing begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download the technical documentation template
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/static/templates/technical-documentation-template.zip"&gt;Download the template&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unpack the archive, then replace the placeholders with evidence from your product. The remaining sections show what belongs in each page and how to verify the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a technical documentation template should include
&lt;/h2&gt;

&lt;p&gt;A technical documentation template is a reusable starting structure for product or engineering documentation. It should tell a contributor where a reader begins, where they complete a task, where they look up stable details, and where they recover from a known failure.&lt;/p&gt;

&lt;p&gt;A table of contents alone cannot do that work. It can label a page “Getting started” without establishing prerequisites, a tested command, an expected result, or a recovery path.&lt;/p&gt;

&lt;p&gt;The starter contains five pages because they create a complete first route without pretending every product needs the same collection.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;Reader job&lt;/th&gt;
&lt;th&gt;Evidence to add before publishing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;index.md&lt;/td&gt;
&lt;td&gt;Choose the first useful task&lt;/td&gt;
&lt;td&gt;A direct route to the right starting page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getting-started.md&lt;/td&gt;
&lt;td&gt;Complete first setup&lt;/td&gt;
&lt;td&gt;Prerequisites, a tested command, expected output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;guides/send-a-request.md&lt;/td&gt;
&lt;td&gt;Perform one bounded task&lt;/td&gt;
&lt;td&gt;A full request and response or observable state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reference/configuration.md&lt;/td&gt;
&lt;td&gt;Look up stable details&lt;/td&gt;
&lt;td&gt;Names, types, defaults, and constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;troubleshooting.md&lt;/td&gt;
&lt;td&gt;Recover from a known failure&lt;/td&gt;
&lt;td&gt;Symptom, diagnostic check, cause, and recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tutorials, how-to guides, reference, and explanation serve different reader needs. This template starts with a smaller product-docs system, then leaves room to add explanation when a concept needs more than instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The files included in the template
&lt;/h2&gt;

&lt;p&gt;The archive contains Markdown source, MkDocs configuration, a validator, and a GitHub Actions deployment workflow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;technical-documentation-template/
├── docs/
│   ├── index.md
│   ├── getting-started.md
│   ├── guides/send-a-request.md
│   ├── reference/configuration.md
│   └── troubleshooting.md
├── scripts/validate_docs.py
├── .github/workflows/deploy.yml
├── mkdocs.yml
└── requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This layout keeps navigation, source, validation, and deployment close together. The documentation is not just a folder of Markdown files.&lt;/p&gt;

&lt;p&gt;It is a small publishing system with inputs and checks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mkdocs.org/getting-started/" rel="noopener noreferrer"&gt;MkDocs&lt;/a&gt; uses the same basic split: a configuration file defines the site, a docs directory contains the source, and a build produces static output. Keeping those roles separate makes a broken link or missing navigation target easier to locate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn placeholders into a tested first task
&lt;/h2&gt;

&lt;p&gt;Start with the smallest action that proves your product is usable. For an API, that could be an authenticated request returning a known response.&lt;/p&gt;

&lt;p&gt;For a CLI, it could be installation followed by one safe command. For an internal service, it might be a local development setup that reaches a health endpoint.&lt;/p&gt;

&lt;p&gt;Write the getting-started page around that outcome. State what the reader needs before beginning, give the exact action, show the expected state, and link to the next task.&lt;/p&gt;

&lt;p&gt;A webhook product provides a concrete example. A vague template might say, “Configure a webhook endpoint.”&lt;/p&gt;

&lt;p&gt;A useful task page instead identifies the event, endpoint URL, signing-secret requirement, request body, successful response, and how to inspect a failed delivery. Each item answers a different question the reader encounters while completing the task.&lt;/p&gt;

&lt;p&gt;Do not move every option into the getting-started page. Put stable names, types, defaults, and constraints in reference.&lt;/p&gt;

&lt;p&gt;Stripe’s &lt;a href="https://docs.stripe.com/api" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; is useful to study because readers can move from an object to endpoints and fields without having to follow a tutorial first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give each page one owner and one update trigger
&lt;/h2&gt;

&lt;p&gt;A template stays useful when placeholder text is replaced with product evidence and maintained as the product changes.&lt;/p&gt;

&lt;p&gt;Give every page an owner and name the change that requires review. An API schema change should trigger reference review.&lt;/p&gt;

&lt;p&gt;A revised onboarding path should trigger getting-started review. A recurring support issue should create or update troubleshooting guidance.&lt;/p&gt;

&lt;p&gt;This rule is more useful than adding pages by habit. A page belongs in the documentation set when it owns a reader decision that would otherwise make another page harder to scan, update, or verify.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://ninadpathak.com/articles/how-to-organize-a-documentation-site/" rel="noopener noreferrer"&gt;documentation organization guide&lt;/a&gt; when existing pages overlap. Use the &lt;a href="https://ninadpathak.com/articles/types-of-technical-documentation/" rel="noopener noreferrer"&gt;technical documentation types guide&lt;/a&gt; when you need to decide whether the missing page is a tutorial, how-to guide, reference page, explanation, or an operational document.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validate the template before you publish it
&lt;/h2&gt;

&lt;p&gt;The starter validator checks that every navigation target exists, each Markdown page has one H1, and local Markdown links resolve.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python scripts/validate_docs.py
mkdocs build &lt;span class="nt"&gt;--strict&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The validation is deliberately narrow. It cannot prove that a live API endpoint works, a permission is correct, or a screenshot matches the current interface.&lt;/p&gt;

&lt;p&gt;Those claims still need product-level checks.&lt;/p&gt;

&lt;p&gt;Template validation and strict build receipt&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="/static/images/articles/technical-documentation-template/template-build-receipt.png" alt="Terminal receipt showing five navigation targets, five Markdown pages, one H1 per page, resolvable local links, a strict MkDocs build, and generated index and sitemap files"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The starter passed its repository checks and produced a static site in a fresh environment.&lt;/p&gt;

&lt;p&gt;I kept the validator beside the source because navigation defects are cheaper to catch before deployment. The &lt;a href="https://ninadpathak.com/articles/documentation-review-checklist-before-you-publish/" rel="noopener noreferrer"&gt;documentation review checklist&lt;/a&gt; adds a reader-facing review of links, visuals, accessibility, and the rendered page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publish the generated site, not your working files
&lt;/h2&gt;

&lt;p&gt;The included workflow installs pinned requirements, runs the validator, builds the site directory with strict checks, uploads that directory as the Pages artifact, and deploys it. Enable &lt;strong&gt;GitHub Actions&lt;/strong&gt; as the publishing source before expecting a public site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site" rel="noopener noreferrer"&gt;GitHub Pages documentation&lt;/a&gt; confirms that static-site generators can publish through a custom Actions workflow. Verify the public URL after the workflow finishes rather than treating a green build as a public release.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python scripts/validate_docs.py&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mkdocs build --strict&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-pages-artifact@v3&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;site&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not put production credentials, private examples, or customer data in the repository. Pages content is public on the internet even when a plan permits a private repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add pages when a reader need appears
&lt;/h2&gt;

&lt;p&gt;Begin with one tested path. Add reference when users need stable details without reading a guide.&lt;/p&gt;

&lt;p&gt;Add troubleshooting when a failure has a recognizable symptom and recovery. Add explanation when readers need to understand a design choice before they can apply it safely.&lt;/p&gt;

&lt;p&gt;That is how the template stays smaller than the product while still growing with it. The archive gives you the first structure and verification loop.&lt;/p&gt;

&lt;p&gt;Product evidence decides what belongs in it next.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Technical SEO Checklist for Documentation Sites</title>
      <dc:creator>Ninad Pathak</dc:creator>
      <pubDate>Sun, 09 Aug 2026 16:56:46 +0000</pubDate>
      <link>https://dev.to/ninadpathak/technical-seo-checklist-for-documentation-sites-1h76</link>
      <guid>https://dev.to/ninadpathak/technical-seo-checklist-for-documentation-sites-1h76</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://ninadpathak.com/articles/seo-for-technical-documentation/" rel="noopener noreferrer"&gt;https://ninadpathak.com/articles/seo-for-technical-documentation/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I built the audit for this guide around two pages: a working Cloudflare documentation guide and a deliberately broken local fixture. The contrast was useful because both pages had visible content, yet only one gave a crawler and a developer a dependable path through the task.&lt;/p&gt;

&lt;p&gt;A page succeeds when search engines can discover and interpret it, the right developer recognizes the task from the result, and the instructions carry that person to a working state. That is what this audit checks through search intent, discovery, crawling, indexing, canonicalization, page quality, performance, and measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical SEO audit checklist: what to check
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Blocking evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Search intent&lt;/td&gt;
&lt;td&gt;Does this page own one developer task?&lt;/td&gt;
&lt;td&gt;Another page already answers the same query better&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;Can a crawler reach the URL through links?&lt;/td&gt;
&lt;td&gt;No crawlable internal link from an indexable page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crawling&lt;/td&gt;
&lt;td&gt;Can the server return the page and its required resources?&lt;/td&gt;
&lt;td&gt;Blocked URL, redirect loop, repeated &lt;code&gt;5xx&lt;/code&gt;, inaccessible HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indexing&lt;/td&gt;
&lt;td&gt;Is the page eligible for search?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;noindex&lt;/code&gt;, soft 404, duplicate without a clear canonical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canonicalization&lt;/td&gt;
&lt;td&gt;Do all URL signals identify the same page?&lt;/td&gt;
&lt;td&gt;Canonical, sitemap, redirect, and internal links disagree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page quality&lt;/td&gt;
&lt;td&gt;Can the reader identify and complete the task?&lt;/td&gt;
&lt;td&gt;Generic title, stale version, missing prerequisites, broken example&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Measurement&lt;/td&gt;
&lt;td&gt;Can the team see what happened after release?&lt;/td&gt;
&lt;td&gt;No baseline, change annotation, or page owner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Step-by-step SEO audit for documentation sites
&lt;/h2&gt;

&lt;p&gt;Work through these eight checks in order. Fix the first blocking failure before moving to the next check.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Search intent and page ownership
&lt;/h3&gt;

&lt;p&gt;Make page ownership the first thing in your audit because developer searches usually contain a task, command, error, product, parameter, or version. The page that owns the query should name that task and make the successful state easy to recognize.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search&lt;/th&gt;
&lt;th&gt;Page that should own it&lt;/th&gt;
&lt;th&gt;Successful outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cloudflare workers deploy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment guide&lt;/td&gt;
&lt;td&gt;A Worker reaches a live URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stripe 401 invalid api key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Authentication troubleshooting page&lt;/td&gt;
&lt;td&gt;The request succeeds after the cause is fixed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl logs flags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Command reference&lt;/td&gt;
&lt;td&gt;The reader chooses and runs the correct flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;oauth refresh token expiry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Concept plus implementation guide&lt;/td&gt;
&lt;td&gt;The application renews access safely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;migrate sdk v2 to v3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Versioned migration guide&lt;/td&gt;
&lt;td&gt;The application runs on the supported version&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If two pages complete the same task, compare the documentation, marketing site, support center, changelog, and older versions before writing anything new. One page should become the canonical owner, with useful material from the weaker page moved into it before the duplicate is redirected or demoted.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ninadpathak.com/articles/how-to-organize-a-documentation-site/" rel="noopener noreferrer"&gt;documentation organization guide&lt;/a&gt; covers that consolidation work in detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Internal links and XML sitemaps
&lt;/h3&gt;

&lt;p&gt;Google's &lt;a href="https://developers.google.com/search/docs/fundamentals/seo-starter-guide" rel="noopener noreferrer"&gt;SEO Starter Guide&lt;/a&gt; identifies links as a primary way crawlers discover pages. Trace every important documentation URL back to a relevant hub, guide, or sibling page instead of treating its XML sitemap entry as the entire discovery strategy.&lt;/p&gt;

&lt;p&gt;The internal route has to make sense for a person too. A useful link carries the reader toward a prerequisite, a deeper explanation, or the next task rather than existing only because an audit wanted another inbound link.&lt;/p&gt;

&lt;h4&gt;
  
  
  Crawlable internal links
&lt;/h4&gt;

&lt;p&gt;Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/links-crawlable" rel="noopener noreferrer"&gt;crawlable-link guidance&lt;/a&gt; recommends an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element with an &lt;code&gt;href&lt;/code&gt; that resolves to a web address. Look for that ordinary HTML before trusting a navigation path, since JavaScript click handlers and empty anchors are less dependable for crawling and keyboard navigation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/docs/webhooks/verify-signatures/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Verify webhook signatures
&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The anchor should still identify the destination when someone reads it without the surrounding sentence. “Verify webhook signatures” carries the task on its own, while “Read more” asks both the reader and the crawler to infer it.&lt;/p&gt;

&lt;h4&gt;
  
  
  XML sitemap checks
&lt;/h4&gt;

&lt;p&gt;Treat the sitemap as a record of the URLs the site actually wants search engines to consider. Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap" rel="noopener noreferrer"&gt;sitemap guidance&lt;/a&gt; recommends fully qualified canonical URLs, which makes the following signals straightforward to compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The sitemap returns &lt;code&gt;200&lt;/code&gt; and valid XML.&lt;/li&gt;
&lt;li&gt;Every URL uses the preferred host and protocol.&lt;/li&gt;
&lt;li&gt;Redirects, &lt;code&gt;404&lt;/code&gt; pages, parameter variants, and noncanonical duplicates are absent.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;/code&gt; changes only after a meaningful page update.&lt;/li&gt;
&lt;li&gt;The sitemap is declared in &lt;code&gt;robots.txt&lt;/code&gt; or submitted through Search Console.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google ignores &lt;code&gt;&amp;lt;priority&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;changefreq&amp;gt;&lt;/code&gt;, so those fields do not need release time.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Crawling, rendering, and indexing
&lt;/h3&gt;

&lt;p&gt;The browser can make a broken page look healthy after JavaScript has run. Read the server response before reviewing the layout because it shows whether the content, links, and canonical metadata exist without asking a renderer to repair the page.&lt;/p&gt;

&lt;h4&gt;
  
  
  HTTP response and rendered HTML
&lt;/h4&gt;

&lt;p&gt;For the Cloudflare audit, I started with the final URL and headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--show-error&lt;/span&gt; &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dump-header&lt;/span&gt; headers.txt &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; page.html &lt;span class="se"&gt;\&lt;/span&gt;
  https://docs.example.com/api/authentication/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response reveals the status code, content type, redirect chain, &lt;code&gt;X-Robots-Tag&lt;/code&gt;, and cache behavior before presentation enters the picture. It also exposes branded error pages that return &lt;code&gt;200&lt;/code&gt; and risk being treated as soft 404s.&lt;/p&gt;

&lt;p&gt;Open the page in a clean browser context and compare the rendered result with the source. The stage is complete when the task content, title, headings, navigation, code, links, and canonical appear without a logged-in state or extra interaction.&lt;/p&gt;

&lt;p&gt;Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics" rel="noopener noreferrer"&gt;JavaScript SEO guidance&lt;/a&gt; explains how rendering affects indexing. Search Console URL Inspection shows Google's indexed view and live-test result.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;robots.txt&lt;/code&gt; and &lt;code&gt;noindex&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; controls crawling, while a page-level or header-level &lt;code&gt;noindex&lt;/code&gt; controls indexing. The distinction matters because Google still has to crawl a page before it can see the indexing directive.&lt;/p&gt;

&lt;p&gt;Resolve duplicates through redirects or canonical signals rather than hiding them in &lt;code&gt;robots.txt&lt;/code&gt;. A &lt;code&gt;noindex&lt;/code&gt; directive fits pages that should remain accessible but should not appear in search.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Canonical URLs and documentation versions
&lt;/h3&gt;

&lt;p&gt;Redirects and &lt;code&gt;rel="canonical"&lt;/code&gt; are strong canonicalization signals. Sitemap inclusion is weaker, so compare the signals together because disagreement usually reveals that templates, navigation, and deployment rules are describing different preferred URLs.&lt;/p&gt;

&lt;p&gt;Include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Final response URL&lt;/li&gt;
&lt;li&gt;Source &lt;code&gt;rel="canonical"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;XML sitemap URL&lt;/li&gt;
&lt;li&gt;Internal-link destinations&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hreflang&lt;/code&gt; URLs when present&lt;/li&gt;
&lt;li&gt;Structured-data URL&lt;/li&gt;
&lt;li&gt;Open Graph URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The preferred page needs an absolute self-referencing canonical, with every supporting signal pointing to it. Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls" rel="noopener noreferrer"&gt;canonicalization guidance&lt;/a&gt; also recommends linking internally to that preferred URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt;
  &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt;
  &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://docs.example.com/api/authentication/"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Versioned documentation is where policy becomes more important than a universal rule. Choose among three patterns based on whether the old instructions can still produce a valid result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Current version only:&lt;/strong&gt; Redirect retired task pages when the old instructions are no longer useful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple supported versions:&lt;/strong&gt; Give each version a distinct URL, visible label, navigation path, and self-canonical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical versions:&lt;/strong&gt; Keep them accessible, then decide whether they should remain indexable based on support and search demand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the instructions materially differ, keep the older page distinct rather than canonicalizing it to the current version. The pages are not interchangeable when following the wrong one can break an integration, and the URL policy should preserve that distinction.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Page titles, headings, and task content
&lt;/h3&gt;

&lt;p&gt;Labels such as “Overview,” “Configuration,” and “Usage” lose meaning when they leave their section. A useful label should still identify the task in a search result, browser tab, documentation tree, or copied URL.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://developers.google.com/search/docs/appearance/title-link" rel="noopener noreferrer"&gt;Google title-link guidance&lt;/a&gt; recommends a distinct, concise, accurate &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;. Google may also use the H1, prominent text, &lt;code&gt;og:title&lt;/code&gt;, and anchor text when generating a result title.&lt;/p&gt;

&lt;p&gt;Strong task pages repeat the same task across the URL, title, H1, description, and opening without repeating the same sentence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;URL:         /docs/webhooks/verify-signatures/
&amp;lt;title&amp;gt;:     Verify webhook signatures | Orbit Docs
H1:          Verify webhook signatures
Description: Validate Orbit webhook signatures and reject replayed requests.
Opening:     Use the signing secret and timestamp header to verify each payload.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reading the headings without the sidebar shows whether the procedure still makes sense. “Create an API key” and “Recover from an expired key” survive that test, while “Setup” and “Errors” depend on navigation context that search visitors may never see.&lt;/p&gt;

&lt;p&gt;The task is complete only when the page carries a reader through the required access and versions, a working command or request, expected output, recognizable failure symptoms, recovery, and cleanup. The &lt;a href="https://ninadpathak.com/articles/how-to-write-a-technical-tutorial-that-actually-teaches/" rel="noopener noreferrer"&gt;technical tutorial guide&lt;/a&gt; shows how to test that path from a clean environment.&lt;/p&gt;

&lt;p&gt;Return version-sensitive pages to the review queue when an SDK release, renamed field, changed permission, UI move, deprecation, support pattern, or ranking loss makes the instructions suspect. The updated date should change when the page itself changes meaningfully, not merely because the review took place.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Performance, mobile, and structured data
&lt;/h3&gt;

&lt;p&gt;Documentation sites reuse a small number of templates across many URLs, which makes template choice part of the evidence. Sample a task guide, API reference, search-results page, and versioned page because a fast homepage says little about how those heavier layouts behave.&lt;/p&gt;

&lt;h4&gt;
  
  
  Core Web Vitals
&lt;/h4&gt;

&lt;p&gt;Field data shows whether visitors experienced a problem, while lab tests reproduce it on the affected template. Documentation regressions often come from client-side search, syntax highlighting, large navigation trees, embedded consoles, chat widgets, and layout shifts when code or fonts load.&lt;/p&gt;

&lt;p&gt;Those three measurements become useful when they sit beside the element or script responsible. Largest Contentful Paint, Interaction to Next Paint, and Cumulative Layout Shift should lead to a specific template change and another test of the same page, not another generic score on a release checklist.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mobile documentation pages
&lt;/h4&gt;

&lt;p&gt;Test a narrow viewport and browser zoom because code, tables, and navigation often fail there before the prose does. The page passes when code blocks and tables scroll inside their container, while drawers, copy controls, search, feedback, and chat overlays leave the task visible.&lt;/p&gt;

&lt;p&gt;The same pass follows a few heading anchors and looks at long endpoint names near sticky navigation. These details matter even when most developers first discover the page on desktop because the template and indexing signals still serve every device.&lt;/p&gt;

&lt;h4&gt;
  
  
  HTTPS and structured data
&lt;/h4&gt;

&lt;p&gt;A clean documentation path loads the canonical page and its required resources over HTTPS without mixed content. Route HTTP and alternate-host requests to the preferred URL before those variants spread through internal links or the sitemap.&lt;/p&gt;

&lt;p&gt;Structured data should follow the visible page rather than inventing a richer result. When &lt;code&gt;Article&lt;/code&gt; or &lt;code&gt;TechArticle&lt;/code&gt; and &lt;code&gt;BreadcrumbList&lt;/code&gt; fit, compare the URL, headline, dates, author, and breadcrumb path with the canonical page before validating the markup.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Run the documentation SEO audit script
&lt;/h3&gt;

&lt;p&gt;I built a small standard-library Python auditor for this guide. It checks one page's response, &lt;code&gt;robots.txt&lt;/code&gt; access, index directives, title, description, canonical, H1, language, internal links, anchor text, image alt attributes, and sitemap membership.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ninadpathak.com/static/tools/docs-seo-audit.py" rel="noopener noreferrer"&gt;documentation SEO audit script&lt;/a&gt; runs as a standalone file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 docs-seo-audit.py &lt;span class="se"&gt;\&lt;/span&gt;
  https://developers.cloudflare.com/workers/get-started/guide/ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--json&lt;/span&gt; cloudflare-docs-audit.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command makes read-only requests and returns a human-readable report plus a JSON receipt.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cloudflare Workers audit result
&lt;/h4&gt;

&lt;p&gt;I ran the auditor against Cloudflare's Workers CLI getting-started guide. It returned 12 passes, zero warnings, and zero errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffx2qnqwlaiq75043w7ax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffx2qnqwlaiq75043w7ax.png" alt="Terminal receipt showing 12 passing documentation SEO checks for the Cloudflare Workers CLI guide, including canonical, title, links, image alt attributes, and sitemap membership" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The receipt records the URL and evidence for each source-HTML check.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The rendered page also exposes its place in the wider documentation system through the global directory, Workers sidebar, breadcrumbs, page title, outline, prerequisites, and first task.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvlri4annujoa39ne0s39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvlri4annujoa39ne0s39.png" alt="Cloudflare Workers CLI guide showing global navigation, the Workers sidebar, breadcrumbs, the CLI page title, prerequisites, and an on-this-page outline" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The page keeps the current task visible inside the wider product documentation.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Audit failure test
&lt;/h4&gt;

&lt;p&gt;I ran the same script against a deliberately broken local fixture. The fixture had &lt;code&gt;noindex&lt;/code&gt;, an empty title, no canonical, two H1 elements, no crawlable internal links, and an image without an &lt;code&gt;alt&lt;/code&gt; attribute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fylo0wfy8d0u61i3r6nri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fylo0wfy8d0u61i3r6nri.png" alt="Terminal receipt showing two errors and eight warnings for a deliberately broken documentation fixture, including noindex, missing title, missing canonical, two H1 elements, and missing image alt text" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The script exits unsuccessfully when it finds blocking index or title problems.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Audit script limitations
&lt;/h4&gt;

&lt;p&gt;The script inspects one page's source HTML. It does not crawl the entire site, execute JavaScript, test Core Web Vitals, confirm Google's selected canonical, or prove that the page deserves to rank.&lt;/p&gt;

&lt;p&gt;Use the script as the first gate because it turns obvious source-level failures into an inspectable receipt. The wider audit still needs a rendered-browser review, a link crawl, Search Console URL Inspection, field performance data, and a human attempt to complete the task.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Measure documentation search performance
&lt;/h3&gt;

&lt;p&gt;A baseline gives the team a point of comparison before a title, canonical, internal-link path, template, or version policy changes. Save the page and query data with the release date, then compare equivalent windows after search engines have had time to recrawl the page.&lt;/p&gt;

&lt;p&gt;Clicks, impressions, CTR, average position, index state, and the URL selected for the query each describe a different part of the result. The process has worked when the team can explain what moved, test the likely cause against the page and competing results, and choose the next change without guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical SEO checklist for documentation sites
&lt;/h2&gt;

&lt;p&gt;Use this checklist during the release review.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search intent
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] The page names one reader, task, and successful outcome.&lt;/li&gt;
&lt;li&gt;[ ] Site search and web search show no stronger page for the same intent.&lt;/li&gt;
&lt;li&gt;[ ] Marketing, support, reference, tutorial, and version pages have distinct jobs.&lt;/li&gt;
&lt;li&gt;[ ] One canonical page owns the task.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Discovery and crawling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] At least one relevant indexable page links to the URL.&lt;/li&gt;
&lt;li&gt;[ ] Links use &lt;code&gt;&amp;lt;a href&amp;gt;&lt;/code&gt; and resolve without a click handler.&lt;/li&gt;
&lt;li&gt;[ ] The canonical URL appears in the XML sitemap.&lt;/li&gt;
&lt;li&gt;[ ] The final response returns the correct status and HTML content type.&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;robots.txt&lt;/code&gt; allows required crawling.&lt;/li&gt;
&lt;li&gt;[ ] Initial and rendered HTML contain the task content, links, and canonical.&lt;/li&gt;
&lt;li&gt;[ ] Error pages return honest status codes instead of soft &lt;code&gt;200&lt;/code&gt; responses.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Indexing and canonicalization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] No accidental page-level or header-level &lt;code&gt;noindex&lt;/code&gt; exists.&lt;/li&gt;
&lt;li&gt;[ ] The preferred page has an absolute self-referencing canonical.&lt;/li&gt;
&lt;li&gt;[ ] Redirects, internal links, sitemap entries, and structured data use the same URL.&lt;/li&gt;
&lt;li&gt;[ ] Parameters, print views, and trailing-slash variants are handled deliberately.&lt;/li&gt;
&lt;li&gt;[ ] Language and version pages have a documented indexing policy.&lt;/li&gt;
&lt;li&gt;[ ] Search Console confirms the intended canonical after processing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Page quality
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] URL, &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, H1, description, and opening name the same task.&lt;/li&gt;
&lt;li&gt;[ ] The title is unique, concise, current, and free of boilerplate stuffing.&lt;/li&gt;
&lt;li&gt;[ ] Headings expose the procedure when read without the sidebar.&lt;/li&gt;
&lt;li&gt;[ ] Prerequisites and supported versions appear before dependent steps.&lt;/li&gt;
&lt;li&gt;[ ] Commands and examples run in the promised environment.&lt;/li&gt;
&lt;li&gt;[ ] Expected output, failure symptoms, recovery, and cleanup are present.&lt;/li&gt;
&lt;li&gt;[ ] Images have contextual alt text and useful captions.&lt;/li&gt;
&lt;li&gt;[ ] Code, tables, navigation, and overlays work at narrow widths and browser zoom.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance and structured data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Field and lab performance checks cover representative documentation templates.&lt;/li&gt;
&lt;li&gt;[ ] Client-side search, syntax highlighting, consoles, fonts, and widgets do not block the task.&lt;/li&gt;
&lt;li&gt;[ ] Code blocks and tables do not create page-level horizontal overflow.&lt;/li&gt;
&lt;li&gt;[ ] Every canonical page and required resource loads over HTTPS without mixed content.&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Article&lt;/code&gt; or &lt;code&gt;TechArticle&lt;/code&gt; and &lt;code&gt;BreadcrumbList&lt;/code&gt; fields match visible content and the canonical URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Measurement
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Page-query performance and index state are saved before and after changes.&lt;/li&gt;
&lt;li&gt;[ ] Publish and update dates are annotated beside the measurement window.&lt;/li&gt;
&lt;li&gt;[ ] Growth and decline are recorded separately from proposed causes.&lt;/li&gt;
&lt;li&gt;[ ] The page has an owner and product-triggered update conditions.&lt;/li&gt;
&lt;li&gt;[ ] Review dates match the site's crawl rate and query volume.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Start with one documentation path
&lt;/h2&gt;

&lt;p&gt;Begin with one setup, authentication, deployment, troubleshooting, or migration path that affects product use. Complete and measure that path before expanding the audit to the rest of the documentation site.&lt;/p&gt;

</description>
      <category>documentationseo</category>
      <category>technicalwriting</category>
      <category>devrel</category>
    </item>
  </channel>
</rss>
