{
    "version": "https://jsonfeed.org/version/1",
    "title": "CoinsGPT Blog",
    "home_page_url": "https://coinsgpt.github.io/blog",
    "description": "Keep up to date with upcoming Docusaurus releases and articles by following our feed!",
    "items": [
        {
            "id": "https://coinsgpt.github.io/blog/releases/3.7",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 3.7</strong>.</p>\n<p>Docusaurus is now compatible with <a href=\"https://react.dev/blog/2024/12/05/react-19\" target=\"_blank\" rel=\"noopener noreferrer\">React 19</a>.</p>\n<p>Upgrading should be easy. Our <a href=\"https://coinsgpt.github.io/community/release-process\">release process</a> respects <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus blog post social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-73a479db9ad439c10153f05dc03fdc91.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlight\">Highlight<a href=\"https://coinsgpt.github.io/blog/releases/3.7#highlight\" class=\"hash-link\" aria-label=\"Direct link to Highlight\" title=\"Direct link to Highlight\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"react-19\">React 19<a href=\"https://coinsgpt.github.io/blog/releases/3.7#react-19\" class=\"hash-link\" aria-label=\"Direct link to React 19\" title=\"Direct link to React 19\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10763\" target=\"_blank\" rel=\"noopener noreferrer\">#10763</a>, we added support for <a href=\"https://react.dev/blog/2024/12/05/react-19\" target=\"_blank\" rel=\"noopener noreferrer\">React 19</a>, and the Docusaurus website is running on React 19 already.</p>\n<p>From now on, all newly initialized sites will run on React 19 by default, and React 19 will be the minimum required version Docusaurus v4.</p>\n<p>However, React 18 remains supported, and existing Docusaurus sites can either choose to stay on React 18, or upgrade their dependencies to React 19:</p>\n<div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">{</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\"> \"name\": \"my-docusaurus-site\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\"> \"dependencies\": {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">   \"react\": \"^18.0.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">   \"react-dom\": \"^18.0.0\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">   \"react\": \"^19.0.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">   \"react-dom\": \"^19.0.0\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\"> }</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token plain\">}</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>warning</div><div class=\"admonitionContent_Knsx\"><p>There's no urge to upgrade your site immediately.</p><p>React 19 is a bit heavier than React 18. Since we support both versions, we don't leverage yet the new features that are exclusive to React 19.</p><p>However, upgrading to React 19 prepares your site for Docusaurus v4, that will drop support for React 18.</p><p>Here are good reasons to upgrade your site before Docusaurus v4:</p><ul>\n<li>You have custom React code and want to ensure it is ready for React19</li>\n<li>You plan to leverage the brand-new React 19 features in your own code</li>\n<li>You use custom or third-party plugins and want to ensure their compatibility</li>\n<li>You have a monorepo and want to align the React dependency to v19 for all packages</li>\n</ul></div></div>\n<p>Along the way, we <a href=\"https://github.com/facebook/docusaurus/pull/10786\" target=\"_blank\" rel=\"noopener noreferrer\">fixed</a> all the remaining hydration errors reported by React 19, some of them produced by our aggressive HTML minifier settings.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"svgr-plugin\">SVGR plugin<a href=\"https://coinsgpt.github.io/blog/releases/3.7#svgr-plugin\" class=\"hash-link\" aria-label=\"Direct link to SVGR plugin\" title=\"Direct link to SVGR plugin\">​</a></h3>\n<p>Docusaurus has built-in support for <a href=\"https://github.com/gregberge/svgr\" target=\"_blank\" rel=\"noopener noreferrer\">SVGR</a>, allowing you to seamlessly import and use SVG files as React components:</p>\n<div class=\"language-tsx codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-tsx codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token imports maybe-class-name\">DocusaurusSvg</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'./docusaurus.svg'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag class-name\" style=\"color:#116329\">DocusaurusSvg</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag punctuation\" style=\"color:#393A34\">/&gt;</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<p>This built-in support has been the source of various bug reports due to the inability to customize the <a href=\"https://react-svgr.com/docs/options/\" target=\"_blank\" rel=\"noopener noreferrer\">SVGR Options</a>, in particular the <a href=\"https://svgo.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">SVG Optimizer</a> options.</p>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10677\" target=\"_blank\" rel=\"noopener noreferrer\">#10677</a>, we extracted a new <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-svgr\"><code>@docusaurus/plugin-svgr</code></a> that you can now configure according to your needs. It is included by default in our classic preset:</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword module\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">presets</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token string\" style=\"color:#C6105F\">'classic'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token literal-property property\" style=\"color:#005CC5\">svgr</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token literal-property property\" style=\"color:#005CC5\">svgrConfig</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Your SVGR options ...</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token literal-property property\" style=\"color:#005CC5\">svgoConfig</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">              </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Your SVGO options ...</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">              </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Use \"svgoConfig: undefined\" to use a svgo.config.js file</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/3.7#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Other notable changes include:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10768\" target=\"_blank\" rel=\"noopener noreferrer\">#10768</a>: Blog authors have built-in icons for social platforms bluesky, mastodon, threads, twitch, youtube, instagram.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10729\" target=\"_blank\" rel=\"noopener noreferrer\">#10729</a>: Blog now supports <code>frontMatter.sidebar_label</code></li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10803\" target=\"_blank\" rel=\"noopener noreferrer\">#10803</a>: <code>@docusaurus/remark-plugin-npm2yarn</code> now supports Bun conversions.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10672\" target=\"_blank\" rel=\"noopener noreferrer\">#10672</a>: Upgrade Algolia DocSearch to <code>algoliasearch</code> v5.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10800\" target=\"_blank\" rel=\"noopener noreferrer\">#10800</a>: Docusaurus Faster turns Rspack incremental mode on by default.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10783\" target=\"_blank\" rel=\"noopener noreferrer\">#10783</a>: Improve Dutch theme translations.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10760\" target=\"_blank\" rel=\"noopener noreferrer\">#10760</a>: Improve Korean theme translations.</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/3.7.0\">3.7.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/3.7",
            "title": "Docusaurus 3.7",
            "summary": "We are happy to announce Docusaurus 3.7.",
            "date_modified": "2025-01-03T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/3.6",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 3.6</strong>.</p>\n<p>Docusaurus is now ⚡️⚡️⚡️ <strong>much faster</strong> to build your site.</p>\n<p>Upgrading should be easy. Our <a href=\"https://coinsgpt.github.io/community/release-process\">release process</a> respects <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus blog post social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-5214adcb56c496fa6afc571fb4d378f6.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/3.6#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<p>This release has been mostly focused on build performance through the <a href=\"https://github.com/facebook/docusaurus/issues/10556\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus Faster</a> project.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"docusaurus-faster\">Docusaurus Faster<a href=\"https://coinsgpt.github.io/blog/releases/3.6#docusaurus-faster\" class=\"hash-link\" aria-label=\"Direct link to Docusaurus Faster\" title=\"Direct link to Docusaurus Faster\">​</a></h2>\n<p>The <a href=\"https://github.com/facebook/docusaurus/issues/10556\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus Faster</a> project's goal is to reduce the build times and memory consumption.</p>\n<p>We have worked on multiple optimizations and modernized our infrastructure to use faster Rust-based tools, notably:</p>\n<ul>\n<li>🦀 <a href=\"https://rspack.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Rspack</a>: Fast Rust-based web bundler, almost drop-in replacement for <a href=\"https://webpack.js.org/\" target=\"_blank\" rel=\"noopener noreferrer\">webpack</a></li>\n<li>🦀 <a href=\"https://swc.rs/\" target=\"_blank\" rel=\"noopener noreferrer\">SWC</a>: Speedy Web Compiler, Rust-based platform for the Web (HTML, CSS, JS)</li>\n<li>🦀 <a href=\"https://lightningcss.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Lightning CSS</a>: An extremely fast CSS parser, transformer, bundler, and minifier</li>\n</ul>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"impacts\">Impacts<a href=\"https://coinsgpt.github.io/blog/releases/3.6#impacts\" class=\"hash-link\" aria-label=\"Direct link to Impacts\" title=\"Direct link to Impacts\">​</a></h3>\n<p>Adopting a new infrastructure can have various impacts. It's impossible to list them all exhaustively, so let's focus on the major ones.</p>\n<p>To help you adopt it easily, we have been fairly conservative in terms of expected static site output and <a href=\"https://coinsgpt.github.io/docs/browser-support\">browser support</a>.</p>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"build-time\">Build Time<a href=\"https://coinsgpt.github.io/blog/releases/3.6#build-time\" class=\"hash-link\" aria-label=\"Direct link to Build Time\" title=\"Direct link to Build Time\">​</a></h4>\n<p>Benchmarks on community site show that you can expect your production site to build ⚡️<strong>2 to 4 times faster</strong>! 🔥:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/react-native-website/pull/4268\" target=\"_blank\" rel=\"noopener noreferrer\">React Native website</a>: 3.04x faster 🔥</li>\n<li><a href=\"https://github.com/babel/website/pull/2997\" target=\"_blank\" rel=\"noopener noreferrer\">Babel website</a>: 3.27x faster 🔥</li>\n<li><a href=\"https://github.com/facebook/lexical/pull/6761\" target=\"_blank\" rel=\"noopener noreferrer\">Lexical website</a>: 2x faster 🔥</li>\n</ul>\n<p><a href=\"https://github.com/facebook/docusaurus/issues/10556#issuecomment-2407671873\" target=\"_blank\" rel=\"noopener noreferrer\">How to benchmark</a></p>\n<div class=\"theme-admonition theme-admonition-note admonition_o5H7 alert alert--secondary\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z\"></path></svg></span>About rebuilds</div><div class=\"admonitionContent_Knsx\"><p><a href=\"https://rspack.dev/misc/planning/roadmap#persistent-cache\" target=\"_blank\" rel=\"noopener noreferrer\">Rspack doesn't support persistent caching yet</a>, but it's on the roadmap and should be implemented soon. We think it's not a problem for the adoption of Rspack considering a cold Rspack build is usually as fast as a warm Webpack build using persistent caching.</p></div></div>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"memory-consumption\">Memory Consumption<a href=\"https://coinsgpt.github.io/blog/releases/3.6#memory-consumption\" class=\"hash-link\" aria-label=\"Direct link to Memory Consumption\" title=\"Direct link to Memory Consumption\">​</a></h4>\n<p>You should also notice an improvement in memory consumption:</p>\n<ul>\n<li>The new infrastructure consumes less memory overall</li>\n<li>We fixed an important <a href=\"https://github.com/facebook/docusaurus/pull/10599\" target=\"_blank\" rel=\"noopener noreferrer\">memory leak</a> that affects in particular i18n sites</li>\n<li>We added <a href=\"https://github.com/facebook/docusaurus/pull/10601\" target=\"_blank\" rel=\"noopener noreferrer\">CI checks</a> to ensure that we don't regress, and that our site and init template can both build in a memory-constrained environments</li>\n<li>We added <a href=\"https://github.com/facebook/docusaurus/pull/10590\" target=\"_blank\" rel=\"noopener noreferrer\">internal tooling</a> to better understand which step of a build consumes memory</li>\n<li>We <a href=\"https://github.com/facebook/docusaurus/pull/10410\" target=\"_blank\" rel=\"noopener noreferrer\">removed a <code>process.exit(0)</code></a> that can hide memory leaks in your own code and third-party plugins</li>\n</ul>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-impacts\">Other Impacts<a href=\"https://coinsgpt.github.io/blog/releases/3.6#other-impacts\" class=\"hash-link\" aria-label=\"Direct link to Other Impacts\" title=\"Direct link to Other Impacts\">​</a></h4>\n<ul>\n<li>The HTML minifier now <a href=\"https://github.com/facebook/docusaurus/discussions/10580\" target=\"_blank\" rel=\"noopener noreferrer\">emits warnings in case of invalid HTML markup</a></li>\n<li>The static HTML output is <a href=\"https://github.com/facebook/docusaurus/pull/10554\" target=\"_blank\" rel=\"noopener noreferrer\">~5% smaller</a></li>\n<li>Some bugs are automatically fixed by the new infrastructure</li>\n</ul>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"adoption-strategy\">Adoption Strategy<a href=\"https://coinsgpt.github.io/blog/releases/3.6#adoption-strategy\" class=\"hash-link\" aria-label=\"Direct link to Adoption Strategy\" title=\"Direct link to Adoption Strategy\">​</a></h3>\n<p>This new infrastructure is a breaking change, but it is opt-in and does not require a new major version of Docusaurus.</p>\n<p>Before using Docusaurus Faster, add this new package:</p>\n<div class=\"tabs-container tabList_Qoir\"><ul role=\"tablist\" aria-orientation=\"horizontal\" class=\"tabs\"><li role=\"tab\" tabindex=\"0\" aria-selected=\"true\" class=\"tabs__item tabItem_AQgk tabs__item--active\">npm</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_AQgk\">Yarn</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_AQgk\">pnpm</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_AQgk\">Bun</li></ul><div class=\"margin-top--md\"><div role=\"tabpanel\" class=\"tabItem_pnkT\"><div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#8250DF\">npm</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">install</span><span class=\"token plain\"> @docusaurus/faster</span><br></span></code></pre></div></div></div><div role=\"tabpanel\" class=\"tabItem_pnkT\" hidden=\"\"><div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#8250DF\">yarn</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">add</span><span class=\"token plain\"> @docusaurus/faster</span><br></span></code></pre></div></div></div><div role=\"tabpanel\" class=\"tabItem_pnkT\" hidden=\"\"><div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#8250DF\">pnpm</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">add</span><span class=\"token plain\"> @docusaurus/faster</span><br></span></code></pre></div></div></div><div role=\"tabpanel\" class=\"tabItem_pnkT\" hidden=\"\"><div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">bun </span><span class=\"token function\" style=\"color:#8250DF\">add</span><span class=\"token plain\"> @docusaurus/faster</span><br></span></code></pre></div></div></div></div></div>\n<p>To help you <strong>adopt it incrementally under Docusaurus v3</strong>, we're introducing a set of feature flags that you can activate progressively.</p>\n<p>We recommend turning them on all at once with this simple boolean shortcut:</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> config </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">future</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token literal-property property\" style=\"color:#005CC5\">experimental_faster</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<p>In case one of the flags does not work for your site, it's possible to turn feature flags on independently:</p>\n<div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> config </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  future</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    experimental_faster</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      swcJsLoader</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      swcJsMinimizer</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      swcHtmlMinimizer</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      lightningCssMinimizer</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      rspackBundler</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      mdxCrossCompilerCache</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10435\" target=\"_blank\" rel=\"noopener noreferrer\"><code>swcJsLoader</code></a>: Use <a href=\"https://swc.rs/\" target=\"_blank\" rel=\"noopener noreferrer\">SWC</a> to transpile JS (instead of <a href=\"https://babeljs.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Babel</a>)</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10441\" target=\"_blank\" rel=\"noopener noreferrer\"><code>swcJsMinimizer</code></a>: Use <a href=\"https://swc.rs/\" target=\"_blank\" rel=\"noopener noreferrer\">SWC</a> to minify JS (instead of <a href=\"https://github.com/terser/terser\" target=\"_blank\" rel=\"noopener noreferrer\">Terser</a>)</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10554\" target=\"_blank\" rel=\"noopener noreferrer\"><code>swcHtmlMinimizer </code></a>: Use <a href=\"https://swc.rs/\" target=\"_blank\" rel=\"noopener noreferrer\">SWC</a> to minify HTML and inlined JS/CSS (instead of <a href=\"https://github.com/terser/html-minifier-terser\" target=\"_blank\" rel=\"noopener noreferrer\">html-minifier-terser</a>)</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10522\" target=\"_blank\" rel=\"noopener noreferrer\"><code>lightningCssMinimizer</code></a>: Use <a href=\"https://lightningcss.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Lightning CSS</a> to minify CSS (instead of <a href=\"https://github.com/cssnano/cssnano\" target=\"_blank\" rel=\"noopener noreferrer\">cssnano</a> and <a href=\"https://github.com/clean-css/clean-css\" target=\"_blank\" rel=\"noopener noreferrer\">clean-css</a>)</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10402\" target=\"_blank\" rel=\"noopener noreferrer\"><code>rspackBundler</code></a>: Use <a href=\"https://rspack.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Rspack</a> to bundle your app (instead of <a href=\"https://webpack.js.org/\" target=\"_blank\" rel=\"noopener noreferrer\">webpack</a>)</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10479\" target=\"_blank\" rel=\"noopener noreferrer\"><code>mdxCrossCompilerCache</code></a>: Compile MDX files once for both browser/Node.js environments instead of twice</li>\n</ul>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Experimental but safe</div><div class=\"admonitionContent_Knsx\"><p>Don't be afraid to turn this feature on. What's experimental is the config options.</p><p>The new infrastructure is robust and well-tested by our CI pipeline. The <a href=\"https://docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus site</a> already uses it in production, and we plan to use it on other Meta docs sites as well.</p></div></div>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"plugins\">Plugins<a href=\"https://coinsgpt.github.io/blog/releases/3.6#plugins\" class=\"hash-link\" aria-label=\"Direct link to Plugins\" title=\"Direct link to Plugins\">​</a></h4>\n<p>The new infrastructure uses <a href=\"https://rspack.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Rspack</a>. By chance, Rspack is almost 100% compatible with <a href=\"https://webpack.js.org/\" target=\"_blank\" rel=\"noopener noreferrer\">webpack</a>, and Rspack shouldn't break our plugin ecosystem.</p>\n<p>Most Docusaurus plugins should work out of the box with Rspack, even those implementing <a href=\"https://coinsgpt.github.io/docs/api/plugin-methods/lifecycle-apis#configureWebpack\"><code>configureWebpack</code></a>.</p>\n<p>However, some of them will require small modifications to make them compatible with Rspack. The general idea is to avoid importing <code>webpack</code> directly, and use the \"dynamically provided\" webpack instance instead:</p>\n<div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">import webpack from 'webpack';</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">export default function (context, options) {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\"> return {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">   name: 'custom-docusaurus-plugin',</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">   configureWebpack(config, isServer) {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">   configureWebpack(config, isServer, {currentBundler}) {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">     return {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">       plugins: [</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">         new webpack.DefinePlugin({}),</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">         new currentBundler.instance.DefinePlugin({}),</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">       ]</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">     };</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">   },</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\"> };</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token plain\">}</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>For plugins authors</div><div class=\"admonitionContent_Knsx\"><p>Check the <a href=\"https://github.com/facebook/docusaurus/issues/10572\" target=\"_blank\" rel=\"noopener noreferrer\">dedicated issue</a> for guidelines and support.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"next-steps\">Next Steps<a href=\"https://coinsgpt.github.io/blog/releases/3.6#next-steps\" class=\"hash-link\" aria-label=\"Direct link to Next Steps\" title=\"Direct link to Next Steps\">​</a></h3>\n<p>It's only the beginning: we will continue working on the <a href=\"https://github.com/facebook/docusaurus/issues/10556\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus Faster</a> project and already have a few more performance improvements planned.</p>\n<p>Depending on <a href=\"https://github.com/facebook/docusaurus/issues/10556\" target=\"_blank\" rel=\"noopener noreferrer\">your feedback</a>, we plan to make this new infrastructure the default in an upcoming major version of Docusaurus.</p>\n<p>🙏 We'd like to thank the authors of all these great tools that already helped us make Docusaurus much faster than before. In particular the <a href=\"https://rspack.dev/misc/team/core-team\" target=\"_blank\" rel=\"noopener noreferrer\">Rspack team</a> that supported us along the way, handled our feedback very quickly and implemented all the missing features we needed to make it happen. 👏</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"rsdoctor-plugin\">Rsdoctor plugin<a href=\"https://coinsgpt.github.io/blog/releases/3.6#rsdoctor-plugin\" class=\"hash-link\" aria-label=\"Direct link to Rsdoctor plugin\" title=\"Direct link to Rsdoctor plugin\">​</a></h2>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10588\" target=\"_blank\" rel=\"noopener noreferrer\">#10588</a>, we created a Docusaurus plugin for <a href=\"https://rsdoctor.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Rsdoctor</a>. It analyzes the bundling phase of Docusaurus and helps you figure out what slows down the bundler in terms of loaders, plugins and minimizers. It works for both webpack and Rspack.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Loader timeline example\" src=\"https://coinsgpt.github.io/assets/images/rsdoctor-36963a4eaca95f83538208463e62eae2.jpg\" width=\"1436\" height=\"690\" class=\"img_vXGZ\"></p>\n<p>To use it, install the new <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-rsdoctor\"><code>@docusaurus/plugin-rsdoctor</code></a> package, and then use the plugin in your config:</p>\n<div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  plugins</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token string\" style=\"color:#C6105F\">'rsdoctor'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* options */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>Turn it on conditionally, based on an environment variable:</p><div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  plugins</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    process</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token plain\">env</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token constant\" style=\"color:#005CC5\">RSDOCTOR</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">===</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'true'</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">&amp;&amp;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token string\" style=\"color:#C6105F\">'rsdoctor'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* options */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div><div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\"># Build without Rsdoctor</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#8250DF\">npm</span><span class=\"token plain\"> run build</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\"># Build with Rsdoctor</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token assign-left variable\" style=\"color:#E36209\">RSDOCTOR</span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\">true </span><span class=\"token function\" style=\"color:#8250DF\">npm</span><span class=\"token plain\"> run build</span><br></span></code></pre></div></div></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"mermaid\">Mermaid<a href=\"https://coinsgpt.github.io/blog/releases/3.6#mermaid\" class=\"hash-link\" aria-label=\"Direct link to Mermaid\" title=\"Direct link to Mermaid\">​</a></h2>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10510\" target=\"_blank\" rel=\"noopener noreferrer\">#10510</a>, we relaxed our <a href=\"https://mermaid.js.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Mermaid diagrams</a> dependency range to allow newer major versions of Mermaid. We now support both Mermaid 10/11, and expect upcoming versions to be compatible, letting you upgrade on your own terms.</p>\n<p>This unlocks new types of diagrams, such as <a href=\"https://mermaid.js.org/syntax/architecture\" target=\"_blank\" rel=\"noopener noreferrer\">Architecture Diagrams</a>:</p>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"translations\">Translations<a href=\"https://coinsgpt.github.io/blog/releases/3.6#translations\" class=\"hash-link\" aria-label=\"Direct link to Translations\" title=\"Direct link to Translations\">​</a></h2>\n<ul>\n<li>🇸🇮 <a href=\"https://github.com/facebook/docusaurus/pull/10551\" target=\"_blank\" rel=\"noopener noreferrer\">#10551</a>: Improve Slovenian theme translations.</li>\n<li>🇻🇳 <a href=\"https://github.com/facebook/docusaurus/pull/10507\" target=\"_blank\" rel=\"noopener noreferrer\">#10507</a>: Improve Vietnamese theme translations.</li>\n<li>🇪🇸 <a href=\"https://github.com/facebook/docusaurus/pull/10413\" target=\"_blank\" rel=\"noopener noreferrer\">#10413</a>: Improve Spanish theme translations.</li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/3.6#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Other notable changes include:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10586\" target=\"_blank\" rel=\"noopener noreferrer\">#10586</a>: Blog support for <code>frontMatter.title_meta</code> to override <code>frontMatter.title</code> for SEO reason.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10600\" target=\"_blank\" rel=\"noopener noreferrer\">#10600</a>: <code>docusaurus build</code> and <code>docusaurus deploy</code> now support multiple <code>--locale</code> CLI args.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10454\" target=\"_blank\" rel=\"noopener noreferrer\">#10454</a>: <code>docusaurus-remark-plugin-npm2yarn</code> upgrades to <a href=\"https://github.com/nebrelbug/npm-to-yarn/releases/tag/v3.0.0\" target=\"_blank\" rel=\"noopener noreferrer\"><code>npm-to-yarn</code> v3</a> and can convert <code>npx</code> commands.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10612\" target=\"_blank\" rel=\"noopener noreferrer\">#10612</a>: Canary releases will use <code>3.5.2-canary-&lt;number&gt;</code> instead of <code>0.0.0-canary-&lt;number&gt;</code> to respect plugins <code>peerDependency</code> constraints.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10547\" target=\"_blank\" rel=\"noopener noreferrer\">#10547</a>: <code>@docusaurus/tsconfig</code> upgrades to <code>target: 'es2022'</code>.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10514\" target=\"_blank\" rel=\"noopener noreferrer\">#10514</a>: Remove <code>babel.config.js</code> from Docusaurus init templates to discourage customizing Babel.</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/3.6.0\">3.6.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/3.6",
            "title": "Docusaurus 3.6",
            "summary": "We are happy to announce Docusaurus 3.6.",
            "date_modified": "2024-11-04T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/3.5",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 3.5</strong>.</p>\n<p>This release contains many <strong>new exciting blog features</strong>.</p>\n<p>Upgrading should be easy. Our <a href=\"https://coinsgpt.github.io/community/release-process\">release process</a> respects <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus blog post social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-7b2ed059f27fc8b64f3f20025ebb382f.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/3.5#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"blog-social-icons\">Blog Social Icons<a href=\"https://coinsgpt.github.io/blog/releases/3.5#blog-social-icons\" class=\"hash-link\" aria-label=\"Direct link to Blog Social Icons\" title=\"Direct link to Blog Social Icons\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10222\" target=\"_blank\" rel=\"noopener noreferrer\">#10222</a>, we added the possibility to associate social links to blog authors, for inline authors declared in front matter or global through the <code>authors.yml</code> file.</p>\n<div class=\"language-yml codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">blog/authors.yml</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-yml codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token key atrule\" style=\"color:#22863A\">slorber</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Sébastien Lorber</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\"># other author properties...</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">socials</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> sebastienlorber</span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">linkedin</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> sebastienlorber</span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">github</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> slorber</span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">newsletter</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> https</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\">//thisweekinreact.com</span><br></span></code></pre></div></div>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Author socials screenshot displaying slorber author with 4 social platform icons\" src=\"https://coinsgpt.github.io/assets/images/author-socials-93483e664b2d095b137cf10c4769c100.png\" width=\"780\" height=\"180\" class=\"img_vXGZ\"></p>\n<p>Icons and handle shortcuts are provided for pre-defined platforms <code>x</code>, <code>linkedin</code>, <code>github</code> and <code>stackoverflow</code>. It's possible to provide any additional platform entry (like <code>newsletter</code> in the example above) with a full URL.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"blog-authors-pages\">Blog Authors Pages<a href=\"https://coinsgpt.github.io/blog/releases/3.5#blog-authors-pages\" class=\"hash-link\" aria-label=\"Direct link to Blog Authors Pages\" title=\"Direct link to Blog Authors Pages\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10216\" target=\"_blank\" rel=\"noopener noreferrer\">#10216</a>, we added the possibility for <a href=\"https://coinsgpt.github.io/docs/blog#global-authors\">global blog authors</a> (declared in <code>authors.yml</code>) to have their own dedicated page listing all the blog posts they contributed to.</p>\n<p>This feature is opt-in and mostly relevant for <strong>multi-author blogs</strong>. You can turn it on for a specific author by setting the <code>page: true</code> property:</p>\n<div class=\"language-yml codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">blog/authors.yml</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-yml codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token key atrule\" style=\"color:#22863A\">slorber</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Sébastien Lorber</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\"># the description will be displayed on the author's page</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">description</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'A freelance React and React-Native developer...'</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">page</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token boolean important\" style=\"color:#005CC5\">true</span><span class=\"token plain\"> </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\"># Turns the feature on</span><br></span></code></pre></div></div>\n<p>This creates a <a href=\"https://coinsgpt.github.io/blog/authors/slorber\">dedicated author page</a> at <code>/blog/authors/slorber</code>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Author page screenshot for slorber global author\" src=\"https://coinsgpt.github.io/assets/images/author-page-4a9753641b116ddfeecc46ed1dcee907.png\" width=\"883\" height=\"900\" class=\"img_vXGZ\"></p>\n<p>An <a href=\"https://coinsgpt.github.io/blog/authors\">authors index page</a> is also created, listing all the blog authors.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Author index page listing multiple authors\" src=\"https://coinsgpt.github.io/assets/images/author-index-4abd3b8b777b2c1b3958768559896262.png\" width=\"705\" height=\"645\" class=\"img_vXGZ\"></p>\n<p>Check the <a href=\"https://coinsgpt.github.io/docs/blog#authors-pages\">blog authors pages guide</a> for details.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"blog-feeds-styling\">Blog Feeds Styling<a href=\"https://coinsgpt.github.io/blog/releases/3.5#blog-feeds-styling\" class=\"hash-link\" aria-label=\"Direct link to Blog Feeds Styling\" title=\"Direct link to Blog Feeds Styling\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/9252\" target=\"_blank\" rel=\"noopener noreferrer\">#9252</a>, we added support for <a href=\"https://darekkay.com/blog/rss-styling/\" target=\"_blank\" rel=\"noopener noreferrer\">styling your blog feeds</a> by providing custom XSLT <code>.xls</code> files for the RSS and Atom feeds. This allows browsers to render the feeds in a more visually appealing way, like a regular HTML page, instead of the default XML view.</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">website/docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> blogOptions </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">feedOptions</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token literal-property property\" style=\"color:#005CC5\">xslt</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">rss</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'custom-rss.xsl'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">atom</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'custom-atom.xsl'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<p>Writing your own XSLT can be complex, but you can also use <code>xslt: true</code> to turn on the built-in style:</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">website/docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> blogOptions </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">feedOptions</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token literal-property property\" style=\"color:#005CC5\">xslt</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Screenshot of the Docusaurus blog RSS feed, beautifully styled\" src=\"https://coinsgpt.github.io/assets/images/blog-feed-xslt-22194c2a971aba7f3bbf6115d3aa1d49.png\" width=\"730\" height=\"782\" class=\"img_vXGZ\"></p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"blog-sidebar-grouping\">Blog Sidebar Grouping<a href=\"https://coinsgpt.github.io/blog/releases/3.5#blog-sidebar-grouping\" class=\"hash-link\" aria-label=\"Direct link to Blog Sidebar Grouping\" title=\"Direct link to Blog Sidebar Grouping\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10252\" target=\"_blank\" rel=\"noopener noreferrer\">#10252</a>, we added support for grouping blog posts by years in the blog sidebar.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Screenshot of the Docusaurus blog, in particular the sidebar items grouped by year\" src=\"https://coinsgpt.github.io/assets/images/blog-sidebar-years-1d0be02836d9a3307386c365b9969a37.png\" width=\"910\" height=\"452\" class=\"img_vXGZ\"></p>\n<p>This feature is now turned on by default, but can be disabled with <code>themeConfig.blog.sidebar.groupByYear: false</code>.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"blog-consistency-options\">Blog Consistency Options<a href=\"https://coinsgpt.github.io/blog/releases/3.5#blog-consistency-options\" class=\"hash-link\" aria-label=\"Direct link to Blog Consistency Options\" title=\"Direct link to Blog Consistency Options\">​</a></h3>\n<p>We added new blog options to enforce recommended practices for your blog posts:</p>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"oninlineauthors\"><code>onInlineAuthors</code><a href=\"https://coinsgpt.github.io/blog/releases/3.5#oninlineauthors\" class=\"hash-link\" aria-label=\"Direct link to oninlineauthors\" title=\"Direct link to oninlineauthors\">​</a></h4>\n<p>We believe large multi-blogs are easier to manage by using <a href=\"https://coinsgpt.github.io/docs/blog#global-authors\">global authors</a>, declared in <code>authors.yml</code>. This notably permits to avoids duplicating author information across multiple blog posts, and now permits to generate <a href=\"https://coinsgpt.github.io/docs/blog#authors-pages\">author pages</a>.</p>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10224\" target=\"_blank\" rel=\"noopener noreferrer\">#10224</a>, we added the <code>onInlineAuthors</code> option. Use <code>onInlineAuthors: 'throw'</code> to forbid <a href=\"https://coinsgpt.github.io/docs/blog#inline-authors\">inline authors</a>, and enforce a consistent usage of <a href=\"https://coinsgpt.github.io/docs/blog#global-authors\">global authors</a>.</p>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"onuntruncatedblogposts\"><code>onUntruncatedBlogPosts</code><a href=\"https://coinsgpt.github.io/blog/releases/3.5#onuntruncatedblogposts\" class=\"hash-link\" aria-label=\"Direct link to onuntruncatedblogposts\" title=\"Direct link to onuntruncatedblogposts\">​</a></h4>\n<p>We believe blog posts are better using <a href=\"https://coinsgpt.github.io/docs/blog#blog-list\">truncation markers</a> (<code>&lt;!-- truncate --&gt;</code> or <code>{/* truncate */}</code>). On paginated lists (blog home, tags pages, authors pages), this permits to render a more concise preview of the blog post instead of a full blog post.</p>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10375\" target=\"_blank\" rel=\"noopener noreferrer\">#10375</a>, we added the <code>onUntruncatedBlogPosts</code> option. Use <code>onUntruncatedBlogPosts: 'throw'</code> to enforce a consistent usage of <a href=\"https://coinsgpt.github.io/docs/blog#blog-list\">truncation markers</a>.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"translations\">Translations<a href=\"https://coinsgpt.github.io/blog/releases/3.5#translations\" class=\"hash-link\" aria-label=\"Direct link to Translations\" title=\"Direct link to Translations\">​</a></h2>\n<ul>\n<li>🇪🇪 <a href=\"https://github.com/facebook/docusaurus/pull/10339\" target=\"_blank\" rel=\"noopener noreferrer\">#10339</a>: Add Estonian theme translations.</li>\n<li>🇮🇩 <a href=\"https://github.com/facebook/docusaurus/pull/10325\" target=\"_blank\" rel=\"noopener noreferrer\">#10325</a>: Add Indonesian theme translations.</li>\n<li>🇪🇸 <a href=\"https://github.com/facebook/docusaurus/pull/10360\" target=\"_blank\" rel=\"noopener noreferrer\">#10360</a>: Improve Spanish theme translations.</li>\n<li>🇩🇪 <a href=\"https://github.com/facebook/docusaurus/pull/10235\" target=\"_blank\" rel=\"noopener noreferrer\">#10235</a>: Improve German theme translations.</li>\n<li>🇨🇳 <a href=\"https://github.com/facebook/docusaurus/pull/10257\" target=\"_blank\" rel=\"noopener noreferrer\">#10257</a>: Improve Traditional Chinese (zh-Hant) theme translations.</li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/3.5#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Other notable changes include:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10369\" target=\"_blank\" rel=\"noopener noreferrer\">#10369</a>: Add support for <a href=\"https://pkg.pr.new/\" target=\"_blank\" rel=\"noopener noreferrer\">pkg.pr.new</a> continuous releases so that you can test any pull-request code in a StackBlitz playground.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10376\" target=\"_blank\" rel=\"noopener noreferrer\">#10376</a>: Theme unlisted/draft banners are also shown in dev so that you don't forget to publish your content.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10335\" target=\"_blank\" rel=\"noopener noreferrer\">#10335</a>: The Markdown top-level headings <code># title</code> are automatically wrapped in <code>&lt;header&gt;</code> for consistency with front matter <code>title: Title</code>.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10286\" target=\"_blank\" rel=\"noopener noreferrer\">#10286</a>: Allows Docusaurus plugins to self-disable by returning <code>null</code>.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10241\" target=\"_blank\" rel=\"noopener noreferrer\">#10241</a>: Add support for <a href=\"https://mdxjs.com/packages/mdx/#processoroptions\" target=\"_blank\" rel=\"noopener noreferrer\">MDX processor <code>recmaPlugins</code> option</a> to modify the MDX Estree AST.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10324\" target=\"_blank\" rel=\"noopener noreferrer\">#10324</a>: The docs autogenerated <code>_category_.json</code> accepts a new <code>description</code> property that gets displayed on generated index pages.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10368\" target=\"_blank\" rel=\"noopener noreferrer\">#10368</a>: The CLI command <code>docusaurus --version</code> now actually returns the Docusaurus version.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10240\" target=\"_blank\" rel=\"noopener noreferrer\">#10240</a>: Markdown <code>mdx-code-block</code> now supports indentation.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10219\" target=\"_blank\" rel=\"noopener noreferrer\">#10219</a>: Fix <code>&lt;TabItem lazy&gt;</code> support the for <code>className</code> prop.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10313\" target=\"_blank\" rel=\"noopener noreferrer\">#10313</a>: Blog-related <code>@docusaurus/theme-common/internal</code> APIs have been moved to <code>@docusaurus/plugin-content-blog/client</code>.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10316\" target=\"_blank\" rel=\"noopener noreferrer\">#10316</a>: Docs-related <code>@docusaurus/theme-common/internal</code> APIs have been moved to <code>@docusaurus/plugin-content-docs/client</code>.</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/3.5.0\">3.5.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/3.5",
            "title": "Docusaurus 3.5",
            "summary": "We are happy to announce Docusaurus 3.5.",
            "date_modified": "2024-08-09T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/3.4",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 3.4</strong>.</p>\n<p>Upgrading should be easy. Our <a href=\"https://coinsgpt.github.io/community/release-process\">release process</a> respects <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus blog post social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-66116702bb73f0bf68a095ddaecc0fe4.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/3.4#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"tags-files\">Tags files<a href=\"https://coinsgpt.github.io/blog/releases/3.4#tags-files\" class=\"hash-link\" aria-label=\"Direct link to Tags files\" title=\"Direct link to Tags files\">​</a></h3>\n<p>The docs and blog plugins both already supported a <code>tags</code> front matter attribute, enabling you to group related content. But tags declared inline in the front matter are not always ideal.</p>\n<p>With <a href=\"https://github.com/facebook/docusaurus/pull/10137\" target=\"_blank\" rel=\"noopener noreferrer\">#10137</a>, you can now declare a list of pre-defined tags in a <code>tags.yml</code> file:</p>\n<div class=\"language-yml codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">blog/tags.yml</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-yml codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token key atrule\" style=\"color:#22863A\">tag1</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">label</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'Tag 1'</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">description</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'Tag 1 description'</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">permalink</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> /tag</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">1</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">permalink</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#22863A\">tag2</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">label</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'Tag 2'</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">description</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'Tag 2 description'</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">permalink</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> /tag</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">2</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">permalink</span><br></span></code></pre></div></div>\n<p>These predefined tags can be used in the front matter of your blog or docs files:</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">blog/2024-05-31-my-blog-post.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token front-matter-block punctuation\" style=\"color:#393A34\">---</span><span class=\"token front-matter-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token front-matter-block\"></span><span class=\"token front-matter-block front-matter yaml language-yaml key atrule\" style=\"color:#22863A\">tags</span><span class=\"token front-matter-block front-matter yaml language-yaml punctuation\" style=\"color:#393A34\">:</span><span class=\"token front-matter-block front-matter yaml language-yaml\"> </span><span class=\"token front-matter-block front-matter yaml language-yaml punctuation\" style=\"color:#393A34\">[</span><span class=\"token front-matter-block front-matter yaml language-yaml\">tag1</span><span class=\"token front-matter-block front-matter yaml language-yaml punctuation\" style=\"color:#393A34\">,</span><span class=\"token front-matter-block front-matter yaml language-yaml\"> tag2</span><span class=\"token front-matter-block front-matter yaml language-yaml punctuation\" style=\"color:#393A34\">]</span><span class=\"token front-matter-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token front-matter-block\"></span><span class=\"token front-matter-block punctuation\" style=\"color:#393A34\">---</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token title important punctuation\" style=\"color:#393A34;font-weight:bold\">#</span><span class=\"token title important\" style=\"color:#0550AE;font-weight:bold\"> Title</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">Content</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Keeping tags usage consistent</div><div class=\"admonitionContent_Knsx\"><p>Use the new <code>onInlineTags: 'throw'</code> plugin option to enforce the usage of predefined tags and prevent contributors from creating new unwanted tags.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"hash-router---experimental\">Hash Router - Experimental<a href=\"https://coinsgpt.github.io/blog/releases/3.4#hash-router---experimental\" class=\"hash-link\" aria-label=\"Direct link to Hash Router - Experimental\" title=\"Direct link to Hash Router - Experimental\">​</a></h3>\n<p>With <a href=\"https://github.com/facebook/docusaurus/pull/9859\" target=\"_blank\" rel=\"noopener noreferrer\">9859</a>, we added a new <strong>experimental</strong> hash router config option, useful for <strong>offline browsing</strong> by opening your site locally through the <code>file://</code> protocol.</p>\n<div class=\"language-tsx codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-tsx codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  future</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    experimental_router</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'hash'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>warning</div><div class=\"admonitionContent_Knsx\"><p>This mode is <strong>not recommended for sites deployed through a web server</strong>.</p></div></div>\n<p>When this mode is turned on, Docusaurus will opt out of static site rendering, and build a client-side single page application where all routes are prefixed with <code>/#/</code>. A single <code>index.html</code> file is generated. This file can be opened locally in your browser by simply clicking it, using the browser <code>file://</code> protocol. This makes it possible to distribute a Docusaurus site as a <code>.zip</code> file so that readers can browse it offline, without having to install anything complex on their computer apart a web browser.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus hash router - local browsing using the file:// protocol\" src=\"https://coinsgpt.github.io/assets/images/hash-96c9ef1044dc1febfe3eefdc9350e2a0.png\" width=\"1203\" height=\"601\" class=\"img_vXGZ\"></p>\n<p>Try browsing our own Docusaurus site built with the hash router:</p>\n<ul>\n<li><a href=\"https://facebook.github.io/docusaurus/#/\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus website - Hash Router web deployment</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/actions/workflows/build-hash-router.yml\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus website - Hash Router downloadable GitHub artifacts</a></li>\n</ul>\n<div class=\"theme-admonition theme-admonition-caution admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>Experimental</div><div class=\"admonitionContent_Knsx\"><p>This feature is <strong>experimental</strong>. If you try it out, please let us know how it works for you <a href=\"https://github.com/facebook/docusaurus/issues/3825\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"site-storage---experimental\">Site Storage - Experimental<a href=\"https://coinsgpt.github.io/blog/releases/3.4#site-storage---experimental\" class=\"hash-link\" aria-label=\"Direct link to Site Storage - Experimental\" title=\"Direct link to Site Storage - Experimental\">​</a></h3>\n<p>Docusaurus uses the browser <code>localStorage</code> API to persist UI state.</p>\n<p>But sometimes the storage space is \"shared\" between multiple sites using the same domain, leading to <strong>storage key conflicts</strong>. This generally happens in two cases</p>\n<ul>\n<li>when working on multiple <code>http://localhost:3000</code> sites</li>\n<li>when hosting multiple sites under the same domain: <code>https://example.com/site1/</code> and <code>https://example.com/site2/</code></li>\n</ul>\n<p>For this reason, we introduced a new <strong>experimental</strong> <code>siteStorage</code> configuration option:</p>\n<div class=\"language-tsx codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-tsx codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  future</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    experimental_storage</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      type</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'localStorage'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      namespace</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<p>When <code>namespace: true</code> is set, we apply a hash suffix to all the storage keys, making them unique to the current site (based on <code>config.url</code> and <code>config.baseUrl</code>. For example, the <code>theme</code> storage key becomes <code>theme-x6f</code>. It is also possible to provide your own custom suffix <code>namespace: 'suffix'</code>. We also made it possible to use <code>type: 'sessionStorage'</code> instead of the default <code>localStorage</code>.</p>\n<div class=\"theme-admonition theme-admonition-caution admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>Experimental</div><div class=\"admonitionContent_Knsx\"><p>This feature is <strong>experimental</strong>. If you try it out, please let us know how it works for you <a href=\"https://github.com/facebook/docusaurus/pull/10121\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/3.4#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Other notable changes include:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10151\" target=\"_blank\" rel=\"noopener noreferrer\">#10151</a>: add Turkmen (tk) theme translations</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10111\" target=\"_blank\" rel=\"noopener noreferrer\">#10111</a>: add Bulgarian (bg) theme translations</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10168\" target=\"_blank\" rel=\"noopener noreferrer\">#10168</a>: fix many long overdue Markdown link resolution bugs</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10178\" target=\"_blank\" rel=\"noopener noreferrer\">#10178</a>: the <code>/search</code> page now respects the <code>contextualSearch: false</code> setting</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10118\" target=\"_blank\" rel=\"noopener noreferrer\">#10118</a>: fix bad pluralization on docs generated index category card description</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10130\" target=\"_blank\" rel=\"noopener noreferrer\">#10130</a>: fix false positives reported by the broken anchor checker due to trailing slashes</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/3.4.0\">3.4.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/3.4",
            "title": "Docusaurus 3.4",
            "summary": "We are happy to announce Docusaurus 3.4.",
            "date_modified": "2024-05-31T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/3.3",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 3.3</strong>.</p>\n<p>Upgrading should be easy. Our <a href=\"https://coinsgpt.github.io/community/release-process\">release process</a> respects <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus blog post social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-105335e6b4ebb3f62aa9b04e33a76dea.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/3.3#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"prepare-for-react-19\">Prepare for React 19<a href=\"https://coinsgpt.github.io/blog/releases/3.3#prepare-for-react-19\" class=\"hash-link\" aria-label=\"Direct link to Prepare for React 19\" title=\"Direct link to Prepare for React 19\">​</a></h3>\n<p>The React core team recently <a href=\"https://react.dev/blog/2024/04/25/react-19\" target=\"_blank\" rel=\"noopener noreferrer\">released the first <strong>React 19 beta</strong></a>. They also <a href=\"https://react.dev/blog/2024/04/25/react-19-upgrade-guide\" target=\"_blank\" rel=\"noopener noreferrer\">published an upgrade guide and a <strong>React v18.3 release</strong></a> with new warnings to help us identify issues <strong>before upgrading to React 19</strong>.</p>\n<p>Docusaurus v3 depends on React <code>18.x</code>. When initializing a new Docusaurus sites, it will use that new React <code>18.3</code> release. It's also the case if you decide to upgrade your dependencies, or re-generate your package manager lockfile.</p>\n<p>It turns out in its current state, <strong>Docusaurus had a few of those extra warnings to fix</strong>, notably this one immediately appearing on your dev console on any page load and navigation:</p>\n<blockquote>\n<p>Warning: LoadableComponent uses the legacy contextTypes API which is no longer supported and will be removed in the next major release. Use React.createContext() with static contextType instead.</p>\n</blockquote>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10079\" target=\"_blank\" rel=\"noopener noreferrer\">#10079</a>, we got Docusaurus ready for React 19. We fixed all the React 18.3 warnings we encountered. In case we missed any, don't hesitate to <a href=\"https://github.com/facebook/docusaurus/issues/10099\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>report new warnings</strong></a> if you see them, to us but also to other Docusaurus third-party plugin authors.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"createsitemapitems\"><code>createSitemapItems</code><a href=\"https://coinsgpt.github.io/blog/releases/3.3#createsitemapitems\" class=\"hash-link\" aria-label=\"Direct link to createsitemapitems\" title=\"Direct link to createsitemapitems\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10083\" target=\"_blank\" rel=\"noopener noreferrer\">#10083</a>, we introduced a new flexible <code>createSitemapItems()</code> hook to the sitemap plugin. This enables users to create/filter/transform/enhance the sitemap items with their own custom logic.</p>\n<div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  presets</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/preset-classic'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        sitemap</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token function-variable function\" style=\"color:#8250DF\">createSitemapItems</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            defaultCreateSitemapItems</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token operator\" style=\"color:#D73A49\">...</span><span class=\"token plain\">params</span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> items </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">defaultCreateSitemapItems</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">params</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> items</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">filter</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">item</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">!</span><span class=\"token plain\">item</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token plain\">url</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">includes</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token string\" style=\"color:#C6105F\">'/tags/'</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"pages-plugin-improvements\">Pages plugin improvements<a href=\"https://coinsgpt.github.io/blog/releases/3.3#pages-plugin-improvements\" class=\"hash-link\" aria-label=\"Direct link to Pages plugin improvements\" title=\"Direct link to Pages plugin improvements\">​</a></h3>\n<p>The Docusaurus <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-content-pages\">pages plugin</a> has historically been lagging behind the docs and blog plugins in terms of available feature.</p>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/10032\" target=\"_blank\" rel=\"noopener noreferrer\">#10032</a> we normalized the options available on each core content plugins by adding a few the missing page plugins APIs related to the edit url and the last update metadata displayed at the bottom on Markdown pages.</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword module\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">presets</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/preset-classic'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token literal-property property\" style=\"color:#005CC5\">pages</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token literal-property property\" style=\"color:#005CC5\">editUrl</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token string\" style=\"color:#C6105F\">'https://github.com/facebook/docusaurus/tree/main/website/src/pages'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token literal-property property\" style=\"color:#005CC5\">editLocalizedFiles</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token literal-property property\" style=\"color:#005CC5\">showLastUpdateAuthor</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token literal-property property\" style=\"color:#005CC5\">showLastUpdateTime</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<div style=\"padding:10px\"><div class=\"browserWindow_my1Q\" style=\"min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden\"><div class=\"browserWindowHeader_jXSR\"><div class=\"buttons_uHc7\"><span class=\"dot_giz1\" style=\"background:#f25f58\"></span><span class=\"dot_giz1\" style=\"background:#fbbe3c\"></span><span class=\"dot_giz1\" style=\"background:#58cb42\"></span></div><div class=\"browserWindowAddressBar_Pd8y text--truncate\">/examples/markdownPageExample</div><div class=\"browserWindowMenuIcon_Vhuh\"><div><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span></div></div></div><div class=\"browserWindowBody_Idgs\" style=\"padding:0\"><iframe src=\"/examples/markdownPageExample\" title=\"/examples/markdownPageExample\" style=\"display:block;width:100%;height:300px\"></iframe></div></div></div>\n<div class=\"theme-admonition theme-admonition-note admonition_o5H7 alert alert--secondary\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z\"></path></svg></span>Only for Markdown pages</div><div class=\"admonitionContent_Knsx\"><p>These new plugin options only apply to Markdown pages, and have no effect on React pages for which you have full control over the layout with JSX.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/3.3#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Other notable changes include:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10064\" target=\"_blank\" rel=\"noopener noreferrer\">#10064</a>: new site config option <code>siteConfig.markdown.anchors.maintainCase</code></li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9767\" target=\"_blank\" rel=\"noopener noreferrer\">#9767</a>: new <code>docusaurus deploy --target-dir</code> option</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10042\" target=\"_blank\" rel=\"noopener noreferrer\">#10042</a>: new (experimental) plugin API: <code>route.props</code></li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10060\" target=\"_blank\" rel=\"noopener noreferrer\">#10060</a>: optimizes the App entrypoint, avoid useless re-renders on navigations</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10080\" target=\"_blank\" rel=\"noopener noreferrer\">#10080</a>: <code>&lt;Admonition&gt;</code> component can render properly without heading/icon</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10091\" target=\"_blank\" rel=\"noopener noreferrer\">#10091</a>: <code>&lt;Tabs&gt;</code> props can now override defaults</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10090\" target=\"_blank\" rel=\"noopener noreferrer\">#10090</a>: <code>docusaurus serve</code> works better with a <code>/baseUrl/</code> pathname prefix</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10070\" target=\"_blank\" rel=\"noopener noreferrer\">#10070</a>: add missing theme translations for <code>pt-BR</code></li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/10025\" target=\"_blank\" rel=\"noopener noreferrer\">#10025</a>: doc sidebar item label now impacts the doc pagination label</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/3.3.0\">3.3.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/3.3",
            "title": "Docusaurus 3.3",
            "summary": "We are happy to announce Docusaurus 3.3.",
            "date_modified": "2024-05-03T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/3.2",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 3.2</strong>.</p>\n<p>The upgrade should be easy: as explained in our <a href=\"https://coinsgpt.github.io/community/release-process\">release process documentation</a>, minor versions respect <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus blog post social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-8ca15c1adaeb77ca302178575136a0b6.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/3.2#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"faster-builds\">Faster builds<a href=\"https://coinsgpt.github.io/blog/releases/3.2#faster-builds\" class=\"hash-link\" aria-label=\"Direct link to Faster builds\" title=\"Direct link to Faster builds\">​</a></h3>\n<p>We worked hard to reduce the time it takes to build a Docusaurus site in production mode.</p>\n<p>Between v3.1.0 and v3.2.0, several changes have been made, leading to significantly faster production builds for many sites.</p>\n<p>Let's take an example. Our benchmark on the <a href=\"https://github.com/facebook/react-native-website/pull/4072\" target=\"_blank\" rel=\"noopener noreferrer\">React Native website upgrading to v3.2</a> reports the following results:</p>\n<ul>\n<li>🔥 Cold builds: 95s ➡️ 66s (~30% faster)</li>\n<li>🔥 Incremental builds: 55s ➡️ 22s (~60% faster)</li>\n</ul>\n<p>The results will vary depending on your site's topology and the options you turned on, but we expect the largest sites will see the most significant improvements.</p>\n<p>Note that this is only the beginning, and Docusaurus performance can still be significantly improved, notably the bundling time and the memory consumption. Track our <a href=\"https://github.com/facebook/docusaurus/issues/4765\" target=\"_blank\" rel=\"noopener noreferrer\">performance issue</a> for upcoming improvements.</p>\n<details class=\"details_Nokh alert alert--info details_Cn_P\" data-collapsed=\"true\"><summary>What is the difference between a cold build and an incremental build?</summary><div><div class=\"collapsibleContent_EoA1\"><p>A cold build is when the Docusaurus caches are empty, generally after running <code>docusaurus clear</code>.</p><p>An incremental build happens when you run another time the <code>docusaurus build</code> command. Docusaurus automatically tries to \"re-use\" computations from former builds to make subsequent builds faster. In practice it's based on <a href=\"https://webpack.js.org/guides/build-performance/#persistent-cache\" target=\"_blank\" rel=\"noopener noreferrer\">Webpack persistent caching</a>. To enable incremental builds on your CI server, you can persist the <code>node_modules/.cache</code> folder across builds.</p></div></div></details>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"faster-dev-server\">Faster Dev Server<a href=\"https://coinsgpt.github.io/blog/releases/3.2#faster-dev-server\" class=\"hash-link\" aria-label=\"Direct link to Faster Dev Server\" title=\"Direct link to Faster Dev Server\">​</a></h3>\n<p>We also worked on improving the performance of the dev server, so that you can get a faster feedback when editing Markdown/MDX files.</p>\n<p>The way we initially implemented content reloading wasn't great. For example, editing a blog post file would also trigger a useless reload of the unrelated docs plugin. From now on, when editing a plugin's content, only that plugin will reload. It's hard to measure precisely the impact of this change, but I estimate edits should appear in your browser at least 50% faster 🔥.</p>\n<p>We plan to keep improving the speed of our dev server, with even more granular hot reloads, ensuring we don't run useless computations that would always keep giving the same result.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"mdx-partials-table-of-contents\">MDX partials table-of-contents<a href=\"https://coinsgpt.github.io/blog/releases/3.2#mdx-partials-table-of-contents\" class=\"hash-link\" aria-label=\"Direct link to MDX partials table-of-contents\" title=\"Direct link to MDX partials table-of-contents\">​</a></h3>\n<p>With <a href=\"https://github.com/facebook/docusaurus/pull/9684\" target=\"_blank\" rel=\"noopener noreferrer\">#9684</a>, Docusaurus is now able to render headings coming from an imported partial into the table-of-contents.</p>\n<p>Docusaurus and MDX allows you to <a href=\"https://coinsgpt.github.io/docs/markdown-features/react#importing-markdown\">import one Markdown file into another</a>. We usually call the imported Markdown file a \"partial\", and use the <code>_</code> prefix so that this file does not lead to the creation of a new page.</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">myDoc.mdx</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token title important punctuation\" style=\"color:#393A34;font-weight:bold\">#</span><span class=\"token title important\" style=\"color:#0550AE;font-weight:bold\"> My Doc</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token title important punctuation\" style=\"color:#393A34;font-weight:bold\">##</span><span class=\"token title important\" style=\"color:#0550AE;font-weight:bold\"> Doc heading</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">Content is imported from another MDX file:</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">import ImportedDoc from './\\_importedDoc.mdx';</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">ImportedDoc</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag punctuation\" style=\"color:#393A34\">/&gt;</span><br></span></code></pre></div></div>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">_myPartial.mdx</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token title important punctuation\" style=\"color:#393A34;font-weight:bold\">##</span><span class=\"token title important\" style=\"color:#0550AE;font-weight:bold\"> Partial heading</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">Some paragraph</span><br></span></code></pre></div></div>\n<p>Previously, the heading <code>Partial heading</code> did not appear in the table-of-contents, but now it will!</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"blog-improvements\">Blog improvements<a href=\"https://coinsgpt.github.io/blog/releases/3.2#blog-improvements\" class=\"hash-link\" aria-label=\"Direct link to Blog improvements\" title=\"Direct link to Blog improvements\">​</a></h3>\n<p>We improved the blog plugin with several new options to make it even more powerful and flexible:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9912\" target=\"_blank\" rel=\"noopener noreferrer\">#9912</a>: you can now display the last update time and author of a blog post, a feature the docs plugin already had.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9886\" target=\"_blank\" rel=\"noopener noreferrer\">#9886</a>: a new <code>processBlogPosts</code> option allow you to filter/transform/sort blog posts.</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9838\" target=\"_blank\" rel=\"noopener noreferrer\">#9838</a>: a new <code>pageBasePath</code> option allows you to customize the blog pagination URL segment (<code>/blog/page/2</code>)</li>\n</ul>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"sitemap-lastmod\">Sitemap lastmod<a href=\"https://coinsgpt.github.io/blog/releases/3.2#sitemap-lastmod\" class=\"hash-link\" aria-label=\"Direct link to Sitemap lastmod\" title=\"Direct link to Sitemap lastmod\">​</a></h3>\n<p>With <a href=\"https://github.com/facebook/docusaurus/pull/9954\" target=\"_blank\" rel=\"noopener noreferrer\">#9954</a>, the sitemap plugin has a new <code>lastmod</code> option that can now emit a <code>&lt;lastmod&gt;</code> tag on the XML. The value is read from the Git history by default, but can be overridden with docs and blog <code>last_update</code> front matter.</p>\n<p>We also made it possible to opt-out of emitting <code>&lt;priority&gt;</code> and <code>&lt;frequency&gt;</code> tags, which are generally ignored by crawlers (notably <a href=\"https://developers.google.com/search/blog/2023/06/sitemaps-lastmod-ping\" target=\"_blank\" rel=\"noopener noreferrer\">Google</a>).</p>\n<p>We recommend using the following sitemap plugin config, that will become the default in Docusaurus V4:</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">lastmod</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'date'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">priority</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"color:#CF222E\">null</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">changefreq</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"color:#CF222E\">null</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/3.2#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9687\" target=\"_blank\" rel=\"noopener noreferrer\">#9687</a>: new Vercel Analytics plugin</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9681\" target=\"_blank\" rel=\"noopener noreferrer\">#9681</a> and <a href=\"https://github.com/facebook/docusaurus/pull/9442\" target=\"_blank\" rel=\"noopener noreferrer\">#9442</a>: <code>docusaurus swizzle</code> and <code>create-docusaurus</code> CLIs now ask users if they prefer to use TypeScript</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9928\" target=\"_blank\" rel=\"noopener noreferrer\">#9928</a>: new Icelandic translation</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9931\" target=\"_blank\" rel=\"noopener noreferrer\">#9928</a>: new <code>allContentLoaded</code> plugin lifecycle (experimental)</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/3.2.0\">3.2.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/3.2",
            "title": "Docusaurus 3.2",
            "summary": "We are happy to announce Docusaurus 3.2.",
            "date_modified": "2024-03-29T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/3.1",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 3.1</strong>.</p>\n<p>The upgrade should be easy: as explained in our <a href=\"https://coinsgpt.github.io/community/release-process\">release process documentation</a>, minor versions respect <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus blog post social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-e1b6e0c51be29d4ab2d4c966d220410c.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/3.1#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"broken-anchors-checker\">Broken anchors checker<a href=\"https://coinsgpt.github.io/blog/releases/3.1#broken-anchors-checker\" class=\"hash-link\" aria-label=\"Direct link to Broken anchors checker\" title=\"Direct link to Broken anchors checker\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/9528\" target=\"_blank\" rel=\"noopener noreferrer\">#9528</a>, we improved the built-in broken links checker to also detect broken anchors.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus blog post social card\" src=\"https://coinsgpt.github.io/assets/images/broken-anchor-4191e5dd94aef9e8c5e3524880670f0f.jpg\" width=\"1920\" height=\"896\" class=\"img_vXGZ\"></p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Make it fail fast</div><div class=\"admonitionContent_Knsx\"><p>The new <a href=\"https://coinsgpt.github.io/docs/api/docusaurus-config#onBrokenAnchors\"><code>onBrokenAnchors</code></a> option has value <code>warn</code> by default, for retro-compatibility reasons.</p><p>We recommend to turn it to <code>throw</code> and fail your CI builds instead of deploying broken anchors to productions.</p></div></div>\n<div class=\"theme-admonition theme-admonition-note admonition_o5H7 alert alert--secondary\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z\"></path></svg></span>note</div><div class=\"admonitionContent_Knsx\"><p>For users and plugin authors implementing custom <code>&lt;Heading&gt;</code> and <code>&lt;Link&gt;</code> components, we provide a new <a href=\"https://coinsgpt.github.io/docs/docusaurus-core#useBrokenLinks\"><code>useBrokenLinks</code></a> React hook API.</p><p><strong>Most Docusaurus users don't need to care about it</strong>, built-in components (<code>docusaurus/Link</code> and <code>@theme/Heading</code>) already use it internally.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"parsefrontmatter-hook\"><code>parseFrontMatter</code> hook<a href=\"https://coinsgpt.github.io/blog/releases/3.1#parsefrontmatter-hook\" class=\"hash-link\" aria-label=\"Direct link to parsefrontmatter-hook\" title=\"Direct link to parsefrontmatter-hook\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/9624\" target=\"_blank\" rel=\"noopener noreferrer\">#9624</a>, we added a new <a href=\"https://coinsgpt.github.io/docs/api/docusaurus-config#markdown\"><code>siteConfig.markdown.parseFrontMatter</code> function hook</a>.</p>\n<p>This makes it possible to implement convenient front matter transformations, shortcuts, or to integrate with external systems using front matter that Docusaurus plugins do not support.</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword module\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">markdown</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token function-variable function\" style=\"color:#8250DF\">parseFrontMatter</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token parameter\" style=\"color:#953800\">params</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Reuse the default parser</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> result </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"color:#CF222E\">await</span><span class=\"token plain\"> params</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token method function property-access\" style=\"color:#8250DF\">defaultParseFrontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">params</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Process front matter description placeholders</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      result</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">frontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">description</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">        result</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">frontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">description</span><span class=\"token operator\" style=\"color:#D73A49\">?.</span><span class=\"token method function property-access\" style=\"color:#8250DF\">replaceAll</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token string\" style=\"color:#C6105F\">'{{MY_VAR}}'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'MY_VALUE'</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Create your own front matter shortcut</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"color:#CF222E\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">result</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">frontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">i_do_not_want_docs_pagination</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">        result</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">frontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">pagination_prev</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"color:#CF222E\">null</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">        result</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">frontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">pagination_next</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"color:#CF222E\">null</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Rename an unsupported front matter coming from another system</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"color:#CF222E\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">result</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">frontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">cms_seo_summary</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">        result</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">frontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">description</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">frontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">cms_seo_summary</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#CF222E\">delete</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">frontMatter</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">cms_seo_summary</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<p>Read the <a href=\"https://coinsgpt.github.io/docs/markdown-features#front-matter\">front matter guide</a> and the <a href=\"https://coinsgpt.github.io/docs/api/docusaurus-config#markdown\"><code>parseFrontMatter</code> API ref</a> for details.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/3.1#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Other notable changes include:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9674\" target=\"_blank\" rel=\"noopener noreferrer\">#9674</a>: add <code>siteConfig.markdown.remarkRehypeOptions</code> to pass options to <code>remark-rehype</code>, letting you customize things such as MDX footnote label</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9671\" target=\"_blank\" rel=\"noopener noreferrer\">#9671</a>: add code block MagicComments support for (Visual) Basic/Batch/Fortran/COBOL/ML</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9610\" target=\"_blank\" rel=\"noopener noreferrer\">#9610</a>: enable CLI port configuration via <code>PORT</code> environment variable</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9477\" target=\"_blank\" rel=\"noopener noreferrer\">#9477</a>: complete Brazilian Portuguese (pt-BR) translations</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/3.1.0\">3.1.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/3.1",
            "title": "Docusaurus 3.1",
            "summary": "We are happy to announce Docusaurus 3.1.",
            "date_modified": "2024-01-05T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/3.0",
            "content_html": "<p>Today, we are happy to <strong>announce Docusaurus 3.0</strong>! 🥳</p>\n<p>At <a href=\"https://opensource.fb.com/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Meta Open Source</strong></a>, we believe Docusaurus will help you build the <strong>best documentation websites</strong> with <strong>minimal effort</strong>, letting you <strong>focus on what really matters</strong>: writing the content.</p>\n<p>This is a new <strong>major version</strong> of Docusaurus, coming with <strong>new exciting features</strong> and upgraded dependencies.</p>\n<p>In line with the <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Semantic Versioning</strong></a> principles, this release includes <strong>breaking changes</strong> we documented thoroughly in the <a href=\"https://coinsgpt.github.io/docs/migration/v3\"><strong>v3 upgrade guide</strong></a>. Breaking changes can be bothersome, but they are necessary to set the ground for a <strong>new wave of Docusaurus features</strong> we plan to implement.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"v3.0 social-card image\" src=\"https://coinsgpt.github.io/assets/images/social-card-75819f68ecbb579fe176843bb2e3df82.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<p>We initially planned to release more frequent major versions, but Docusaurus v3 has taken longer than expected. Among the breaking changes that we accrued, <strong>upgrading to MDX v3</strong> is probably the main challenge to the adoption of this new version. We went the extra mile to make this upgrade as easy as possible, notably by adding <a href=\"https://coinsgpt.github.io/docs/api/docusaurus-config#markdown\">compatibility options for MDX v1</a>.</p>\n<p>The simplest sites will only need to upgrade a few npm dependencies. For more complex sites, we came up with a few strategies that can help you upgrade more confidently:</p>\n<ul>\n<li><a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3\">Prepare your site</a> ahead of time, incrementally, while staying on Docusaurus v2</li>\n<li><a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing\">Set up visual regression tests</a> to catch unexpected visual changes happening during the upgrade</li>\n</ul>\n<div class=\"theme-admonition theme-admonition-info admonition_o5H7 alert alert--info\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>About Docusaurus v2</div><div class=\"admonitionContent_Knsx\"><p>According to our <a href=\"https://coinsgpt.github.io/community/release-process#stable-version\">release process</a>, Docusaurus v2 has now entered <strong>maintenance mode</strong>. It will only receive support for major security issues for 3 months, until 31 January 2024. It is recommended to upgrade within that time frame to v3.</p></div></div>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"breaking-changes\">Breaking changes<a href=\"https://coinsgpt.github.io/blog/releases/3.0#breaking-changes\" class=\"hash-link\" aria-label=\"Direct link to Breaking changes\" title=\"Direct link to Breaking changes\">​</a></h2>\n<p>This section only gives you a quick glance. All the breaking changes are thoroughly documented in the <a href=\"https://coinsgpt.github.io/docs/migration/v3\"><strong>v3 upgrade guide</strong></a>.</p>\n<p>Docusaurus v3 upgraded a few dependencies to new major versions, each coming with its own breaking changes:</p>\n<ul>\n<li>Node.js v16 ➡️ v18</li>\n<li>React v17 ➡️ v18</li>\n<li>MDX v1 ➡️ v3</li>\n<li>TypeScript v4 ➡️ v5</li>\n<li>prism-react-renderer v1 ➡️ v2</li>\n<li>react-live v2 ➡️ v4</li>\n<li>Mermaid v9 ➡️ v10</li>\n<li>import-fresh v3 ➡️ jiti v1</li>\n<li>remark-emoji v2 ➡️ v4</li>\n</ul>\n<p>A typical <code>package.json</code> dependency upgrade looks like:</p>\n<div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">package.json</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">{</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  \"dependencies\": {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    // upgrade to Docusaurus v3</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@docusaurus/core\": \"2.4.3\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@docusaurus/preset-classic\": \"2.4.3\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@docusaurus/core\": \"3.0.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@docusaurus/preset-classic\": \"3.0.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    // upgrade to MDX v3</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@mdx-js/react\": \"^1.6.22\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@mdx-js/react\": \"^3.0.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    // upgrade to prism-react-renderer v2.0+</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"prism-react-renderer\": \"^1.3.5\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"prism-react-renderer\": \"^2.1.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    // upgrade to React v18.0+</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"react\": \"^17.0.2\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"react-dom\": \"^17.0.2\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"react\": \"^18.2.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"react-dom\": \"^18.2.0\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  },</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  \"devDependencies\": {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    // upgrade Docusaurus dev dependencies to v3</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@docusaurus/module-type-aliases\": \"2.4.3\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@docusaurus/types\": \"2.4.3\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@docusaurus/module-type-aliases\": \"3.0.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@docusaurus/types\": \"3.0.0\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  }</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  \"engines\": {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    // require Node.js 18.0+</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"node\": \"&gt;=16.14\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"node\": \"&gt;=18.0\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  }</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">}</span><br></span></code></pre></div></div>\n<p>Apart from MDX v3, most breaking changes coming with those upgraded dependencies have been handled internally for you: most of the time, you shouldn't have to do anything. Outside of dependencies, the only functional breaking changes coming explicitly from the Docusaurus codebase are:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9189\" target=\"_blank\" rel=\"noopener noreferrer\">#9189</a>: new default blog RSS feed limit of 20 entries</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9308\" target=\"_blank\" rel=\"noopener noreferrer\">#9308</a>: fix and re-introduce the <code>:::warning</code> admonition, deprecate <code>:::caution</code></li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9310\" target=\"_blank\" rel=\"noopener noreferrer\">#9310</a>: remove the legacy versioned sidebar id prefix, used for sites versioned before <code>v2.0.0-beta.10</code> (December 2021)</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/7966\" target=\"_blank\" rel=\"noopener noreferrer\">#7966</a>: refactor docs theme components, eventually requiring to you re-swizzle them</li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/3.0#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<p>Below is a non-exhaustive list of new useful features coming with this new version. All the features are listed in the <a href=\"https://github.com/facebook/docusaurus/releases/tag/v3.0.0\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Docusaurus v3.0.0 release notes</strong></a>.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"markdown\">Markdown<a href=\"https://coinsgpt.github.io/blog/releases/3.0#markdown\" class=\"hash-link\" aria-label=\"Direct link to Markdown\" title=\"Direct link to Markdown\">​</a></h3>\n<p>Docusaurus v3 upgraded from MDX v1 to MDX v3:</p>\n<ul>\n<li>in <a href=\"https://github.com/facebook/docusaurus/pull/8288\" target=\"_blank\" rel=\"noopener noreferrer\">#8288</a>, we upgraded to <a href=\"https://mdxjs.com/blog/v2/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>MDX v2</strong></a> (<a href=\"https://mdxjs.com/migrating/v2/\" target=\"_blank\" rel=\"noopener noreferrer\">migration guide</a>)</li>\n<li>in <a href=\"https://github.com/facebook/docusaurus/pull/9451\" target=\"_blank\" rel=\"noopener noreferrer\">#9451</a>, we upgraded to <a href=\"https://mdxjs.com/blog/v3/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>MDX v3</strong></a> (<a href=\"https://mdxjs.com/migrating/v3/\" target=\"_blank\" rel=\"noopener noreferrer\">migration guide</a>)</li>\n</ul>\n<p>This new MDX version is <strong>much better for content writers and plugin authors</strong>, and lays the ground for implementing new exciting Markdown features.</p>\n<div class=\"theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>MDX v3 - the main challenge</div><div class=\"admonitionContent_Knsx\"><p>The transition from MDX v1 to MDX v3 is the <strong>main challenge</strong> to the adoption of Docusaurus v3.</p><p>Some documents that compiled successfully under Docusaurus v2 might now <strong>fail to compile</strong> under Docusaurus v3, while others might <strong>render differently</strong>.</p><p>Most breaking changes come from <a href=\"https://mdxjs.com/blog/v2/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v2</a>, and <a href=\"https://mdxjs.com/blog/v3/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v3</a> is a relatively small release. The <a href=\"https://mdxjs.com/migrating/v2/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v2 migration guide</a> has a section on how to <a href=\"https://mdxjs.com/migrating/v2/#update-mdx-files\" target=\"_blank\" rel=\"noopener noreferrer\">update MDX files</a> that will be particularly relevant to us. Also make sure to read the <a href=\"https://mdxjs.com/docs/troubleshooting-mdx/\" target=\"_blank\" rel=\"noopener noreferrer\">Troubleshooting MDX</a> page that can help you interpret common MDX error messages.</p><p><strong>Don't be intimidated</strong>. Most problems are <strong>easy to fix</strong> and often related to <code>{</code> and <code>&lt;</code> characters that you now need to escape. However, depending on the size of your site, you might need to edit many files and feel overwhelmed. For this reason, we provide a command <a href=\"https://github.com/slorber/docusaurus-mdx-checker\" target=\"_blank\" rel=\"noopener noreferrer\"><code>npx docusaurus-mdx-checker</code></a> to help you get an estimate of the work to be done, and we recommend to <a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3\">prepare your site in advance</a>.</p><p>If you created custom <a href=\"https://coinsgpt.github.io/docs/markdown-features/plugins\">MDX plugins</a> (Remark/Rehype), the AST is slightly different, and you might need to refactor them.</p></div></div>\n<p>This notably enables us to add a <a href=\"https://coinsgpt.github.io/docs/markdown-features#mdx-vs-commonmark\">CommonMark mode</a> that should make it easier for existing documentations to adopt Docusaurus. It is currently opt-in and <strong>experimental</strong> and limited (<a href=\"https://github.com/facebook/docusaurus/issues/9092\" target=\"_blank\" rel=\"noopener noreferrer\">some Docusaurus features will not work</a>). In Docusaurus v3, all files are still interpreted as MDX, but we plan to interpret <code>.md</code> files as CommonMark in an upcoming major version, and recommend to use the <code>.mdx</code> extension for any file using JSX or ES modules.</p>\n<p>We also introduced a new way to <a href=\"https://coinsgpt.github.io/docs/api/docusaurus-config#markdown\">configure Markdown globally for your site</a>, and plan to add more flexible options later.</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword module\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">markdown</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token literal-property property\" style=\"color:#005CC5\">format</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'mdx'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token literal-property property\" style=\"color:#005CC5\">mermaid</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token function-variable function\" style=\"color:#8250DF\">preprocessor</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token parameter punctuation\" style=\"color:#393A34\">{</span><span class=\"token parameter\" style=\"color:#953800\">filePath</span><span class=\"token parameter punctuation\" style=\"color:#393A34\">,</span><span class=\"token parameter\" style=\"color:#953800\"> fileContent</span><span class=\"token parameter punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> fileContent</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token method function property-access\" style=\"color:#8250DF\">replaceAll</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token string\" style=\"color:#C6105F\">'{{MY_VAR}}'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'MY_VALUE'</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token literal-property property\" style=\"color:#005CC5\">mdx1Compat</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">comments</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">admonitions</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">headingIds</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<p>Docusaurus now uses the <a href=\"https://github.com/remarkjs/remark-directive\" target=\"_blank\" rel=\"noopener noreferrer\">remark-directive</a> plugin to support admonitions. This also offers you the ability to create your own Remark plugins to extend Markdown with your own <a href=\"https://talk.commonmark.org/t/generic-directives-plugins-syntax/444\" target=\"_blank\" rel=\"noopener noreferrer\">custom directives</a> such as <code>:textDirective</code>, <code>::leafDirective</code> or <code>:::containerDirective</code>.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"esm-ts-configs\">ESM and TypeScript configs<a href=\"https://coinsgpt.github.io/blog/releases/3.0#esm-ts-configs\" class=\"hash-link\" aria-label=\"Direct link to ESM and TypeScript configs\" title=\"Direct link to ESM and TypeScript configs\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/9317\" target=\"_blank\" rel=\"noopener noreferrer\">#9317</a>, we added support for ES Modules and TypeScript config files, including site config, docs sidebars, plugins and presets.</p>\n<p>Here are 2 TypeScript examples, giving you a modern experience with IDE autocompletion:</p>\n<div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.ts</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">type</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">Config</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/types'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">type</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">*</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">as</span><span class=\"token plain\"> Preset </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/preset-classic'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> config</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> Config </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  title</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'My Site'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  favicon</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'img/favicon.ico'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// your site config ...</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  presets</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token string\" style=\"color:#C6105F\">'classic'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// your preset config ...</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> satisfies Preset</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token plain\">Options</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  themeConfig</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// your theme config ...</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> satisfies Preset</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token plain\">ThemeConfig</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> config</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">sidebars.ts</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">type</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">SidebarsConfig</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/plugin-content-docs'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> sidebars</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> SidebarsConfig </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  docs</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token string\" style=\"color:#C6105F\">'introduction'</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> sidebars</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"unlisted-content\">Unlisted content<a href=\"https://coinsgpt.github.io/blog/releases/3.0#unlisted-content\" class=\"hash-link\" aria-label=\"Direct link to Unlisted content\" title=\"Direct link to Unlisted content\">​</a></h3>\n<p>Docusaurus already supported a <code>draft: true</code> front matter option in our 3 content plugins (docs, blog, pages), which allows you to remove some pages from your production builds.</p>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8004\" target=\"_blank\" rel=\"noopener noreferrer\">#8004</a>, we introduced a new <code>unlisted: true</code> front matter option, which will keep your pages available in production builds, while \"hiding\" them and making them impossible to discover unless you have the url. This enables convenient workflows where you can easily ask for feedback on a piece of content before the final publication.</p>\n<p>Unlisted content will:</p>\n<ul>\n<li>be excluded from <code>sitemap.xml</code></li>\n<li>be excluded from SEO results thanks to <code>&lt;meta name=\"robots\" content=\"noindex, nofollow\" /&gt;</code></li>\n<li>be excluded from blog RSS feeds</li>\n<li>be excluded from Algolia DocSearch results</li>\n<li>be filtered from site navbar items, docs sidebars, blog sidebar, blog archives, tags pages...</li>\n</ul>\n<p>Unlisted content will also display a banner so that you don't forget to turn it off once your content is ready for prime time. Here's an example of an <a href=\"https://coinsgpt.github.io/tests/blog/unlisted-post\">unlisted blog post</a>:</p>\n<div style=\"padding:10px\"><div class=\"browserWindow_my1Q\" style=\"min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden\"><div class=\"browserWindowHeader_jXSR\"><div class=\"buttons_uHc7\"><span class=\"dot_giz1\" style=\"background:#f25f58\"></span><span class=\"dot_giz1\" style=\"background:#fbbe3c\"></span><span class=\"dot_giz1\" style=\"background:#58cb42\"></span></div><div class=\"browserWindowAddressBar_Pd8y text--truncate\">/tests/blog/unlisted-post</div><div class=\"browserWindowMenuIcon_Vhuh\"><div><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span></div></div></div><div class=\"browserWindowBody_Idgs\" style=\"padding:0\"><iframe src=\"/tests/blog/unlisted-post\" title=\"/tests/blog/unlisted-post\" style=\"display:block;width:100%;height:300px\"></iframe></div></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"react-18\">React 18<a href=\"https://coinsgpt.github.io/blog/releases/3.0#react-18\" class=\"hash-link\" aria-label=\"Direct link to React 18\" title=\"Direct link to React 18\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8961\" target=\"_blank\" rel=\"noopener noreferrer\">#8961</a>, we upgraded to React 18. This is important, notably for the <a href=\"https://react.dev/blog/2022/03/29/react-v18#gradually-adopting-concurrent-features\" target=\"_blank\" rel=\"noopener noreferrer\">gradual adoption of Concurrent React features</a>, as well as upcoming exciting features such as <a href=\"https://github.com/facebook/docusaurus/issues/9089\" target=\"_blank\" rel=\"noopener noreferrer\">build-time React Server Components</a>.</p>\n<p>This new version of React should be a drop-in replacement for most Docusaurus sites. It comes with breaking changes that we handled internally in the Docusaurus codebase. If your site is using a lot of custom React code, we recommend you to take a look at the official article on <a href=\"https://react.dev/blog/2022/03/08/react-18-upgrade-guide\" target=\"_blank\" rel=\"noopener noreferrer\">How to Upgrade to React 18</a>, notably the new <a href=\"https://react.dev/blog/2022/03/08/react-18-upgrade-guide#automatic-batching\" target=\"_blank\" rel=\"noopener noreferrer\">automatic batching</a> behavior.</p>\n<div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Experimental support for React 18 features</div><div class=\"admonitionContent_Knsx\"><p>React 18 comes with new features:</p><ul>\n<li><code>&lt;Suspense&gt;</code></li>\n<li><code>React.lazy()</code></li>\n<li><code>startTransition()</code></li>\n</ul><p>Their Docusaurus support is considered as <strong>experimental</strong>. We might have to adjust the integration in the future, leading to a different runtime behavior.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"automatic-jsx-runtime\">Automatic JSX runtime<a href=\"https://coinsgpt.github.io/blog/releases/3.0#automatic-jsx-runtime\" class=\"hash-link\" aria-label=\"Direct link to Automatic JSX runtime\" title=\"Direct link to Automatic JSX runtime\">​</a></h3>\n<p>Docusaurus now uses the <a href=\"https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html\" target=\"_blank\" rel=\"noopener noreferrer\">\"automatic\" JSX runtime</a>.</p>\n<p>It is not needed anymore to import React in JSX files that do not use any React API.</p>\n<div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">src/components/MyComponent.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"> import React from 'react';</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\"> export default function MyComponent() {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">   return &lt;div&gt;Hello&lt;/div&gt;;</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\"> }</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"debug-builds\">Debug builds<a href=\"https://coinsgpt.github.io/blog/releases/3.0#debug-builds\" class=\"hash-link\" aria-label=\"Direct link to Debug builds\" title=\"Direct link to Debug builds\">​</a></h3>\n<p>It is now possible to build your static site in dev mode.</p>\n<div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">docusaurus build </span><span class=\"token parameter variable\" style=\"color:#E36209\">--dev</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Debug React-related problems</div><div class=\"admonitionContent_Knsx\"><p>Docusaurus will log more errors to the console, notably React 18 hydration errors through the new <a href=\"https://react.dev/reference/react-dom/client/hydrateRoot#parameters\" target=\"_blank\" rel=\"noopener noreferrer\"><code>onRecoverableError</code> callback</a>.</p><p>This new build mode is particularly helpful for <strong>troubleshooting React problems</strong>. Docusaurus will use the development build of React, thus producing detailed and readable error messages instead of minified ones linking to the <a href=\"https://reactjs.org/docs/error-decoder.html/\" target=\"_blank\" rel=\"noopener noreferrer\">React Error Decoder page</a>.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"typescript\">TypeScript<a href=\"https://coinsgpt.github.io/blog/releases/3.0#typescript\" class=\"hash-link\" aria-label=\"Direct link to TypeScript\" title=\"Direct link to TypeScript\">​</a></h3>\n<p>Docusaurus v3 now requires a minimum version of TypeScript 5.0.</p>\n<p>We re-internalized the base recommended TypeScript config to a new official package:</p>\n<div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">tsconfig.json</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">{</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">  \"extends\": \"@tsconfig/docusaurus/tsconfig.json\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">  \"extends\": \"@docusaurus/tsconfig\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  \"compilerOptions\": {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    \"baseUrl\": \".\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  }</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">}</span><br></span></code></pre></div></div>\n<p>We also have cleaner, normalized exports for Docusaurus core type, plugin, and preset options, which you can use within the brand-new <a href=\"https://coinsgpt.github.io/blog/releases/3.0#esm-ts-configs\">TypeScript config files</a>:</p>\n<div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.ts</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">type</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">Config</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/types'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">type</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">Options</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> ThemeConfig</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/preset-classic'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">type</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">SidebarsConfig</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/plugin-content-docs'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"code-blocks\">Code blocks<a href=\"https://coinsgpt.github.io/blog/releases/3.0#code-blocks\" class=\"hash-link\" aria-label=\"Direct link to Code blocks\" title=\"Direct link to Code blocks\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/9316\" target=\"_blank\" rel=\"noopener noreferrer\">#9316</a>, we improved on syntax highlighting thanks to the <a href=\"https://github.com/FormidableLabs/prism-react-renderer\" target=\"_blank\" rel=\"noopener noreferrer\">prism-react-renderer</a> v2 upgrade. For example, a bash param <code>--save</code> is now colored:</p>\n<div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#8250DF\">npm</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">install</span><span class=\"token plain\"> </span><span class=\"token parameter variable\" style=\"color:#E36209\">--save</span><span class=\"token plain\"> some-package</span><br></span></code></pre></div></div>\n<p>The <a href=\"https://coinsgpt.github.io/docs/markdown-features/code-blocks#interactive-code-editor\">interactive code editor</a> also upgrades to <a href=\"https://github.com/FormidableLabs/react-live\" target=\"_blank\" rel=\"noopener noreferrer\">react-live</a> v4, coming with a new <a href=\"https://github.com/alangpierce/sucrase\" target=\"_blank\" rel=\"noopener noreferrer\">sucrase</a> compiler. It is faster, lighter, and supports modern features, notably TypeScript type annotations.</p>\n<div class=\"playgroundContainer_TDLX\"><div class=\"playgroundHeader_h_Hu\">Live Editor</div><div class=\"playgroundEditor_uqZ4\"><pre class=\"prism-code language-tsx\" style=\"margin:0;outline:none;padding:10px;font-family:inherit;color:#393A34;background-color:#f6f8fa\" spellcheck=\"false\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">Hello</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span>\n</span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> name</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\">string</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'World'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span>\n</span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain-text\">Hello </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span>\n</span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span>\n</span></pre></div><div class=\"playgroundHeader_h_Hu\">Result</div><div class=\"playgroundPreview_u2xE\"><div>Loading...</div></div></div>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8982\" target=\"_blank\" rel=\"noopener noreferrer\">#8982</a> and <a href=\"https://github.com/facebook/docusaurus/pull/8870\" target=\"_blank\" rel=\"noopener noreferrer\">#8870</a>, we also added <a href=\"https://coinsgpt.github.io/docs/markdown-features/code-blocks#custom-magic-comments\">magic comments</a> support for TeX-like, Haskell-like, and WebAssembly comment syntax.</p>\n<div class=\"language-haskell codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">haskell.hs</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-haskell codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token hvariable\">stringLength</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">::</span><span class=\"token plain\"> </span><span class=\"token constant\" style=\"color:#005CC5\">String</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token constant\" style=\"color:#005CC5\">Int</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token hvariable\">stringLength</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#005CC5\">0</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token hvariable\">stringLength</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token hvariable\">x</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token hvariable\">xs</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#005CC5\">1</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">+</span><span class=\"token plain\"> </span><span class=\"token hvariable\">stringLength</span><span class=\"token plain\"> </span><span class=\"token hvariable\">xs</span><br></span></code></pre></div></div>\n<div class=\"language-matlab codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">matlab.m</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-matlab codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">function</span><span class=\"token plain\"> result </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">times2</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">n</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">  result </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> n </span><span class=\"token operator\" style=\"color:#D73A49\">*</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#005CC5\">2</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">end</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#005CC5\">10</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">y </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">times2</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"mermaid-diagrams\">Mermaid diagrams<a href=\"https://coinsgpt.github.io/blog/releases/3.0#mermaid-diagrams\" class=\"hash-link\" aria-label=\"Direct link to Mermaid diagrams\" title=\"Direct link to Mermaid diagrams\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/9305\" target=\"_blank\" rel=\"noopener noreferrer\">#9305</a>, we upgraded to Mermaid v10.4 and added support for async diagram rendering. Docusaurus is now able to render new types of diagrams.</p>\n<details class=\"details_Nokh alert alert--info details_Cn_P\" data-collapsed=\"true\"><summary>Mindmap</summary><div><div class=\"collapsibleContent_EoA1\"></div></div></details>\n<details class=\"details_Nokh alert alert--info details_Cn_P\" data-collapsed=\"true\"><summary>Quadrant chart</summary><div><div class=\"collapsibleContent_EoA1\"></div></div></details>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"query-string-data-attributes\">Query-string data attributes<a href=\"https://coinsgpt.github.io/blog/releases/3.0#query-string-data-attributes\" class=\"hash-link\" aria-label=\"Direct link to Query-string data attributes\" title=\"Direct link to Query-string data attributes\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/9028\" target=\"_blank\" rel=\"noopener noreferrer\">#9028</a>, we made it possible to set custom HTML <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*\" target=\"_blank\" rel=\"noopener noreferrer\">data attributes</a> though <code>docusaurus-data-x</code> query-string parameters. This makes it easier to embed a Docusaurus iframe on another site, and lets you customize the appearance of the embedded version with CSS.</p>\n<div class=\"language-css codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">/src/css/custom.css</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token selector\" style=\"color:#6F42C1\">html</span><span class=\"token selector attribute punctuation\" style=\"color:#393A34\">[</span><span class=\"token selector attribute attr-name\" style=\"color:#0550AE\">data-navbar</span><span class=\"token selector attribute operator\" style=\"color:#D73A49\">=</span><span class=\"token selector attribute attr-value\" style=\"color:#C6105F\">'false'</span><span class=\"token selector attribute punctuation\" style=\"color:#393A34\">]</span><span class=\"token selector\" style=\"color:#6F42C1\"> </span><span class=\"token selector class\" style=\"color:#6F42C1\">.navbar</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token property\" style=\"color:#005CC5\">display</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> none</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token selector\" style=\"color:#6F42C1\">html</span><span class=\"token selector attribute punctuation\" style=\"color:#393A34\">[</span><span class=\"token selector attribute attr-name\" style=\"color:#0550AE\">data-red-border</span><span class=\"token selector attribute punctuation\" style=\"color:#393A34\">]</span><span class=\"token selector\" style=\"color:#6F42C1\"> div</span><span class=\"token selector id\" style=\"color:#6F42C1\">#__docusaurus</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token property\" style=\"color:#005CC5\">border</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token color\" style=\"color:#005CC5\">red</span><span class=\"token plain\"> solid thick</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></span></code></pre></div></div>\n<div style=\"padding:10px\"><div class=\"browserWindow_my1Q\" style=\"min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden\"><div class=\"browserWindowHeader_jXSR\"><div class=\"buttons_uHc7\"><span class=\"dot_giz1\" style=\"background:#f25f58\"></span><span class=\"dot_giz1\" style=\"background:#fbbe3c\"></span><span class=\"dot_giz1\" style=\"background:#58cb42\"></span></div><div class=\"browserWindowAddressBar_Pd8y text--truncate\">/docs/?docusaurus-data-navbar=false&amp;docusaurus-data-red-border</div><div class=\"browserWindowMenuIcon_Vhuh\"><div><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span></div></div></div><div class=\"browserWindowBody_Idgs\" style=\"padding:0\"><iframe src=\"/docs/?docusaurus-data-navbar=false&amp;docusaurus-data-red-border\" title=\"/docs/?docusaurus-data-navbar=false&amp;docusaurus-data-red-border\" style=\"display:block;width:100%;height:300px\"></iframe></div></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-features\">Other features<a href=\"https://coinsgpt.github.io/blog/releases/3.0#other-features\" class=\"hash-link\" aria-label=\"Direct link to Other features\" title=\"Direct link to Other features\">​</a></h3>\n<p>Other new features worth mentioning:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9189\" target=\"_blank\" rel=\"noopener noreferrer\">#9189</a>: new blog <code>feedOptions.limit</code> option</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9071\" target=\"_blank\" rel=\"noopener noreferrer\">#9071</a>: add normalized SEO front matter support for the pages plugin</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9028\" target=\"_blank\" rel=\"noopener noreferrer\">#9171</a>: the client-redirects plugin now supports fully qualified urls and query-string/hash in destination url</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/9171\" target=\"_blank\" rel=\"noopener noreferrer\">#9171</a>: new ESLint rule <a href=\"https://coinsgpt.github.io/docs/api/misc/@docusaurus/eslint-plugin/no-html-links\"><code>no-html-links</code></a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8384\" target=\"_blank\" rel=\"noopener noreferrer\">#8384</a>: new ESLint rule <a href=\"https://coinsgpt.github.io/docs/api/misc/@docusaurus/eslint-plugin/prefer-docusaurus-heading\"><code>prefer-docusaurus-heading</code></a></li>\n</ul>\n<p>Read <a href=\"https://github.com/facebook/docusaurus/releases/tag/v3.0.0\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Docusaurus v3.0.0 release notes</strong></a> for an exhaustive list of changes.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"conclusion\">Conclusion<a href=\"https://coinsgpt.github.io/blog/releases/3.0#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>This release comes with a few features, but more importantly <strong>upgrades many pieces of the Docusaurus infrastructure</strong>.</p>\n<p>The <strong>MDX upgrade</strong> consumed a lot of our time this year, and we worked hard to make this important upgrade less difficult for all of you.</p>\n<p>Now that we've caught up with our infrastructure, we'll be back <strong>delivering useful documentation features</strong> very soon, in upcoming minor versions.</p>\n<p>We would like to thank you for using Docusaurus over the years. The documentation framework space is becoming more competitive lately, and we will do our best to ensure that Docusaurus remains a <strong>competitive solution</strong> that stands out for its great <strong>flexibility</strong>.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/3.0",
            "title": "Announcing Docusaurus 3.0",
            "summary": "Today, we are happy to announce Docusaurus 3.0! 🥳",
            "date_modified": "2023-10-31T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3",
            "content_html": "<div class=\"theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>warning</div><div class=\"admonitionContent_Knsx\"><p>This blog post was written when Docusaurus v3 was in beta. There are some changes in dependency versions and upgrade steps you should be aware of if upgrading to Docusaurus v3 current stable releases. Use the <a href=\"https://docusaurus.io/docs/next/migration/v3\" target=\"_blank\" rel=\"noopener noreferrer\">upgrade guide</a> for the most up-to-date migration steps.</p></div></div>\n<p><strong>Docusaurus v3</strong> is now <a href=\"https://github.com/facebook/docusaurus/discussions/9312\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>in beta</strong></a> and the official release is around the corner. This is the perfect time to start <strong>preparing your site</strong> for this new major version.</p>\n<p>Docusaurus v3 comes with a few <strong>breaking changes</strong>, many of which can be <strong>handled today under Docusaurus v2</strong>. Preparing your site ahead of time can be done incrementally, and will make it easier to upgrade to v3.</p>\n<p>The main breaking change is the upgrade from MDX v1 to MDX v3. Read the <a href=\"https://mdxjs.com/blog/v2/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>MDX v2</strong></a> and <a href=\"https://mdxjs.com/blog/v3/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>MDX v3</strong></a> release notes for details. MDX will now compile your Markdown content <strong>more strictly</strong> and with <strong>subtle differences</strong>.</p>\n<p>This article will mostly focus on how to prepare your content for this new MDX version, and will also list a few other breaking changes that you can handle today.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Preparing your site for Docusaurus v3 - social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-1c688c53b51bdaa6e15ae532bf756276.png\" width=\"1040\" height=\"546\" class=\"img_vXGZ\"></p>\n<div class=\"theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>warning</div><div class=\"admonitionContent_Knsx\"><p>This article mentions most Docusaurus v3 breaking changes, but is not exhaustive. Read the <a href=\"https://github.com/facebook/docusaurus/discussions/9312\" target=\"_blank\" rel=\"noopener noreferrer\">v3.0.0-beta.0 release notes</a> for an exhaustive list.</p></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Don't be afraid</div><div class=\"admonitionContent_Knsx\"><p>There's a lot of content in this blog post, but many Docusaurus v2 sites can upgrade with very few changes.</p><p>If your site is relatively small, with only a few customizations, you can probably <a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#try-docusaurus-v3-today\">upgrade to Docusaurus v3</a> immediately.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"preparatory-work\">Preparatory work<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#preparatory-work\" class=\"hash-link\" aria-label=\"Direct link to Preparatory work\" title=\"Direct link to Preparatory work\">​</a></h2>\n<p>Before preparing for the Docusaurus v3 upgrade, we recommend upgrading to the latest <a href=\"https://coinsgpt.github.io/versions\">Docusaurus v2 version</a>.</p>\n<p>Depending on the complexity of your site, it may be a good idea to adopt the <a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing\">visual regression testing workflow</a> that we recently presented. It could help you catch unexpected visual side effects occurring during the Docusaurus v3 upgrade.</p>\n<p>We also recommend using the <code>.mdx</code> extension whenever you use JSX, <code>import</code>, or <code>export</code> (i.e. MDX features) inside a Markdown file. It is semantically more correct and improves compatibility with external tools (IDEs, formatters, linters, etc.). In future versions of Docusaurus, <code>.md</code> files will be parsed as standard <a href=\"https://commonmark.org/\" target=\"_blank\" rel=\"noopener noreferrer\">CommonMark</a>, which does not support these features. In Docusaurus v3, <code>.md</code> files keep being compiled as MDX files, but it will be possible to <a href=\"https://github.com/facebook/docusaurus/issues/3018\" target=\"_blank\" rel=\"noopener noreferrer\">opt-in for CommonMark</a>.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"preparing-content-for-mdx-v3\">Preparing content for MDX v3<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#preparing-content-for-mdx-v3\" class=\"hash-link\" aria-label=\"Direct link to Preparing content for MDX v3\" title=\"Direct link to Preparing content for MDX v3\">​</a></h2>\n<p>MDX is a major dependency of Docusaurus responsible for compiling your <code>.md</code> and <code>.mdx</code> files to React components.</p>\n<p>MDX v3 is much better, but also comes with changes that probably require you to refactor your content a bit. MDX v3 is stricter, and some components that compiled fine under v1 might now fail to compile under v3, most likely because of <code>{</code> and <code>&lt;</code> characters.</p>\n<p>Upgrading MDX comes with all the breaking changes documented on the <a href=\"https://mdxjs.com/blog/v2/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v2</a> and <a href=\"https://mdxjs.com/blog/v3/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v3</a> release blog posts. Most breaking changes come from MDX v2. The <a href=\"https://mdxjs.com/migrating/v2/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v2 migration guide</a> has a section on how to <a href=\"https://mdxjs.com/migrating/v2/#update-mdx-files\" target=\"_blank\" rel=\"noopener noreferrer\">update MDX files</a> that will be particularly relevant to us. Also make sure to read the <a href=\"https://mdxjs.com/docs/troubleshooting-mdx/\" target=\"_blank\" rel=\"noopener noreferrer\">Troubleshooting MDX</a> page that can help you interpret common MDX error messages.</p>\n<p>Make sure to also read our updated <a href=\"https://coinsgpt.github.io/docs/markdown-features/react\"><strong>MDX and React</strong></a> documentation page.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Ask for help</div><div class=\"admonitionContent_Knsx\"><p>We have a dedicated <a href=\"https://github.com/facebook/docusaurus/discussions/9053\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v3 - Upgrade Support</a> discussion.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"using-the-mdx-playground\">Using the MDX playground<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#using-the-mdx-playground\" class=\"hash-link\" aria-label=\"Direct link to Using the MDX playground\" title=\"Direct link to Using the MDX playground\">​</a></h3>\n<p>The MDX playground is your new best friend. It permits to understand how your content is <strong>compiled to React components</strong>, and troubleshoot compilation or rendering issues in isolation.</p>\n<p>Each MDX version comes with its own playground:</p>\n<ul>\n<li><a href=\"https://mdxjs.com/playground/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX playground - current version</a></li>\n<li><a href=\"https://mdx-git-renovate-babel-monorepo-mdx.vercel.app/playground/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX playground - v1</a></li>\n</ul>\n<details class=\"details_Nokh alert alert--info details_Cn_P\" data-collapsed=\"true\"><summary>Configuring the MDX playground options for Docusaurus</summary><div><div class=\"collapsibleContent_EoA1\"><p>To obtain a compilation behavior similar to what Docusaurus v2 uses, please turn on these options on the <a href=\"https://mdxjs.com/playground/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX playground</a>:</p><ul>\n<li>Use <code>MDX</code></li>\n<li>Use <code>remark-gfm</code></li>\n<li>Use <code>remark-directive</code></li>\n</ul><p><img decoding=\"async\" loading=\"lazy\" alt=\"Screenshot of the MDX playground&amp;#39;s options panel, with only the &amp;quot;Use MDX&amp;quot;, &amp;quot;Use remark-gfm&amp;quot;, and &amp;quot;Use remark-directive&amp;quot; options checked\" src=\"https://coinsgpt.github.io/assets/images/mdx2-playground-options-eab88e8328a6902759c4236ffc93d9c6.png\" width=\"1968\" height=\"1316\" class=\"img_vXGZ\"></p></div></div></details>\n<p>Using the two MDX playgrounds side-by-side, you will soon notice that some content is compiled differently or fails to compile in v3.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Making your content future-proof</div><div class=\"admonitionContent_Knsx\"><p>The goal will be to refactor your problematic content so that it <strong>works fine with both versions of MDX</strong>. This way, when you upgrade to Docusaurus v3, this content will already work out-of-the-box.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"using-the-mdx-checker-cli\">Using the MDX checker CLI<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#using-the-mdx-checker-cli\" class=\"hash-link\" aria-label=\"Direct link to Using the MDX checker CLI\" title=\"Direct link to Using the MDX checker CLI\">​</a></h3>\n<p>We provide a <a href=\"https://github.com/slorber/docusaurus-mdx-checker\" target=\"_blank\" rel=\"noopener noreferrer\">docusaurus-mdx-checker</a> CLI that permits to easily spot problematic content. Run this command today on your Docusaurus v2 site to obtain a list of files that will fail to compile under MDX v3.</p>\n<div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">npx docusaurus-mdx-checker</span><br></span></code></pre></div></div>\n<p>For each compilation issue, the CLI will log the file path and a line number to look at.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Screenshot of the terminal showing an example MDX checker CLI output, with a few error messages\" src=\"https://coinsgpt.github.io/assets/images/mdx-checker-output-0f96cc19fd3ed4d55901ca90ad657c14.png\" width=\"1161\" height=\"417\" class=\"img_vXGZ\"></p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>Use this CLI to estimate of how much work will be required to make your content compatible with MDX v3.</p></div></div>\n<div class=\"theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>warning</div><div class=\"admonitionContent_Knsx\"><p>This CLI is a best effort, and will only report compilation errors.</p><p>It will not report subtle compilation changes that do not produce errors but can affect how your content is displayed. To catch these problems, we recommend using <a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing\">visual regression tests</a>.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"common-mdx-problems\">Common MDX problems<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#common-mdx-problems\" class=\"hash-link\" aria-label=\"Direct link to Common MDX problems\" title=\"Direct link to Common MDX problems\">​</a></h3>\n<p>We upgraded a few Docusaurus sites to Docusaurus v3 and MDX v3:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8288\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus PR</a></li>\n<li><a href=\"https://github.com/facebook/react-native-website/pull/3780\" target=\"_blank\" rel=\"noopener noreferrer\">React-Native PR</a></li>\n<li><a href=\"https://github.com/jestjs/jest/pull/14463\" target=\"_blank\" rel=\"noopener noreferrer\">Jest PR</a></li>\n</ul>\n<p>These upgrades permitted us to aggregate the most common content problems, and document how to best handle them.</p>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"bad-usage-of-\">Bad usage of <code>{</code><a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#bad-usage-of-\" class=\"hash-link\" aria-label=\"Direct link to bad-usage-of-\" title=\"Direct link to bad-usage-of-\">​</a></h4>\n<p>The <code>{</code> character is used for opening <a href=\"https://mdxjs.com/docs/what-is-mdx/#expressions\" target=\"_blank\" rel=\"noopener noreferrer\">JavaScript expressions</a>. MDX will now fail if what you put inside <code>{expression}</code> is not a valid expression.</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">example.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">The object shape looks like {username: string, age: number}</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Error message</div><div class=\"admonitionContent_Knsx\"><blockquote>\n<p>Could not parse expression with acorn: Unexpected content after expression</p>\n</blockquote></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>Available options to fix this error:</p><ul>\n<li>Use inline code: <code>{username: string, age: number}</code></li>\n<li>Use the HTML code: <code>&amp;#123;</code></li>\n<li>Escape it: <code>\\{</code></li>\n</ul></div></div>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"bad-usage-of--1\">Bad usage of <code>&lt;</code><a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#bad-usage-of--1\" class=\"hash-link\" aria-label=\"Direct link to bad-usage-of--1\" title=\"Direct link to bad-usage-of--1\">​</a></h4>\n<p>The <code>&lt;</code> character is used for opening <a href=\"https://mdxjs.com/docs/what-is-mdx/#jsx\" target=\"_blank\" rel=\"noopener noreferrer\">JSX tags</a>. MDX will now fail if it thinks your JSX is invalid.</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">example.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">Use Android version &lt;5</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">You can use a generic type like Array</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">T</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">Follow the template \"Road to </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">YOUR_MINOR_VERSION</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\">\"</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Error messages</div><div class=\"admonitionContent_Knsx\"><blockquote>\n<p>Unexpected character <code>5</code> (U+0035) before name, expected a character that can start a name, such as a letter, <code>$</code>, or <code>_</code></p>\n</blockquote><blockquote>\n<p>Expected a closing tag for <code>&lt;T&gt;</code> (1:6-1:9) before the end of <code>paragraph</code> end-tag-mismatch mdast-util-mdx-jsx</p>\n</blockquote><blockquote>\n<p>Expected a closing tag for <code>&lt;YOUR_MINOR_VERSION&gt;</code> (134:19-134:39) before the end of <code>paragraph</code></p>\n</blockquote></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>Available options to fix this error:</p><ul>\n<li>Use inline code: <code>Array&lt;T&gt;</code></li>\n<li>Use the HTML code: <code>&amp;lt;</code> or <code>&amp;#60;</code></li>\n<li>Escape it: <code>\\&lt;</code> (unfortunately the <code>\\</code> will be displayed under MDX v1)</li>\n</ul></div></div>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"bad-usage-of-gfm-autolink\">Bad usage of GFM Autolink<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#bad-usage-of-gfm-autolink\" class=\"hash-link\" aria-label=\"Direct link to Bad usage of GFM Autolink\" title=\"Direct link to Bad usage of GFM Autolink\">​</a></h4>\n<p>Docusaurus supports <a href=\"https://github.github.com/gfm/\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Flavored Markdown (GFM)</a>, but <a href=\"https://github.github.com/gfm/#autolinks\" target=\"_blank\" rel=\"noopener noreferrer\">autolink</a> using the <code>&lt;link&gt;</code> syntax is not supported anymore by MDX.</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">example.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">sebastien@thisweekinreact.com</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">&lt;http://localhost:3000&gt;</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Error messages</div><div class=\"admonitionContent_Knsx\"><blockquote>\n<p>Unexpected character <code>@</code> (U+0040) in name, expected a name character such as letters, digits, <code>$</code>, or <code>_</code>; whitespace before attributes; or the end of the tag (note: to create a link in MDX, use <code>[text](url)</code>)</p>\n</blockquote><blockquote>\n<p>Unexpected character <code>/</code> (U+002F) before local name, expected a character that can start a name, such as a letter, <code>$</code>, or <code>_</code> (note: to create a link in MDX, use <code>[text](url)</code>)</p>\n</blockquote></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>Use regular Markdown links, or remove the <code>&lt;</code> and <code>&gt;</code>. MDX and GFM are able to autolink literals already.</p><div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">example.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">sebastien@thisweekinreact.com</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token url\" style=\"color:#36acaa\">[</span><span class=\"token url content\" style=\"color:#36acaa\">sebastien@thisweekinreact.com</span><span class=\"token url\" style=\"color:#36acaa\">](</span><span class=\"token url\" style=\"color:#36acaa\">mailto:sebastien@thisweekinreact.com</span><span class=\"token url\" style=\"color:#36acaa\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">http://localhost:3000</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token url\" style=\"color:#36acaa\">[</span><span class=\"token url content\" style=\"color:#36acaa\">http://localhost:3000</span><span class=\"token url\" style=\"color:#36acaa\">](</span><span class=\"token url\" style=\"color:#36acaa\">http://localhost:3000</span><span class=\"token url\" style=\"color:#36acaa\">)</span><br></span></code></pre></div></div></div></div>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"lower-case-mdxcomponent-mapping\">Lower-case MDXComponent mapping<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#lower-case-mdxcomponent-mapping\" class=\"hash-link\" aria-label=\"Direct link to Lower-case MDXComponent mapping\" title=\"Direct link to Lower-case MDXComponent mapping\">​</a></h4>\n<p>For users providing a <a href=\"https://coinsgpt.github.io/docs/markdown-features/react#mdx-component-scope\">custom <code>MDXComponent</code>mapping</a>, components are now \"sandboxed\":</p>\n<ul>\n<li>a <code>MDXComponent</code> mapping for <code>h1</code> only gets used for <code># hi</code> but not for <code>&lt;h1&gt;hi&lt;/h1&gt;</code></li>\n<li>a <strong>lower-cased</strong> custom element name will not be substituted by its respective <code>MDXComponent</code> component anymore</li>\n</ul>\n<div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>visual difference</div><div class=\"admonitionContent_Knsx\"><p>Your <a href=\"https://coinsgpt.github.io/docs/markdown-features/react#mdx-component-scope\"><code>MDXComponent</code> component mapping</a> might not be applied as before, and your custom components might no longer be used.</p></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>For native Markdown elements, you can keep using <strong>lower-case</strong>: <code>p</code>, <code>h1</code>, <code>img</code>, <code>a</code>...</p><p>For any other element, <strong>use upper-case names</strong>.</p><div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">src/theme/MDXComponents.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">import MDXComponents from '@theme-original/MDXComponents';</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">export default {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  ...MDXComponents,</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  p: (props) =&gt; &lt;p {...props} className=\"my-paragraph\"/&gt;</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">  myElement: (props) =&gt; &lt;div {...props} className=\"my-class\" /&gt;,</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">  MyElement: (props) =&gt; &lt;div {...props} className=\"my-class\" /&gt;,</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">};</span><br></span></code></pre></div></div></div></div>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"unintended-extra-paragraphs\">Unintended extra paragraphs<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#unintended-extra-paragraphs\" class=\"hash-link\" aria-label=\"Direct link to Unintended extra paragraphs\" title=\"Direct link to Unintended extra paragraphs\">​</a></h4>\n<p>In MDX, it is now possible to interleave JSX and Markdown more easily without requiring extra line breaks. Writing content on multiple lines can also produce new expected <code>&lt;p&gt;</code> tags.</p>\n<div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>visual difference</div><div class=\"admonitionContent_Knsx\"><p>See how this content is rendered differently by MDX v1 and v3.</p><div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">example.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\">Some </span><span class=\"token bold punctuation\" style=\"color:#393A34\">**</span><span class=\"token bold content\">Markdown</span><span class=\"token bold punctuation\" style=\"color:#393A34\">**</span><span class=\"token plain\"> content</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  Some </span><span class=\"token bold punctuation\" style=\"color:#393A34\">**</span><span class=\"token bold content\">Markdown</span><span class=\"token bold punctuation\" style=\"color:#393A34\">**</span><span class=\"token plain\"> content</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><br></span></code></pre></div></div><div class=\"language-html codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">MDX v1 output</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-html codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\">Some **Markdown** content</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\">Some **Markdown** content</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><br></span></code></pre></div></div><div class=\"language-html codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">MDX v3 output</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-html codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\">Some </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">strong</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\">Markdown</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">strong</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> content</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">p</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\">Some </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">strong</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\">Markdown</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">strong</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> content</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">p</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag\" style=\"color:#22863A\">div</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><br></span></code></pre></div></div></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>If you don't want an extra <code>&lt;p&gt;</code> tag, refactor content on a case by case basis to use a single-line JSX tag.</p><div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">&lt;figure&gt;</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  &lt;img src=\"/img/myImage.png\" alt=\"My alt\" /&gt;</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">  &lt;figcaption&gt;</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    My image caption</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">  &lt;/figcaption&gt;</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">  &lt;figcaption&gt;My image caption&lt;/figcaption&gt;</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">&lt;/figure&gt;</span><br></span></code></pre></div></div><p>If your content contains \"Markdown inlines\" (<code>**</code>, <code>*</code>, <code>_</code>, <code>[link](/path)</code>), you might not be able to refactor it ahead of time, and will have to do it alongside the Docusaurus v3 upgrade.</p></div></div>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"unintended-usage-of-directives\">Unintended usage of directives<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#unintended-usage-of-directives\" class=\"hash-link\" aria-label=\"Direct link to Unintended usage of directives\" title=\"Direct link to Unintended usage of directives\">​</a></h4>\n<p>Docusaurus v3 now uses <a href=\"https://talk.commonmark.org/t/generic-directives-plugins-syntax/444\" target=\"_blank\" rel=\"noopener noreferrer\">Markdown Directives</a> (implemented with <a href=\"https://github.com/remarkjs/remark-directive\" target=\"_blank\" rel=\"noopener noreferrer\">remark-directive</a>) as a generic way to provide support for admonitions, and other upcoming Docusaurus features.</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">example.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">This is a :textDirective</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">::leafDirective</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">:::containerDirective</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">Container directive content</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">:::</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Visual change</div><div class=\"admonitionContent_Knsx\"><p>Directives are parsed with the purpose of being handled by other Remark plugins. Unhandled directives will be ignored, and won't be rendered back in their original form.</p><div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">example.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">The AWS re:Invent conf is great</span><br></span></code></pre></div></div><p>Due to <code>:Invent</code> being parsed as a text directive, this will now be rendered as:</p><div class=\"language-text codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">The AWS re</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">conf is great</span><br></span></code></pre></div></div></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><ul>\n<li>Use the HTML code: <code>&amp;#58;</code></li>\n<li>Add a space after <code>:</code> (if it makes sense): <code>: text</code></li>\n<li>Escape it: <code>\\:</code> (unfortunately the <code>\\</code> will be displayed under MDX v1)</li>\n</ul></div></div>\n<h4 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"unsupported-indented-code-blocks\">Unsupported indented code blocks<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#unsupported-indented-code-blocks\" class=\"hash-link\" aria-label=\"Direct link to Unsupported indented code blocks\" title=\"Direct link to Unsupported indented code blocks\">​</a></h4>\n<p>MDX does not transform indented text as code blocks anymore.</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">example.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    console.log(\"hello\");</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Visual change</div><div class=\"admonitionContent_Knsx\"><p>The upgrade does not generally produce new MDX compilation errors, but can lead to content being rendered in an unexpected way because there isn't a code block anymore.</p></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>Use the regular code block syntax instead of indentation:</p><div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">example.md</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code punctuation\" style=\"color:#393A34\">```</span><span class=\"token code code-language\">js</span><span class=\"token code\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code\"></span><span class=\"token code code-block language-js\">console.log('hello');</span><span class=\"token code\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code\"></span><span class=\"token code punctuation\" style=\"color:#393A34\">```</span><br></span></code></pre></div></div></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"mdx-plugins\">MDX plugins<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#mdx-plugins\" class=\"hash-link\" aria-label=\"Direct link to MDX plugins\" title=\"Direct link to MDX plugins\">​</a></h3>\n<p>All the official packages (Unified, Remark, Rehype...) in the MDX ecosystem are now <a href=\"https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>ES Modules only</strong></a> and do not support <a href=\"https://nodejs.org/api/modules.html#modules-commonjs-modules\" target=\"_blank\" rel=\"noopener noreferrer\">CommonJS</a> anymore.</p>\n<p>In practice this means that you can't do <code>require(\"remark-plugin\")</code> anymore.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>Docusaurus v3 now supports <a href=\"https://flaviocopes.com/es-modules/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>ES Modules</strong></a> configuration files. We recommend that you migrate your config file to ES module, that enables you to import the Remark plugins easily:</p><div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword module\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token imports\">remarkPlugin</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'remark-plugin'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">title</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'Docusaurus'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* site config using remark plugins here */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div><p>If you want to keep using CommonJS modules, you can use dynamic imports as a workaround that enables you to import ES modules inside a CommonJS module. Fortunately, the <a href=\"https://coinsgpt.github.io/docs/configuration#syntax-to-declare-docusaurus-config\">Docusaurus config supports the usage of an async function</a> to let you do so.</p><div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">module</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token method-variable function-variable method function property-access\" style=\"color:#8250DF\">exports</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">function</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> myPlugin </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token keyword control-flow\" style=\"color:#CF222E\">await</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"color:#CF222E\">import</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token string\" style=\"color:#C6105F\">'remark-plugin'</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token keyword module\" style=\"color:#CF222E\">default</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// site config...</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div></div></div>\n<div class=\"theme-admonition theme-admonition-info admonition_o5H7 alert alert--info\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>For plugin authors</div><div class=\"admonitionContent_Knsx\"><p>If you created custom Remark or Rehype plugins, you may need to refactor those, or eventually rewrite them completely, due to how the new AST is structured. We have created a <a href=\"https://github.com/facebook/docusaurus/discussions/9337\" target=\"_blank\" rel=\"noopener noreferrer\">dedicated support discussion</a> to help plugin authors upgrade their code.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-breaking-changes\">Other breaking changes<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#other-breaking-changes\" class=\"hash-link\" aria-label=\"Direct link to Other breaking changes\" title=\"Direct link to Other breaking changes\">​</a></h2>\n<p>Apart from MDX, there are other breaking changes that you can already prepare your site for, notably major version upgrades of important dependencies.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"nodejs-180\">Node.js 18.0<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#nodejs-180\" class=\"hash-link\" aria-label=\"Direct link to Node.js 18.0\" title=\"Direct link to Node.js 18.0\">​</a></h3>\n<p>Node.js 16 <a href=\"https://nodejs.org/en/blog/announcements/nodejs16-eol\" target=\"_blank\" rel=\"noopener noreferrer\">reached End-of-Life</a>, and Docusaurus v3 now requires <strong>Node.js &gt;= 18.0</strong>.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>Upgrade your Docusaurus v2 site to Node.js 18 before upgrading to Docusaurus v3.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"react-180\">React 18.0<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#react-180\" class=\"hash-link\" aria-label=\"Direct link to React 18.0\" title=\"Direct link to React 18.0\">​</a></h3>\n<p>Docusaurus v3 now requires <strong>React &gt;= 18.0</strong>.</p>\n<p>React 18 comes with its own breaking changes that should be relatively easy to handle, depending on the amount of custom React code you created for your site.</p>\n<p>Simple Docusaurus sites that only use our official theme code without swizzling do not have anything to do.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>Read the official <a href=\"https://react.dev/blog/2022/03/29/react-v18\" target=\"_blank\" rel=\"noopener noreferrer\">React v18.0</a> and <a href=\"https://react.dev/blog/2022/03/08/react-18-upgrade-guide\" target=\"_blank\" rel=\"noopener noreferrer\">How to Upgrade to React 18</a>, and look at your first-party React code to figure out which components might be affected this React 18 upgrade.</p><p>We recommend to particularly look for:</p><ul>\n<li>Automatic batching for stateful components</li>\n<li>New React hydration errors reported to the console</li>\n</ul></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"typescript-50\">TypeScript 5.0<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#typescript-50\" class=\"hash-link\" aria-label=\"Direct link to TypeScript 5.0\" title=\"Direct link to TypeScript 5.0\">​</a></h3>\n<p>Docusaurus v3 now requires <strong>TypeScript &gt;= 5.0</strong>.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>Upgrade your Docusaurus v2 site to TypeScript 5 before upgrading to Docusaurus v3.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"typescript-base-config\">TypeScript base config<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#typescript-base-config\" class=\"hash-link\" aria-label=\"Direct link to TypeScript base config\" title=\"Direct link to TypeScript base config\">​</a></h3>\n<p>The official Docusaurus TypeScript config has been re-internalized from the external package <a href=\"https://www.npmjs.com/package/@tsconfig/docusaurus\" target=\"_blank\" rel=\"noopener noreferrer\"><code>@tsconfig/docusaurus</code></a> to our new monorepo package <a href=\"https://www.npmjs.com/package/@docusaurus/tsconfig\" target=\"_blank\" rel=\"noopener noreferrer\"><code>@docusaurus/tsconfig</code></a>.</p>\n<p>This new package is versioned alongside all the other Docusaurus core packages, and will be used to ensure TypeScript retro-compatibility and breaking changes on major version upgrades.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>The new Docusaurus v3 TypeScript config is sensibly the same as the former Docusaurus v2 TypeScript config. If you upgraded to TypeScript 5, using the Docusaurus v3 config on a v2 site is already possible:</p><div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">package.json</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">{</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  \"devDependencies\": {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@tsconfig/docusaurus\": \"^1.0.7\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@docusaurus/tsconfig\": \"^3.0.0-beta.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  }</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">}</span><br></span></code></pre></div></div><div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">tsconfig.json</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">{</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">  \"extends\": \"@tsconfig/docusaurus/tsconfig.json\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">  \"extends\": \"@docusaurus/tsconfig\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  \"compilerOptions\": {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    \"baseUrl\": \".\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  }</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">}</span><br></span></code></pre></div></div></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"admonition-warning\">Admonition warning<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#admonition-warning\" class=\"hash-link\" aria-label=\"Direct link to Admonition warning\" title=\"Direct link to Admonition warning\">​</a></h3>\n<p>For historical reasons, we support an undocumented admonition <code>:::warning</code> that renders with a red color.</p>\n<div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Warning</div><div class=\"admonitionContent_Knsx\"><p>This is a Docusaurus v2 <code>:::warning</code> admonition.</p></div></div>\n<p>However, the color and icon is historically wrong. Docusaurus v3 re-introduces <code>:::warning</code> admonition officially, documents it, and fix the color and icon.</p>\n<div class=\"theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>warning</div><div class=\"admonitionContent_Knsx\"><p>This is a Docusaurus v3 <code>:::warning</code> admonition.</p></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>If you previously used the undocumented <code>:::warning</code> admonition, make sure to verify for each usage if yellow is now an appropriate color. If you want to keep the red color, use <code>:::danger</code> instead.</p><p>Docusaurus v3 also <a href=\"https://github.com/facebook/docusaurus/pull/9308\" target=\"_blank\" rel=\"noopener noreferrer\">deprecated the <code>:::caution</code></a> admonition. Please refactor <code>:::caution</code> (yellow) to either <code>:::warning</code> (yellow) or <code>:::danger</code> (red).</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"versioned-sidebars\">Versioned sidebars<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#versioned-sidebars\" class=\"hash-link\" aria-label=\"Direct link to Versioned sidebars\" title=\"Direct link to Versioned sidebars\">​</a></h3>\n<p>This breaking change will only affect <strong>Docusaurus v2 early adopters</strong> who versioned their docs before <code>v2.0.0-beta.10</code> (December 2021).</p>\n<p>When creating version <code>v1.0.0</code>, the sidebar file contained a prefix <code>version-v1.0.0/</code> that <a href=\"https://github.com/facebook/docusaurus/pull/9310\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus v3 does not support anymore</a>.</p>\n<div class=\"language-json codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">versioned_sidebars/version-v1.0.0-sidebars.json</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token property\" style=\"color:#005CC5\">\"version-v1.0.0/docs\"</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:#C6105F\">\"version-v1.0.0/introduction\"</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:#C6105F\">\"version-v1.0.0/prerequisites\"</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>How to prepare</div><div class=\"admonitionContent_Knsx\"><p>Your Docusaurus v2 site is able to handle the 2 sidebar formats similarly.</p><p>You can remove the useless versioned prefix from your versioned sidebars.</p><div class=\"language-json codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">versioned_sidebars/version-v1.0.0-sidebars.json</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token property\" style=\"color:#005CC5\">\"docs\"</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token string\" style=\"color:#C6105F\">\"introduction\"</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">\"prerequisites\"</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></span></code></pre></div></div></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"try-docusaurus-v3-today\">Try Docusaurus v3 today<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#try-docusaurus-v3-today\" class=\"hash-link\" aria-label=\"Direct link to Try Docusaurus v3 today\" title=\"Direct link to Try Docusaurus v3 today\">​</a></h2>\n<p>Docusaurus v3 is now <a href=\"https://github.com/facebook/docusaurus/discussions/9312\" target=\"_blank\" rel=\"noopener noreferrer\">in beta</a>, and already used in production by <a href=\"https://reactnative.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">React-Native</a>, <a href=\"https://jestjs.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Jest</a>, and <a href=\"https://docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\">our own website</a>.</p>\n<p>We think this new Docusaurus version is <strong>robust and ready to be deployed in production</strong>. It should be released officially soon, after receiving a positive feedback from early adopters of our community.</p>\n<p>We would really appreciate it if you try upgrading and report issues on the <a href=\"https://github.com/facebook/docusaurus/discussions/9312\" target=\"_blank\" rel=\"noopener noreferrer\">3.0.0-beta.0 release discussion thread</a>.</p>\n<p>For most sites, the upgrade should be easy. If you prepared your site ahead of time as documented here, upgrading the following dependencies should be enough:</p>\n<div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">package.json</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">{</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  \"dependencies\": {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@docusaurus/core\": \"2.4.3\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@docusaurus/preset-classic\": \"2.4.3\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@mdx-js/react\": \"^1.6.22\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@docusaurus/core\": \"3.0.0-beta.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@docusaurus/preset-classic\": \"3.0.0-beta.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@mdx-js/react\": \"^3.0.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    \"clsx\": \"^2.0.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    \"prism-react-renderer\": \"^1.3.5\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"react\": \"^17.0.2\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"react-dom\": \"^17.0.2\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"react\": \"^18.2.0\",</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"react-dom\": \"^18.2.0\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  },</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  \"devDependencies\": {</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\">    \"@docusaurus/module-type-aliases\": \"2.4.3\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\">    \"@docusaurus/module-type-aliases\": \"3.0.0-beta.0\"</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">  }</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">}</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"ask-for-help\">Ask for help<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#ask-for-help\" class=\"hash-link\" aria-label=\"Direct link to Ask for help\" title=\"Direct link to Ask for help\">​</a></h2>\n<p>We will be there to help you upgrade through the following support channels:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/discussions/9336\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus v3 - Upgrade Support</a></li>\n<li><a href=\"https://discord.com/channels/398180168688074762/1154771869094912090\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus v3 - Discord channel #migration-v2-to-v3</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/discussions/9053\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v3 - Upgrade Support</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/discussions/9337\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v3 - Remark/Rehype Plugins Support</a></li>\n<li><a href=\"https://discord.com/channels/398180168688074762/1116724556976111616\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v3 - Discord channel #migration-mdx-v3</a></li>\n</ul>\n<p>Alternatively, you can look for a paid <a href=\"https://github.com/facebook/docusaurus/discussions/9281\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus Service Provider</a> to execute this upgrade for you. If your site is open source, you can also ask our community for <a href=\"https://github.com/facebook/docusaurus/discussions/9283\" target=\"_blank\" rel=\"noopener noreferrer\">free, benevolent help</a>.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"conclusion\">Conclusion<a href=\"https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>Docusaurus v3 is ready to try, and will be released soon. This article already gives you a good idea of all the major changes required to upgrade.</p>\n<p>The initial 3.0 release is focusing on dependency and infrastructure upgrades that will permit us to implement new exciting features. It also comes with a few useful features that we will detail in the final release notes.</p>",
            "url": "https://coinsgpt.github.io/blog/preparing-your-site-for-docusaurus-v3",
            "title": "Preparing your site for Docusaurus v3",
            "summary": "This blog post was written when Docusaurus v3 was in beta. There are some changes in dependency versions and upgrade steps you should be aware of if upgrading to Docusaurus v3 current stable releases. Use the upgrade guide for the most up-to-date migration steps.",
            "date_modified": "2023-09-29T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Maintenance"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing",
            "content_html": "<p>Frontend developers often need to <strong>upgrade npm dependencies</strong>, but those upgrades can feel scary and lead to <strong>subtle UI side effects</strong> not caught by your regular test suite.</p>\n<p>Upgrading Docusaurus is a good example: without reviewing all the pages one by one, it's hard to be sure there's no visual regression. <strong>Docusaurus v3 is around the corner</strong> (currently in <a href=\"https://github.com/facebook/docusaurus/discussions/9312\" target=\"_blank\" rel=\"noopener noreferrer\">beta</a>), and we would like to help you do this upgrade with confidence.</p>\n<p>This article introduces a <strong>visual regression testing</strong> workflow based on <a href=\"https://github.com/features/actions\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>GitHub Actions</strong></a>, <a href=\"https://playwright.dev/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Playwright</strong></a>, and <a href=\"https://argos-ci.com/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Argos</strong></a>. It is not directly coupled to Docusaurus or React, and can be adapted to work with other frontend applications and frameworks.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Upgrading frontend dependencies with confidence - social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-0662a6f419d0032829f99915ccf8918b.png\" width=\"1500\" height=\"785\" class=\"img_vXGZ\"></p>\n<p>This workflow has been tested while upgrading Docusaurus v2 to v3, and already helped catch a few visual regressions on sites such as <a href=\"https://reactnative.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">React Native</a>, <a href=\"https://jestjs.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Jest</a>, and the <a href=\"https://docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus</a> site itself.</p>\n<p>Docusaurus v3 comes with infrastructure changes and major dependency upgrades such as <a href=\"https://mdxjs.com/blog/v3/\" target=\"_blank\" rel=\"noopener noreferrer\">MDX v3</a> and <a href=\"https://react.dev/blog/2022/03/29/react-v18\" target=\"_blank\" rel=\"noopener noreferrer\">React 18</a>, which can produce unexpected side effects. It would have been difficult to notice all the visual regressions without such a workflow. That's why we encourage site owners to consider adopting visual regression testing, especially for highly customized sites.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"workflow-overview\">Workflow overview<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#workflow-overview\" class=\"hash-link\" aria-label=\"Direct link to Workflow overview\" title=\"Direct link to Workflow overview\">​</a></h2>\n<p>The general idea is pretty simple:</p>\n<ul>\n<li>Build your site in CI with <a href=\"https://github.com/features/actions\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Actions</a></li>\n<li>Take screenshots of all <code>sitemap.xml</code> pages with <a href=\"https://playwright.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Playwright</a></li>\n<li>Upload them to <a href=\"https://argos-ci.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Argos</a></li>\n<li>Do this for both Git branches <code>main</code> and <code>pr-branch</code></li>\n<li>Compare the screenshots side-by-side in <a href=\"https://argos-ci.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Argos</a></li>\n</ul>\n<p>Argos will then <strong>report visual differences</strong> found between <code>main</code> and <code>pr-branch</code> as a GitHub commit status and pull-request comment. This can help you detect visual regressions ahead of time in an automated way.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Argos GitHub commit status\" src=\"https://coinsgpt.github.io/assets/images/argos-github-status-05e8264c59fa4f8a21292f59665edf3d.png\" width=\"978\" height=\"375\" class=\"img_vXGZ\"></p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Argos GitHub PR comment\" src=\"https://coinsgpt.github.io/assets/images/argos-github-comment-8b62a1561b13881608d5c9f8a8f833a5.png\" width=\"982\" height=\"303\" class=\"img_vXGZ\"></p>\n<p>Argos creates a report referencing all the visual differences found while comparing the 2 Git branches sites side-by-side, and provides a convenient UX to easily spot the difference.</p>\n<p>Check the <a href=\"https://app.argos-ci.com/meta-open-source/docusaurus\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus Argos page</a> to explore our own website reports.</p>\n<p>Here is a more concrete example of Argos <a href=\"https://app.argos-ci.com/slorber/rnw-visual-tests/builds/32/56012838\" target=\"_blank\" rel=\"noopener noreferrer\">reporting a visual regression</a> found while upgrading the React-Native website:</p>\n<p><a href=\"https://app.argos-ci.com/slorber/rnw-visual-tests/builds/32/56012838\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"Argos GitHub PR comment\" src=\"https://coinsgpt.github.io/assets/images/argos-react-native-regression-216ace77baedfaf873a770112ec817ac.png\" width=\"1959\" height=\"979\" class=\"img_vXGZ\"></a></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"workflow-implementation\">Workflow implementation<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#workflow-implementation\" class=\"hash-link\" aria-label=\"Direct link to Workflow implementation\" title=\"Direct link to Workflow implementation\">​</a></h2>\n<p>This section will describe the implementation details of each step of the workflow.</p>\n<p>You will need to <a href=\"https://app.argos-ci.com/signup\" target=\"_blank\" rel=\"noopener noreferrer\">sign up to Argos</a> and <a href=\"https://argos-ci.com/docs/github\" target=\"_blank\" rel=\"noopener noreferrer\">connect Argos to your GitHub repository</a></p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"dependencies\">Dependencies<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#dependencies\" class=\"hash-link\" aria-label=\"Direct link to Dependencies\" title=\"Direct link to Dependencies\">​</a></h3>\n<p>This workflow requires the following dev dependencies, in addition to the usual Docusaurus ones:</p>\n<div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#8250DF\">yarn</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">add</span><span class=\"token plain\"> </span><span class=\"token parameter variable\" style=\"color:#E36209\">-D</span><span class=\"token plain\"> @argos-ci/cli @argos-ci/playwright @playwright/test cheerio</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"github-action\">GitHub Action<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#github-action\" class=\"hash-link\" aria-label=\"Direct link to GitHub Action\" title=\"Direct link to GitHub Action\">​</a></h3>\n<p>The GitHub action is responsible for executing the workflow for each Git branch.</p>\n<p>A minimal workflow could look like:</p>\n<div class=\"language-yaml codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">.github/workflows/argos.yml</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Argos CI Screenshots</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#22863A\">on</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">push</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">branches</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">main</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">pull_request</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">branches</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">main</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#22863A\">jobs</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">take-screenshots</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">runs-on</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> ubuntu</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">latest</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">steps</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Check out repository code</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:#22863A\">uses</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> actions/checkout@v4</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Use Node.js</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:#22863A\">uses</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> actions/setup</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">node@v3</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:#22863A\">with</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token key atrule\" style=\"color:#22863A\">node-version</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> current</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Install dependencies</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:#22863A\">run</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> yarn install </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">frozen</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">lockfile</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Install Playwright browsers</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:#22863A\">run</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> yarn playwright install </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">with</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">deps chromium</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Build the website</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:#22863A\">run</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> yarn docusaurus build</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Take screenshots with Playwright</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:#22863A\">run</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> yarn playwright test</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Upload screenshots to Argos</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token key atrule\" style=\"color:#22863A\">run</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> yarn argos upload ./screenshots</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"playwright-config\">Playwright config<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#playwright-config\" class=\"hash-link\" aria-label=\"Direct link to Playwright config\" title=\"Direct link to Playwright config\">​</a></h3>\n<p>Playwright is responsible for taking screenshots of the website previously built locally by the GitHub action.</p>\n<p>A minimal <a href=\"https://playwright.dev/docs/test-configuration\" target=\"_blank\" rel=\"noopener noreferrer\">Playwright config</a> could look like:</p>\n<div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">playwright.config.ts</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">devices</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@playwright/test'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">type</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">PlaywrightTestConfig</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@playwright/test'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> config</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> PlaywrightTestConfig </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  webServer</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    port</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#005CC5\">3000</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    command</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'yarn docusaurus serve'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  projects</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      name</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'chromium'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      use</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:#D73A49\">...</span><span class=\"token plain\">devices</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token string\" style=\"color:#C6105F\">'Desktop Chrome'</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">default</span><span class=\"token plain\"> config</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"playwright-test\">Playwright test<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#playwright-test\" class=\"hash-link\" aria-label=\"Direct link to Playwright test\" title=\"Direct link to Playwright test\">​</a></h3>\n<p>A Playwright config is not enough: we also need to write a Playwright test file to generate the site screenshots.</p>\n<div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">screenshot.spec.ts</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">*</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">as</span><span class=\"token plain\"> fs </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'fs'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">test</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@playwright/test'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">argosScreenshot</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'@argos-ci/playwright'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">extractSitemapPathnames</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> pathnameToArgosName</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'./utils'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Constants</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> siteUrl </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'http://localhost:3000'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> sitemapPath </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'./build/sitemap.xml'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> stylesheetPath </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'./screenshot.css'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> stylesheet </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> fs</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">readFileSync</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">stylesheetPath</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">toString</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Wait for hydration, requires Docusaurus v2.4.3+</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Docusaurus adds a &lt;html data-has-hydrated=\"true\"&gt; once hydrated</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// See https://github.com/facebook/docusaurus/pull/9256</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">waitForDocusaurusHydration</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> document</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token plain\">documentElement</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token plain\">dataset</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token plain\">hasHydrated </span><span class=\"token operator\" style=\"color:#D73A49\">===</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'true'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">screenshotPathname</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">pathname</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\">string</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:#8250DF\">test</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token template-string template-punctuation string\" style=\"color:#C6105F\">`</span><span class=\"token template-string string\" style=\"color:#C6105F\">pathname </span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:#393A34\">${</span><span class=\"token template-string interpolation\">pathname</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:#393A34\">}</span><span class=\"token template-string template-punctuation string\" style=\"color:#C6105F\">`</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">page</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> url </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> siteUrl </span><span class=\"token operator\" style=\"color:#D73A49\">+</span><span class=\"token plain\"> pathname</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#CF222E\">await</span><span class=\"token plain\"> page</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">goto</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">url</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#CF222E\">await</span><span class=\"token plain\"> page</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">waitForFunction</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">waitForDocusaurusHydration</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#CF222E\">await</span><span class=\"token plain\"> page</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">addStyleTag</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">content</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> stylesheet</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#CF222E\">await</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">argosScreenshot</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">page</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">pathnameToArgosName</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">test</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">describe</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token string\" style=\"color:#C6105F\">'Docusaurus site screenshots'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> pathnames </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">extractSitemapPathnames</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">sitemapPath</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token builtin\">console</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">log</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token string\" style=\"color:#C6105F\">'Pathnames to screenshot:'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> pathnames</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  pathnames</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">forEach</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">screenshotPathname</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<details class=\"details_Nokh alert alert--info details_Cn_P\" data-collapsed=\"true\"><summary>Why do we take screenshots with Argos instead of Playwright?</summary><div><div class=\"collapsibleContent_EoA1\"><p>Argos has a <a href=\"https://argos-ci.com/docs/playwright\" target=\"_blank\" rel=\"noopener noreferrer\">Playwright integration</a> that wraps the original Playwright screenshot API and provides better defaults to make screenshots more deterministic.</p></div></div></details>\n<details class=\"details_Nokh alert alert--info details_Cn_P\" data-collapsed=\"true\"><summary>What's inside <code>utils.ts</code>?</summary><div><div class=\"collapsibleContent_EoA1\"><p>This module contains implementation details that we choose to hide for clarity.</p><div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">*</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">as</span><span class=\"token plain\"> cheerio </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'cheerio'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">import</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">*</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">as</span><span class=\"token plain\"> fs </span><span class=\"token keyword\" style=\"color:#CF222E\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'fs'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Extract a list of pathnames, given a fs path to a sitemap.xml file</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Docusaurus generates a build/sitemap.xml file for you!</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">extractSitemapPathnames</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">sitemapPath</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\">string</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\">string</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> sitemap </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> fs</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">readFileSync</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">sitemapPath</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">toString</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> $ </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> cheerio</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">load</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">sitemap</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">xmlMode</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> urls</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\">string</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:#8250DF\">$</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token string\" style=\"color:#C6105F\">'loc'</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">each</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token keyword\" style=\"color:#CF222E\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">handleLoc</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    urls</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">push</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token function\" style=\"color:#8250DF\">$</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token keyword\" style=\"color:#CF222E\">this</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">text</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> urls</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">map</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">url</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">new</span><span class=\"token plain\"> </span><span class=\"token class-name constant\" style=\"color:#005CC5\">URL</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">url</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// Converts a pathname to a decent screenshot name</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#CF222E\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">pathnameToArgosName</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">pathname</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\">string</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\">string</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> pathname</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">replace</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token regex regex-delimiter\" style=\"color:#36acaa\">/</span><span class=\"token regex regex-source language-regex anchor function\" style=\"color:#8250DF\">^</span><span class=\"token regex regex-source language-regex escape\" style=\"color:#36acaa\">\\/</span><span class=\"token regex regex-source language-regex alternation keyword\" style=\"color:#CF222E\">|</span><span class=\"token regex regex-source language-regex escape\" style=\"color:#36acaa\">\\/</span><span class=\"token regex regex-source language-regex anchor function\" style=\"color:#8250DF\">$</span><span class=\"token regex regex-delimiter\" style=\"color:#36acaa\">/</span><span class=\"token regex regex-flags\" style=\"color:#36acaa\">g</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">''</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">||</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'index'</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></span></code></pre></div></div></div></div></details>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"stylesheet\">Stylesheet<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#stylesheet\" class=\"hash-link\" aria-label=\"Direct link to Stylesheet\" title=\"Direct link to Stylesheet\">​</a></h3>\n<p>Screenshots are not always deterministic, and taking a screenshot of a page twice can lead to subtle variations that will be reported by Argos as <strong>false positive</strong> visual regressions.</p>\n<p>For this reason, we recommend injecting an extra stylesheet to hide the problematic elements. You will probably need to add new CSS rules to this base stylesheet, according to flaky elements found on your own site. Read <a href=\"https://argos-ci.com/docs/about-flaky\" target=\"_blank\" rel=\"noopener noreferrer\">Argos - About flaky tests docs</a> for details.</p>\n<div class=\"language-css codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">screenshot.css</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* Iframes can load lazily */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">iframe</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* Avatars can be flaky due to using external sources: GitHub/Unavatar */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">.avatar__photo</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* Gifs load lazily and are animated */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">img[src$=</span><span class=\"token string\" style=\"color:#C6105F\">'.gif'</span><span class=\"token plain\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* Algolia keyboard shortcuts appear with a little delay */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">.DocSearch-Button-Keys &gt; kbd</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* The live playground preview can often display dates/counters */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token selector attribute punctuation\" style=\"color:#393A34\">[</span><span class=\"token selector attribute attr-name\" style=\"color:#0550AE\">class</span><span class=\"token selector attribute operator\" style=\"color:#D73A49\">*=</span><span class=\"token selector attribute attr-value\" style=\"color:#C6105F\">'playgroundPreview'</span><span class=\"token selector attribute punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token property\" style=\"color:#005CC5\">visibility</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> hidden</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* Different docs last-update dates can alter layout */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">.theme-last-updated</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">/* Mermaid diagrams are rendered client-side and produce layout shifts */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token selector class\" style=\"color:#6F42C1\">.docusaurus-mermaid-container</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token property\" style=\"color:#005CC5\">display</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> none</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>prevent layout shifts</div><div class=\"admonitionContent_Knsx\"><p>We recommend hiding flaky UI elements affecting layout with <code>display: none;</code>.</p><p>For example, the docs \"Last Updated on\" might render on more than 1 line, eventually \"pushing\" the rest of your content further down, leading to Argos detecting many different pixels.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"example-repository\">Example repository<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#example-repository\" class=\"hash-link\" aria-label=\"Direct link to Example repository\" title=\"Direct link to Example repository\">​</a></h2>\n<p>The <a href=\"https://github.com/slorber/docusaurus-argos-example\" target=\"_blank\" rel=\"noopener noreferrer\">slorber/docusaurus-argos-example</a> repo shows a complete example of implementing this workflow on a newly initialized Docusaurus v2 site, using a Yarn monorepo.</p>\n<p><a href=\"https://github.com/slorber/docusaurus-argos-example\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus + Argos monorepo example screenshot\" src=\"https://coinsgpt.github.io/assets/images/docusaurus-argos-example-repo-screenshot-a56583e16aa02c7fa96c592f1339928f.png\" width=\"767\" height=\"427\" class=\"img_vXGZ\"></a></p>\n<p>Relevant pull-requests:</p>\n<ul>\n<li><a href=\"https://github.com/slorber/docusaurus-argos-example/pull/1\" target=\"_blank\" rel=\"noopener noreferrer\">PR - Set up GitHub Action + Playwright + Argos</a>: implements the minimal workflow described above</li>\n<li><a href=\"https://github.com/slorber/docusaurus-argos-example/pull/2\" target=\"_blank\" rel=\"noopener noreferrer\">PR - Upgrading Docusaurus from v2 to v3</a>: shows how Argos caught 3 visual regressions while upgrading</li>\n</ul>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>More advanced example?</div><div class=\"admonitionContent_Knsx\"><p>Browse the Docusaurus repository for a more advanced integration:</p><ul>\n<li><a href=\"https://github.com/facebook/docusaurus/blob/main/.github/workflows/argos.yml\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Action</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/tree/main/argos\" target=\"_blank\" rel=\"noopener noreferrer\">Playwright + Argos tests</a></li>\n</ul></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"make-it-cheap\">Make it cheap<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#make-it-cheap\" class=\"hash-link\" aria-label=\"Direct link to Make it cheap\" title=\"Direct link to Make it cheap\">​</a></h2>\n<p>The tools we choose are implementation details of this visual regression testing workflow.</p>\n<p>For Docusaurus, we choose <a href=\"https://argos-ci.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Argos</a>: it works well for us, and offers <a href=\"https://argos-ci.com/pricing\" target=\"_blank\" rel=\"noopener noreferrer\">free</a> and <a href=\"https://argos-ci.com/docs/open-source\" target=\"_blank\" rel=\"noopener noreferrer\">open source</a> plans. However, you are free to adopt alternative tools.</p>\n<p>In case you don't mind storing large screenshots in Git, you can also try the free, self-hosted <a href=\"https://playwright.dev/docs/test-snapshots\" target=\"_blank\" rel=\"noopener noreferrer\">Playwright Visual Comparisons</a> and browse visual differences with <code>npx playwright show-report</code>. However, we found using a dedicated external tool is more convenient.</p>\n<p>External tools can be expensive, but generally offer free plans with an ample quota of screenshots. You can reduce your screenshot consumption by implementing a few tricks below.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"limit-the-number-of-pathnames\">Limit the number of pathnames<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#limit-the-number-of-pathnames\" class=\"hash-link\" aria-label=\"Direct link to Limit the number of pathnames\" title=\"Direct link to Limit the number of pathnames\">​</a></h3>\n<p>The base setup involves taking a screenshot of every single pathname found in <code>sitemap.xml</code>. For large sites, that can lead to a lot of screenshots.</p>\n<p>You can decide to filter the pathnames to only take screenshots of the most critical pages.</p>\n<p>For the Docusaurus website, do not take screenshots for versioned docs pages:</p>\n<div class=\"language-ts codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">screenshot.spec.ts</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">isVersionedDocsPathname</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">pathname</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\">string</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\">boolean</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> pathname</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">match</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token regex regex-delimiter\" style=\"color:#36acaa\">/</span><span class=\"token regex regex-source language-regex anchor function\" style=\"color:#8250DF\">^</span><span class=\"token regex regex-source language-regex escape\" style=\"color:#36acaa\">\\/</span><span class=\"token regex regex-source language-regex\" style=\"color:#36acaa\">docs</span><span class=\"token regex regex-source language-regex escape\" style=\"color:#36acaa\">\\/</span><span class=\"token regex regex-source language-regex group punctuation\" style=\"color:#393A34\">(</span><span class=\"token regex regex-source language-regex group punctuation\" style=\"color:#393A34\">(</span><span class=\"token regex regex-source language-regex char-set class-name\" style=\"color:#116329\">\\d</span><span class=\"token regex regex-source language-regex special-escape escape\" style=\"color:#36acaa\">\\.</span><span class=\"token regex regex-source language-regex char-set class-name\" style=\"color:#116329\">\\d</span><span class=\"token regex regex-source language-regex special-escape escape\" style=\"color:#36acaa\">\\.</span><span class=\"token regex regex-source language-regex char-set class-name\" style=\"color:#116329\">\\d</span><span class=\"token regex regex-source language-regex group punctuation\" style=\"color:#393A34\">)</span><span class=\"token regex regex-source language-regex alternation keyword\" style=\"color:#CF222E\">|</span><span class=\"token regex regex-source language-regex group punctuation\" style=\"color:#393A34\">(</span><span class=\"token regex regex-source language-regex\" style=\"color:#36acaa\">next</span><span class=\"token regex regex-source language-regex group punctuation\" style=\"color:#393A34\">)</span><span class=\"token regex regex-source language-regex group punctuation\" style=\"color:#393A34\">)</span><span class=\"token regex regex-source language-regex escape\" style=\"color:#36acaa\">\\/</span><span class=\"token regex regex-delimiter\" style=\"color:#36acaa\">/</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">test</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">describe</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token string\" style=\"color:#C6105F\">'Docusaurus site screenshots'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> pathnames </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">extractSitemapPathnames</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">sitemapPath</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">filter</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">isVersionedDocsPathname</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  pathnames</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#8250DF\">forEach</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">screenshotPathname</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"limit-the-workflow-concurrency\">Limit the workflow concurrency<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#limit-the-workflow-concurrency\" class=\"hash-link\" aria-label=\"Direct link to Limit the workflow concurrency\" title=\"Direct link to Limit the workflow concurrency\">​</a></h3>\n<p>Implementing <a href=\"https://docs.github.com/en/actions/using-jobs/using-concurrency\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Actions concurrency groups</a> will prevent successive commits to trigger multiple useless workflow runs. The workflow will only be executed for the last commit, and previous commits will be canceled automatically.</p>\n<div class=\"language-yaml codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">.github/workflows/argos.yml</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token key atrule\" style=\"color:#22863A\">concurrency</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">group</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> $</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"> github.workflow </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">$</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"> github.head_ref </span><span class=\"token punctuation\" style=\"color:#393A34\">|</span><span class=\"token punctuation\" style=\"color:#393A34\">|</span><span class=\"token plain\"> github.run_id </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">cancel-in-progress</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token boolean important\" style=\"color:#005CC5\">true</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"run-your-workflow-conditionally\">Run your workflow conditionally<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#run-your-workflow-conditionally\" class=\"hash-link\" aria-label=\"Direct link to Run your workflow conditionally\" title=\"Direct link to Run your workflow conditionally\">​</a></h3>\n<p>It's not worth running this workflow for every single commit and pull-request.</p>\n<p>For example, if someone corrects a typo in your documentation, you probably don't want to take hundreds of screenshots and have Argos to point out that only the modified page has a visual difference: duh, that's a bit expected!</p>\n<p>For the Docusaurus website, we only run the workflow for pull-request having the <code>Argos</code> label:</p>\n<div class=\"language-yaml codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">.github/workflows/argos.yml</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token key atrule\" style=\"color:#22863A\">name</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> Argos CI Screenshots</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#22863A\">on</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">push</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">branches</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">main</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">pull_request</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">branches</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">main</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">types</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> opened</span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> synchronize</span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> reopened</span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\"> labeled</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#22863A\">jobs</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#22863A\">take-screenshots</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">if</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> $</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"> github.ref_name == 'main' </span><span class=\"token punctuation\" style=\"color:#393A34\">|</span><span class=\"token punctuation\" style=\"color:#393A34\">|</span><span class=\"token plain\"> (github.event_name == 'pull_request' </span><span class=\"token important\">&amp;&amp;</span><span class=\"token plain\"> contains(github.event.pull_request.labels.</span><span class=\"token important\">*.name</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> 'Argos')) </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">runs-on</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> ubuntu</span><span class=\"token punctuation\" style=\"color:#393A34\">-</span><span class=\"token plain\">latest</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token key atrule\" style=\"color:#22863A\">steps</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\"># Your job steps here ...</span><br></span></code></pre></div></div>\n<p>There are many options to explore, such as <a href=\"https://docs.github.com/en/actions/using-workflows/manually-running-a-workflow\" target=\"_blank\" rel=\"noopener noreferrer\">triggering the workflow manually</a> or <a href=\"https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#example-including-paths\" target=\"_blank\" rel=\"noopener noreferrer\">only when files matching a specific pattern are modified</a>.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"conclusion\">Conclusion<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>I believe <strong>visual regression testing is underused</strong> in the frontend ecosystem.</p>\n<p>Taking full-page screenshots is a <strong>low-hanging fruit</strong> that is easy to set up and can help you <strong>catch a new class of bugs</strong> that your regular test suite would miss. This technique shines not only for npm package upgrades, but also for <strong>any kind of refactoring</strong> that shouldn't change the user interface.</p>\n<p>So why not give it a try?</p>\n<p>Happy hacking!</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"see-also\">See also<a href=\"https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing#see-also\" class=\"hash-link\" aria-label=\"Direct link to See also\" title=\"Direct link to See also\">​</a></h2>\n<p>Useful documentation links:</p>\n<ul>\n<li><a href=\"https://playwright.dev/docs/intro\" target=\"_blank\" rel=\"noopener noreferrer\">Playwright - Installation</a></li>\n<li><a href=\"https://playwright.dev/docs/test-configuration\" target=\"_blank\" rel=\"noopener noreferrer\">Playwright - Test config guide</a></li>\n<li><a href=\"https://playwright.dev/docs/api/class-testconfig\" target=\"_blank\" rel=\"noopener noreferrer\">Playwright - Test config API</a></li>\n<li><a href=\"https://argos-ci.com/docs/installation\" target=\"_blank\" rel=\"noopener noreferrer\">Argos - Installation</a></li>\n<li><a href=\"https://argos-ci.com/docs/github-actions\" target=\"_blank\" rel=\"noopener noreferrer\">Argos - Use with GitHub Actions</a></li>\n<li><a href=\"https://argos-ci.com/docs/playwright\" target=\"_blank\" rel=\"noopener noreferrer\">Argos - Use with Playwright</a></li>\n<li><a href=\"https://argos-ci.com/docs/about-flaky\" target=\"_blank\" rel=\"noopener noreferrer\">Argos - About flaky tests</a></li>\n</ul>",
            "url": "https://coinsgpt.github.io/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing",
            "title": "Upgrading frontend dependencies with confidence",
            "summary": "Upgrade npm dependencies with confidence thanks to a visual regression testing workflow using GitHub Actions, Playwright and Argos.",
            "date_modified": "2023-09-22T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/2.4",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 2.4</strong>.</p>\n<p>The upgrade should be easy: as explained in our <a href=\"https://coinsgpt.github.io/community/release-process\">release process documentation</a>, minor versions respect <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus blog post social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-3239a62bb56c9529ff255bc2c72e94f6.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/2.4#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"sidebar-item-description\">Sidebar item description<a href=\"https://coinsgpt.github.io/blog/releases/2.4#sidebar-item-description\" class=\"hash-link\" aria-label=\"Direct link to Sidebar item description\" title=\"Direct link to Sidebar item description\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8236\" target=\"_blank\" rel=\"noopener noreferrer\">#8236</a>, we made it possible to provide a new <code>description</code> attribute for docs sidebar items of type <code>link</code> and <code>category</code>.</p>\n<div class=\"language-tsx codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">sidebars.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-tsx codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    type</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'link'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    label</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'Link with description'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    href</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'https://docusaurus.io'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    description</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'Some link description'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    type</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'category'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    label</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'Category with description'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">    description</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'Some category description'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    items</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<p>These descriptions will be used in category generated index pages.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Show sidebar category generated index with custom descriptions\" src=\"https://coinsgpt.github.io/assets/images/sidebar-item-description-f38981b17f486bc09fb811c6992ef668.jpg\" width=\"1400\" height=\"691\" class=\"img_vXGZ\"></p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"theme-query-string\">Theme Query String<a href=\"https://coinsgpt.github.io/blog/releases/2.4#theme-query-string\" class=\"hash-link\" aria-label=\"Direct link to Theme Query String\" title=\"Direct link to Theme Query String\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8708\" target=\"_blank\" rel=\"noopener noreferrer\">#8708</a>, we added the possibility to force Docusaurus to initialize itself in <code>light</code> or <code>dark</code> mode through a new <code>docusaurus-theme</code> query-string parameter.</p>\n<p>This is useful to ensure a consistent theme when embedding an existing Docusaurus page into an iframe or WebView.</p>\n<div style=\"padding:10px\"><div class=\"browserWindow_my1Q\" style=\"min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden\"><div class=\"browserWindowHeader_jXSR\"><div class=\"buttons_uHc7\"><span class=\"dot_giz1\" style=\"background:#f25f58\"></span><span class=\"dot_giz1\" style=\"background:#fbbe3c\"></span><span class=\"dot_giz1\" style=\"background:#58cb42\"></span></div><div class=\"browserWindowAddressBar_Pd8y text--truncate\">/docs/?docusaurus-theme=light</div><div class=\"browserWindowMenuIcon_Vhuh\"><div><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span></div></div></div><div class=\"browserWindowBody_Idgs\" style=\"padding:0\"><iframe src=\"/docs/?docusaurus-theme=light\" title=\"/docs/?docusaurus-theme=light\" style=\"display:block;width:100%;height:300px\"></iframe></div></div></div>\n<div style=\"padding:10px\"><div class=\"browserWindow_my1Q\" style=\"min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden\"><div class=\"browserWindowHeader_jXSR\"><div class=\"buttons_uHc7\"><span class=\"dot_giz1\" style=\"background:#f25f58\"></span><span class=\"dot_giz1\" style=\"background:#fbbe3c\"></span><span class=\"dot_giz1\" style=\"background:#58cb42\"></span></div><div class=\"browserWindowAddressBar_Pd8y text--truncate\">/docs/?docusaurus-theme=dark</div><div class=\"browserWindowMenuIcon_Vhuh\"><div><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span></div></div></div><div class=\"browserWindowBody_Idgs\" style=\"padding:0\"><iframe src=\"/docs/?docusaurus-theme=dark\" title=\"/docs/?docusaurus-theme=dark\" style=\"display:block;width:100%;height:300px\"></iframe></div></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"remark-plugin-npm2yarn-upgrade\">Remark plugin npm2yarn upgrade<a href=\"https://coinsgpt.github.io/blog/releases/2.4#remark-plugin-npm2yarn-upgrade\" class=\"hash-link\" aria-label=\"Direct link to Remark plugin npm2yarn upgrade\" title=\"Direct link to Remark plugin npm2yarn upgrade\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8690\" target=\"_blank\" rel=\"noopener noreferrer\">#8690</a>, we upgraded our Remark plugin <a href=\"https://github.com/facebook/docusaurus/tree/main/packages/docusaurus-remark-plugin-npm2yarn\" target=\"_blank\" rel=\"noopener noreferrer\">@docusaurus/remark-plugin-npm2yarn</a> with many conversion bug fixes, first-class support for pnpm, and the ability to register custom converters producing new tabs.</p>\n<div class=\"language-markdown codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-markdown codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">Run these commands!</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token code punctuation\" style=\"color:#393A34\">```</span><span class=\"token code code-language\">bash npm2yarn</span><span class=\"token code\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code\"></span><span class=\"token code code-block language-bash\">npm install</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-bash\">npm run build</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-bash\">npm run myCustomScript -- --some-arg</span><span class=\"token code\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code\"></span><span class=\"token code punctuation\" style=\"color:#393A34\">```</span><br></span></code></pre></div></div>\n<div class=\"browserWindow_my1Q\"><div class=\"browserWindowHeader_jXSR\"><div class=\"buttons_uHc7\"><span class=\"dot_giz1\" style=\"background:#f25f58\"></span><span class=\"dot_giz1\" style=\"background:#fbbe3c\"></span><span class=\"dot_giz1\" style=\"background:#58cb42\"></span></div><div class=\"browserWindowAddressBar_Pd8y text--truncate\">http://localhost:3000</div><div class=\"browserWindowMenuIcon_Vhuh\"><div><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span></div></div></div><div class=\"browserWindowBody_Idgs\"><div class=\"tabs-container tabList_Qoir\"><ul role=\"tablist\" aria-orientation=\"horizontal\" class=\"tabs\"><li role=\"tab\" tabindex=\"0\" aria-selected=\"true\" class=\"tabs__item tabItem_AQgk tabs__item--active\">npm</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_AQgk\">Yarn</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_AQgk\">pnpm</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_AQgk\">Bun</li></ul><div class=\"margin-top--md\"><div role=\"tabpanel\" class=\"tabItem_pnkT\"><div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#8250DF\">npm</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">install</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#8250DF\">npm</span><span class=\"token plain\"> run build</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#8250DF\">npm</span><span class=\"token plain\"> run myCustomScript -- --some-arg</span><br></span></code></pre></div></div></div><div role=\"tabpanel\" class=\"tabItem_pnkT\" hidden=\"\"><div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#8250DF\">yarn</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">install</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#8250DF\">yarn</span><span class=\"token plain\"> build</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#8250DF\">yarn</span><span class=\"token plain\"> myCustomScript --some-arg</span><br></span></code></pre></div></div></div><div role=\"tabpanel\" class=\"tabItem_pnkT\" hidden=\"\"><div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token function\" style=\"color:#8250DF\">pnpm</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">install</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#8250DF\">pnpm</span><span class=\"token plain\"> run build</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#8250DF\">pnpm</span><span class=\"token plain\"> run myCustomScript --some-arg</span><br></span></code></pre></div></div></div><div role=\"tabpanel\" class=\"tabItem_pnkT\" hidden=\"\"><div class=\"language-bash codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">bun </span><span class=\"token function\" style=\"color:#8250DF\">install</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">bun run build</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">bun run myCustomScript --some-arg</span><br></span></code></pre></div></div></div></div></div></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"gtag-support-for-multiple-tracking-ids\">gtag support for multiple tracking IDs<a href=\"https://coinsgpt.github.io/blog/releases/2.4#gtag-support-for-multiple-tracking-ids\" class=\"hash-link\" aria-label=\"Direct link to gtag support for multiple tracking IDs\" title=\"Direct link to gtag support for multiple tracking IDs\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8620\" target=\"_blank\" rel=\"noopener noreferrer\">#8620</a> we added support for the <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-google-gtag\">@docusaurus/plugin-google-gtag</a> plugin to declare multiple tracking IDs.</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">module</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">exports</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">presets</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/preset-classic'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token literal-property property\" style=\"color:#005CC5\">gtag</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token literal-property property\" style=\"color:#005CC5\">trackingID</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token string\" style=\"color:#C6105F\">'G-&lt;YOUR-NEW-GA4-ID&gt;'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token string\" style=\"color:#C6105F\">'UA-&lt;YOUR-OLD-UA-ID&gt;'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>Google is sunsetting Universal Analytics</div><div class=\"admonitionContent_Knsx\"><p><strong><a href=\"https://blog.google/products/marketingplatform/analytics/prepare-for-future-with-google-analytics-4/\" target=\"_blank\" rel=\"noopener noreferrer\">Google will sunset its Universal Analytics</a></strong> on <strong>July 1, 2023</strong>.</p><p>Docusaurus users should migrate to Google Analytics 4. Google <strong>does not permit to migrate your existing Universal Analytics data</strong> to your new Google Analytics 4 property.</p><p>To preserve the continuity of your analytics, we temporarily recommend that you report events to 2 tracking IDs at the same time: the old one (<code>UA-*</code>) and new one (<code>G-*</code>). Refer to the <strong><a href=\"https://github.com/facebook/docusaurus/issues/7221\" target=\"_blank\" rel=\"noopener noreferrer\">dedicated issue</a></strong> for details.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"developer-experience\">Developer Experience<a href=\"https://coinsgpt.github.io/blog/releases/2.4#developer-experience\" class=\"hash-link\" aria-label=\"Direct link to Developer Experience\" title=\"Direct link to Developer Experience\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8736\" target=\"_blank\" rel=\"noopener noreferrer\">#8736</a>, we improved how we render error messages and added initial support to render the full causal chain of an error (see <a href=\"https://h3manth.com/ES2022/#error-cause\" target=\"_blank\" rel=\"noopener noreferrer\">ES2022 Error Cause</a>).</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>To see it in action, click here: <button class=\"button button--danger\" type=\"button\">Boom!</button></p></div></div>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8735\" target=\"_blank\" rel=\"noopener noreferrer\">#8735</a> we also made navbar-related error messages clearer to help users understand what they did wrong.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus navbar error message screenshot\" src=\"https://coinsgpt.github.io/assets/images/navbar-error-15eefab8e8d77aa4d605939956987164.jpg\" width=\"1676\" height=\"1614\" class=\"img_vXGZ\"></p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"translations\">Translations<a href=\"https://coinsgpt.github.io/blog/releases/2.4#translations\" class=\"hash-link\" aria-label=\"Direct link to Translations\" title=\"Direct link to Translations\">​</a></h3>\n<p>We made it possible to translate some new elements:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8677\" target=\"_blank\" rel=\"noopener noreferrer\">#8677</a> introduces a new <code>process.env.DOCUSAURUS_CURRENT_LOCALE</code> (experimental) allowing you to localize your config file, including site title, tagline, announcement bar, baseUrl...</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8616\" target=\"_blank\" rel=\"noopener noreferrer\">#8616</a> allows to translate the navbar and footer logo alt text</li>\n</ul>\n<p>We added default theme translation support for multiple languages:</p>\n<ul>\n<li>🇭🇺 <a href=\"https://github.com/facebook/docusaurus/pull/8668\" target=\"_blank\" rel=\"noopener noreferrer\">#8668</a>: Hungarian</li>\n<li>🇳🇴 <a href=\"https://github.com/facebook/docusaurus/pull/8631\" target=\"_blank\" rel=\"noopener noreferrer\">#8631</a>: Norwegian (Bokmål)</li>\n</ul>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>Completing theme translations is an <a href=\"https://github.com/facebook/docusaurus/issues/3526\" target=\"_blank\" rel=\"noopener noreferrer\">ongoing effort</a> and an easy way to contribute to Docusaurus. We add new theme features regularly, for which we often <a href=\"https://github.com/facebook/docusaurus/issues/3526\" target=\"_blank\" rel=\"noopener noreferrer\">need new translations</a>.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/2.4#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Other notable changes include:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8674\" target=\"_blank\" rel=\"noopener noreferrer\">#8674</a>: respect <code>prefers-reduced-motion: reduce</code> media query</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8712\" target=\"_blank\" rel=\"noopener noreferrer\">#8712</a>: use a navbar item of type <code>docSidebar</code> in template</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8801\" target=\"_blank\" rel=\"noopener noreferrer\">#8801</a>: allow tabs children to be falsy</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8757\" target=\"_blank\" rel=\"noopener noreferrer\">#8757</a>: make search page react to external query-string changes</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8803\" target=\"_blank\" rel=\"noopener noreferrer\">#8803</a>: fix code block buttons position in RTL</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8615\" target=\"_blank\" rel=\"noopener noreferrer\">#8615</a>: fix color mode toggle when using dark navbar</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8699\" target=\"_blank\" rel=\"noopener noreferrer\">#8699</a>: fix navbar dropdown tab focus bug</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/2.4.0\">2.4.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/2.4",
            "title": "Docusaurus 2.4",
            "summary": "We are happy to announce Docusaurus 2.4.",
            "date_modified": "2023-03-23T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/2.3",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 2.3</strong>.</p>\n<p>The upgrade should be easy: as explained in our <a href=\"https://coinsgpt.github.io/community/release-process\">release process documentation</a>, minor versions respect <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus 2.2 social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-7e038d19ea67c686e90e1f599f7256d0.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/2.3#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"google-tag-manager-plugin\">Google Tag Manager plugin<a href=\"https://coinsgpt.github.io/blog/releases/2.3#google-tag-manager-plugin\" class=\"hash-link\" aria-label=\"Direct link to Google Tag Manager plugin\" title=\"Direct link to Google Tag Manager plugin\">​</a></h3>\n<p>Google Tag Manager is a tag management system that allows great flexibility. It enables analytics and marketing teams to easily load other third-party trackers and fire analytics tags.</p>\n<p>We now have a <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-google-tag-manager\"><code>@docusaurus/plugin-google-tag-manager</code></a> package that you can use alongside or as an alternative to the existing <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-google-gtag\">gtag.js plugin</a> (refer to <a href=\"https://support.google.com/tagmanager/answer/7582054\" target=\"_blank\" rel=\"noopener noreferrer\">this doc</a> to understand when to use which solution).</p>\n<div class=\"theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg></span>Google is sunsetting Universal Analytics</div><div class=\"admonitionContent_Knsx\"><p><a href=\"https://blog.google/products/marketingplatform/analytics/prepare-for-future-with-google-analytics-4/\" target=\"_blank\" rel=\"noopener noreferrer\">Google will sunset its Universal Analytics</a> on <strong>July 1, 2023</strong>, and ask users to migrate to <strong>Google Analytics 4</strong>.</p><p>Therefore, we are also <strong>deprecating our existing <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-google-analytics\"><code>@docusaurus/plugin-google-analytics</code></a></strong> package. Docusaurus users should create a new Google Analytics 4 property, and migrate to the <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-google-gtag\">gtag.js plugin</a>, or the <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-google-tag-manager\">Google Tag Manager plugin</a>. Refer to the <a href=\"https://github.com/facebook/docusaurus/issues/7221\" target=\"_blank\" rel=\"noopener noreferrer\">dedicated Docusaurus issue</a> for details and questions.</p></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"tabs-query-string-support\">Tabs Query String Support<a href=\"https://coinsgpt.github.io/blog/releases/2.3#tabs-query-string-support\" class=\"hash-link\" aria-label=\"Direct link to Tabs Query String Support\" title=\"Direct link to Tabs Query String Support\">​</a></h3>\n<p>It is now possible to link a selected tab to a query string parameter. When a tab is selected, it will be stored in your browser URL as a <code>?qs-param=tab-value</code> search parameter.</p>\n<p>This feature allows deep-linking to a specific documentation tab that will pre-selected on page load.</p>\n<p>When used alongside the <code>groupId</code> prop, the query string tab value takes precedence over the <code>localStorage</code> value.</p>\n<p>Make sure to check the <a href=\"https://coinsgpt.github.io/docs/markdown-features/tabs#query-string\">documentation</a> and the demo below to understand how it works:</p>\n<!-- -->\n<div class=\"language-tsx codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-tsx codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag class-name\" style=\"color:#116329\">Tabs</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">groupId</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">current-os</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">queryString</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain-text\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\">  </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag class-name\" style=\"color:#116329\">TabItem</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">value</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">android</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">label</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">Android</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain-text\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\">    Android</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\">  </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag class-name\" style=\"color:#116329\">TabItem</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain-text\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\">  </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag class-name\" style=\"color:#116329\">TabItem</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">value</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">ios</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">label</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">iOS</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain-text\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\">    iOS</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\">  </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag class-name\" style=\"color:#116329\">TabItem</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain-text\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\"></span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag class-name\" style=\"color:#116329\">Tabs</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><br></span></code></pre></div></div>\n<div class=\"browserWindow_my1Q\"><div class=\"browserWindowHeader_jXSR\"><div class=\"buttons_uHc7\"><span class=\"dot_giz1\" style=\"background:#f25f58\"></span><span class=\"dot_giz1\" style=\"background:#fbbe3c\"></span><span class=\"dot_giz1\" style=\"background:#58cb42\"></span></div><div class=\"browserWindowAddressBar_Pd8y text--truncate\">http://localhost:3000</div><div class=\"browserWindowMenuIcon_Vhuh\"><div><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span></div></div></div><div class=\"browserWindowBody_Idgs\"><div class=\"tabs-container tabList_Qoir\"><ul role=\"tablist\" aria-orientation=\"horizontal\" class=\"tabs\"><li role=\"tab\" tabindex=\"0\" aria-selected=\"true\" class=\"tabs__item tabItem_AQgk tabs__item--active\">Android</li><li role=\"tab\" tabindex=\"-1\" aria-selected=\"false\" class=\"tabs__item tabItem_AQgk\">iOS</li></ul><div class=\"margin-top--md\"><div role=\"tabpanel\" class=\"tabItem_pnkT\"><p>Android</p></div><div role=\"tabpanel\" class=\"tabItem_pnkT\" hidden=\"\"><p>iOS</p></div></div></div></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"nested-admonitions\">Nested admonitions<a href=\"https://coinsgpt.github.io/blog/releases/2.3#nested-admonitions\" class=\"hash-link\" aria-label=\"Direct link to Nested admonitions\" title=\"Direct link to Nested admonitions\">​</a></h3>\n<p>It is now possible to nest one admonition within another by adding extra colons for the outer/enclosing admonition:</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">::::tip[nested admonitions]</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">You can now nest one admonition within another!</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">:::danger</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">Use this sparingly when it makes sense.</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">:::</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">::::</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>nested admonitions</div><div class=\"admonitionContent_Knsx\"><p>You can now nest one admonition within another!</p><div class=\"theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>danger</div><div class=\"admonitionContent_Knsx\"><p>Use this sparingly when it makes sense.</p></div></div></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"blog-createfeeditems\">Blog <code>createFeedItems</code><a href=\"https://coinsgpt.github.io/blog/releases/2.3#blog-createfeeditems\" class=\"hash-link\" aria-label=\"Direct link to blog-createfeeditems\" title=\"Direct link to blog-createfeeditems\">​</a></h3>\n<p>A new blog plugin option <a href=\"https://coinsgpt.github.io/docs/api/plugins/@docusaurus/plugin-content-blog#CreateFeedItemsFn\"><code>feedOptions.createFeedItems</code></a> gives you more control over the RSS/Atom feed generation. It is now possible to transform/filter/limit feed items through a new callback.</p>\n<div class=\"language-tsx codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-tsx codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token string\" style=\"color:#C6105F\">'@docusaurus/preset-classic'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    blog</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      feedOptions</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token function-variable function\" style=\"color:#8250DF\">createFeedItems</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#CF222E\">async</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">params</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">blogPosts</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> defaultCreateFeedItems</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token spread operator\" style=\"color:#D73A49\">...</span><span class=\"token plain\">rest</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> params</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token keyword\" style=\"color:#CF222E\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#8250DF\">defaultCreateFeedItems</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token comment\" style=\"color:#6B6B6B;font-style:italic\">// keep only the 10 most recent blog posts in the feed</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            blogPosts</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> blogPosts</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token method function property-access\" style=\"color:#8250DF\">filter</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">item</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:#D73A49\">=&gt;</span><span class=\"token plain\"> index </span><span class=\"token operator\" style=\"color:#D73A49\">&lt;</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#005CC5\">10</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token spread operator\" style=\"color:#D73A49\">...</span><span class=\"token plain\">rest</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"translations\">Translations<a href=\"https://coinsgpt.github.io/blog/releases/2.3#translations\" class=\"hash-link\" aria-label=\"Direct link to Translations\" title=\"Direct link to Translations\">​</a></h3>\n<p>We added or completed the default theme translation support for multiple languages:</p>\n<ul>\n<li>🇸🇮 <a href=\"https://github.com/facebook/docusaurus/pull/8541\" target=\"_blank\" rel=\"noopener noreferrer\">#8541</a> Slovenian</li>\n<li>🇹🇷 <a href=\"https://github.com/facebook/docusaurus/pull/8289\" target=\"_blank\" rel=\"noopener noreferrer\">#8289</a> Turkish</li>\n<li>🇮🇷 <a href=\"https://github.com/facebook/docusaurus/pull/8406\" target=\"_blank\" rel=\"noopener noreferrer\">#8406</a> Farsi</li>\n<li>🇵🇱 <a href=\"https://github.com/facebook/docusaurus/pull/8525\" target=\"_blank\" rel=\"noopener noreferrer\">#8525</a> Polish</li>\n<li>🇨🇳 <a href=\"https://github.com/facebook/docusaurus/pull/8423\" target=\"_blank\" rel=\"noopener noreferrer\">#8423</a> Chinese</li>\n<li>🇸🇪 <a href=\"https://github.com/facebook/docusaurus/pull/8312\" target=\"_blank\" rel=\"noopener noreferrer\">#8312</a> Swedish</li>\n<li>🇻🇳 <a href=\"https://github.com/facebook/docusaurus/pull/8450\" target=\"_blank\" rel=\"noopener noreferrer\">#8450</a> Vietnamese</li>\n</ul>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>Completing theme translations is an <a href=\"https://github.com/facebook/docusaurus/issues/3526\" target=\"_blank\" rel=\"noopener noreferrer\">ongoing effort</a> and an easy way to contribute to Docusaurus. We add new theme features regularly, for which we often <a href=\"https://github.com/facebook/docusaurus/issues/3526\" target=\"_blank\" rel=\"noopener noreferrer\">need new translations</a>.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/2.3#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Other notable changes include:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8463\" target=\"_blank\" rel=\"noopener noreferrer\">#8463</a> and <a href=\"https://github.com/facebook/docusaurus/pull/8328\" target=\"_blank\" rel=\"noopener noreferrer\">#8328</a>: fix some annoying Docusaurus layout issues</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8539\" target=\"_blank\" rel=\"noopener noreferrer\">#8539</a>: Algolia plugin <code>options.searchPagePath</code> should be correctly applied to search modal footer</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8462\" target=\"_blank\" rel=\"noopener noreferrer\">#8462</a>: Algolia plugin now makes it easier to transform displayed search results with custom logic</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8397\" target=\"_blank\" rel=\"noopener noreferrer\">#8397</a>: the <code>deploy</code> CLI now understands git url <code>insteadOf</code> config</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/2.3.0\">2.3.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/2.3",
            "title": "Docusaurus 2.3",
            "summary": "We are happy to announce Docusaurus 2.3.",
            "date_modified": "2023-01-27T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/releases/2.2",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 2.2</strong>.</p>\n<p>The upgrade should be easy: as explained in our <a href=\"https://coinsgpt.github.io/community/release-process\">release process documentation</a>, minor versions respect <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus 2.2 social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-402517ac2205718a22585e627fe1351c.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/releases/2.2#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"mermaid-diagrams\">Mermaid diagrams<a href=\"https://coinsgpt.github.io/blog/releases/2.2#mermaid-diagrams\" class=\"hash-link\" aria-label=\"Direct link to Mermaid diagrams\" title=\"Direct link to Mermaid diagrams\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/7490\" target=\"_blank\" rel=\"noopener noreferrer\">#7490</a>, we added support for Mermaid diagrams. This fills the gap between GitHub Flavored Markdown which also <a href=\"https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/\" target=\"_blank\" rel=\"noopener noreferrer\">added support recently</a>. You can create Mermaid diagrams using Markdown code blocks:</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code punctuation\" style=\"color:#393A34\">```</span><span class=\"token code code-language\">mermaid</span><span class=\"token code\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code\"></span><span class=\"token code code-block language-mermaid\">sequenceDiagram</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">    participant Alice</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">    participant Bob</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">    Alice-&gt;&gt;John: Hello John, how are you?</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">    loop Health check</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">        John-&gt;&gt;John: Fight against hypochondria</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">    end</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">    Note right of John: Rational thoughts &lt;br/&gt;prevail!</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">    John--&gt;&gt;Alice: Great!</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">    John-&gt;&gt;Bob: How about you?</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code code-block language-mermaid\">    Bob--&gt;&gt;John: Jolly good!</span><span class=\"token code\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token code\"></span><span class=\"token code punctuation\" style=\"color:#393A34\">```</span><br></span></code></pre></div></div>\n<!-- -->\n<div class=\"browserWindow_my1Q\"><div class=\"browserWindowHeader_jXSR\"><div class=\"buttons_uHc7\"><span class=\"dot_giz1\" style=\"background:#f25f58\"></span><span class=\"dot_giz1\" style=\"background:#fbbe3c\"></span><span class=\"dot_giz1\" style=\"background:#58cb42\"></span></div><div class=\"browserWindowAddressBar_Pd8y text--truncate\">http://localhost:3000</div><div class=\"browserWindowMenuIcon_Vhuh\"><div><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span></div></div></div><div class=\"browserWindowBody_Idgs\"></div></div>\n<p>Make sure to check the <a href=\"https://coinsgpt.github.io/docs/markdown-features/diagrams\">documentation</a>, and the <a href=\"https://coinsgpt.github.io/tests/pages/diagrams\">more advanced examples</a></p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"config-headtags\">Config <code>headTags</code><a href=\"https://coinsgpt.github.io/blog/releases/2.2#config-headtags\" class=\"hash-link\" aria-label=\"Direct link to config-headtags\" title=\"Direct link to config-headtags\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8151\" target=\"_blank\" rel=\"noopener noreferrer\">#8151</a>, we added the ability to apply arbitrary HTML <code>&lt;head&gt;</code> tags to all pages of your site.</p>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">module</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">exports</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">headTags</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">tagName</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'link'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">attributes</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token literal-property property\" style=\"color:#005CC5\">rel</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'icon'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token literal-property property\" style=\"color:#005CC5\">href</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'/img/docusaurus.png'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"accessibility\">Accessibility<a href=\"https://coinsgpt.github.io/blog/releases/2.2#accessibility\" class=\"hash-link\" aria-label=\"Direct link to Accessibility\" title=\"Direct link to Accessibility\">​</a></h3>\n<p>We did several accessibility improvements:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8207\" target=\"_blank\" rel=\"noopener noreferrer\">#8207</a>: improves keyboard navigation for mobile drawer hamburger button</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8161\" target=\"_blank\" rel=\"noopener noreferrer\">#8161</a>: improves keyboard navigation for tabs</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8204\" target=\"_blank\" rel=\"noopener noreferrer\">#8204</a>: makes the skip to content button support progressive enhancement</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8174\" target=\"_blank\" rel=\"noopener noreferrer\">#8174</a>: improves screen reader announcement when toggling between light/dark mode</li>\n</ul>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"developer-experience\">Developer Experience<a href=\"https://coinsgpt.github.io/blog/releases/2.2#developer-experience\" class=\"hash-link\" aria-label=\"Direct link to Developer Experience\" title=\"Direct link to Developer Experience\">​</a></h3>\n<p>We made validation stricter and improved error messages:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8234\" target=\"_blank\" rel=\"noopener noreferrer\">#8234</a>: in case of doc processing failure, prints the problematic markdown file path in the error message</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8192\" target=\"_blank\" rel=\"noopener noreferrer\">#8192</a> and <a href=\"https://github.com/facebook/docusaurus/pull/8159\" target=\"_blank\" rel=\"noopener noreferrer\">#8159</a>: validates <code>siteConfig.url</code> more strictly and with better error message</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8066\" target=\"_blank\" rel=\"noopener noreferrer\">#8066</a>: makes config <code>url</code> and <code>baseUrl</code> fail-safe and less sensitive to the presence or absence of a leading or trailing slash</li>\n</ul>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"translations\">Translations<a href=\"https://coinsgpt.github.io/blog/releases/2.2#translations\" class=\"hash-link\" aria-label=\"Direct link to Translations\" title=\"Direct link to Translations\">​</a></h3>\n<p>We completed the default theme translation support for multiple languages:</p>\n<ul>\n<li>🇹🇷 <a href=\"https://github.com/facebook/docusaurus/pull/8105\" target=\"_blank\" rel=\"noopener noreferrer\">#8105</a>: completes Turkish translations</li>\n<li>🇷🇺 <a href=\"https://github.com/facebook/docusaurus/pull/8253\" target=\"_blank\" rel=\"noopener noreferrer\">#8253</a>: completes Russian translations</li>\n<li>🇫🇷 <a href=\"https://github.com/facebook/docusaurus/pull/8243\" target=\"_blank\" rel=\"noopener noreferrer\">#8243</a>: completes French translations</li>\n<li>🇯🇵 <a href=\"https://github.com/facebook/docusaurus/pull/8075\" target=\"_blank\" rel=\"noopener noreferrer\">#8075</a>: completes Japanese translations</li>\n</ul>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>Completing theme translations is an <a href=\"https://github.com/facebook/docusaurus/issues/3526\" target=\"_blank\" rel=\"noopener noreferrer\">ongoing effort</a> and an easy way to contribute to Docusaurus. We add new theme features regularly, for which we often <a href=\"https://github.com/facebook/docusaurus/issues/3526\" target=\"_blank\" rel=\"noopener noreferrer\">need new translations</a>.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/releases/2.2#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Other notable changes include:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8210\" target=\"_blank\" rel=\"noopener noreferrer\">#8210</a>: the <code>docusaurus swizzle</code> CLI has a new <code>--config</code> option</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8109\" target=\"_blank\" rel=\"noopener noreferrer\">#8109</a>: mobile navigation performance optimizations, prefetch resources earlier</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8059\" target=\"_blank\" rel=\"noopener noreferrer\">#8059</a>: versions/locales navbar dropdowns preserve hash and querystring on navigation</li>\n<li><a href=\"https://github.com/facebook/docusaurus/pull/8227\" target=\"_blank\" rel=\"noopener noreferrer\">#8227</a>: the client redirect plugin preserves hash and querystring on redirect</li>\n</ul>\n<p>Check the <strong><a href=\"https://coinsgpt.github.io/changelog/2.2.0\">2.2.0 changelog entry</a></strong> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/releases/2.2",
            "title": "Docusaurus 2.2",
            "summary": "We are happy to announce Docusaurus 2.2.",
            "date_modified": "2022-10-29T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/2022/09/01/docusaurus-2.1",
            "content_html": "<p>We are happy to announce <strong>Docusaurus 2.1</strong>, our very first minor version release.</p>\n<p>The upgrade should be easy: as explained in our <a href=\"https://coinsgpt.github.io/community/release-process\">release process documentation</a>, minor versions respect <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus 2.1 social card\" src=\"https://coinsgpt.github.io/assets/images/social-card-8dc2413b4f9e86328bf77575e91171d7.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/2022/09/01/docusaurus-2.1#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"doccardlist-improvements\">DocCardList improvements<a href=\"https://coinsgpt.github.io/blog/2022/09/01/docusaurus-2.1#doccardlist-improvements\" class=\"hash-link\" aria-label=\"Direct link to DocCardList improvements\" title=\"Direct link to DocCardList improvements\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/8008\" target=\"_blank\" rel=\"noopener noreferrer\">#8008</a>, we simplified the usage of the<code>&lt;DocCardList&gt;</code> component, that is notably used on sidebar category generated index pages.</p>\n<p>The <code>items</code> prop is now optional, and will be automatically inferred from the content of the parent sidebar category:</p>\n<div class=\"language-diff codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">import DocCardList from '@theme/DocCardList';</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"> import {useCurrentSidebarCategory} from '@docusaurus/theme-common';</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:#d73a49\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"> &lt;DocCardList items={useCurrentSidebarCategory().items}/&gt;</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token deleted-sign deleted line\" style=\"color:#d73a49\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:#36acaa\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:#36acaa\"> &lt;DocCardList/&gt;</span><br></span></code></pre></div></div>\n<p>Also, we made it possible to use it on any document, including regular docs not linked to any sidebar category.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"simplified DocCardList component\" src=\"https://coinsgpt.github.io/assets/images/doc-card-list-e52d727eadceb3d21cfc0f851f09aa93.png\" width=\"1062\" height=\"489\" class=\"img_vXGZ\"></p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"noindex-improvements\"><code>noindex</code> improvements<a href=\"https://coinsgpt.github.io/blog/2022/09/01/docusaurus-2.1#noindex-improvements\" class=\"hash-link\" aria-label=\"Direct link to noindex-improvements\" title=\"Direct link to noindex-improvements\">​</a></h3>\n<p>We improved the support of the <a href=\"https://developers.google.com/search/docs/advanced/crawling/block-indexing\" target=\"_blank\" rel=\"noopener noreferrer\"><code>noindex</code> meta <code>robots</code> directive</a>, a way to signal search engines you don't want a specific page to be indexed.</p>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/7963\" target=\"_blank\" rel=\"noopener noreferrer\">#7963</a>, we allow <code>noindex</code> to be configured on a per-docs-version basis.</p>\n<p>Use the following plugin options to tell crawlers you don't want the <code>1.0.0</code> version to be indexed:</p>\n<div class=\"language-jsx codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-jsx codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> options </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">versions</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token string-property property\" style=\"color:#005CC5\">'1.0.0'</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">noIndex</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:#005CC5\">true</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<p>In practice, Docusaurus will add the following meta to each page of that version:</p>\n<div class=\"language-html codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-html codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">meta</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">name</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">robots</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">content</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">noindex, nofollow</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag punctuation\" style=\"color:#393A34\">/&gt;</span><br></span></code></pre></div></div>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/7964\" target=\"_blank\" rel=\"noopener noreferrer\">#7964</a>, we also fixed a bug where the sitemap plugin would still contain pages that have a <code>noindex</code> directive. Now the sitemap plugin will reliably filter out all the pages containing <code>noindex</code> directives.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"overriding-default-meta-tags\">Overriding default meta tags<a href=\"https://coinsgpt.github.io/blog/2022/09/01/docusaurus-2.1#overriding-default-meta-tags\" class=\"hash-link\" aria-label=\"Direct link to Overriding default meta tags\" title=\"Direct link to Overriding default meta tags\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/7952\" target=\"_blank\" rel=\"noopener noreferrer\">#7952</a>, it becomes possible to override default html meta tags you couldn't before:</p>\n<div class=\"language-jsx codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-jsx codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><span class=\"token plain-text\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\">siteConfig</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">noIndex</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">&amp;&amp;</span><span class=\"token plain\"> </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">meta</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">name</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">robots</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">content</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">nofollow, noindex</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag punctuation\" style=\"color:#393A34\">/&gt;</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain-text\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\">  </span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">meta</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">name</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">viewport</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag attr-name\" style=\"color:#0550AE\">content</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:#393A34\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag attr-value\" style=\"color:#C6105F\">width=device-width, initial-scale=1.0</span><span class=\"token tag attr-value punctuation\" style=\"color:#393A34\">\"</span><span class=\"token tag\" style=\"color:#22863A\"> </span><span class=\"token tag punctuation\" style=\"color:#393A34\">/&gt;</span><span class=\"token plain-text\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain-text\"></span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;/</span><span class=\"token tag punctuation\" style=\"color:#393A34\">&gt;</span><br></span></code></pre></div></div>\n<p>It is now possible to use <code>&lt;Head&gt;</code> or <code>themeConfig.metadata</code>:</p>\n<ul>\n<li>to override the <code>viewport</code> meta</li>\n<li>to override the <code>robots</code> meta: you could mark your site as <code>noIndex</code>, but except for specific pages that should be indexed</li>\n</ul>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"ukrainian-translations\">Ukrainian translations<a href=\"https://coinsgpt.github.io/blog/2022/09/01/docusaurus-2.1#ukrainian-translations\" class=\"hash-link\" aria-label=\"Direct link to Ukrainian translations\" title=\"Direct link to Ukrainian translations\">​</a></h3>\n<p>In <a href=\"https://github.com/facebook/docusaurus/pull/7953\" target=\"_blank\" rel=\"noopener noreferrer\">#7953</a>, we added default classic theme translations for the Ukrainian language.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-changes\">Other changes<a href=\"https://coinsgpt.github.io/blog/2022/09/01/docusaurus-2.1#other-changes\" class=\"hash-link\" aria-label=\"Direct link to Other changes\" title=\"Direct link to Other changes\">​</a></h2>\n<p>Check the <a href=\"https://coinsgpt.github.io/changelog/2.1.0\">2.1.0 changelog entry</a> for an exhaustive list of changes.</p>",
            "url": "https://coinsgpt.github.io/blog/2022/09/01/docusaurus-2.1",
            "title": "Docusaurus 2.1",
            "summary": "We are happy to announce Docusaurus 2.1, our very first minor version release.",
            "date_modified": "2022-09-01T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0",
            "content_html": "<p>Today we are extremely happy to finally <strong>announce Docusaurus 2.0</strong>! 🥳️</p>\n<p>At <a href=\"https://opensource.fb.com/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Meta Open Source</strong></a>, we believe Docusaurus will help you build the <strong>best documentation websites</strong> with <strong>minimal effort</strong>, letting you <strong>focus on what really matters</strong>: writing the content.</p>\n<p>After <strong>4 years of work, <a href=\"https://github.com/facebook/docusaurus/releases/tag/v2.0.0-alpha.75\" target=\"_blank\" rel=\"noopener noreferrer\">75 alphas</a> and <a href=\"https://github.com/facebook/docusaurus/releases/tag/v2.0.0-beta.22\" target=\"_blank\" rel=\"noopener noreferrer\">22 betas</a></strong>, the next generation of Docusaurus is <strong>ready for prime time</strong>. From now on, we now plan to <strong>respect <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a></strong> and will release <strong>major versions more frequently</strong>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"social-card image\" src=\"https://coinsgpt.github.io/assets/images/social-card-736cfe55fc7bba07204176852d67c0d5.png\" width=\"1200\" height=\"600\" class=\"img_vXGZ\"></p>\n<!-- -->\n<div class=\"theme-admonition theme-admonition-info admonition_o5H7 alert alert--info\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>We are on <a href=\"https://www.producthunt.com/posts/docusaurus-2-0\" target=\"_blank\" rel=\"noopener noreferrer\">ProductHunt</a> and <a href=\"https://news.ycombinator.com/item?id=32303052\" target=\"_blank\" rel=\"noopener noreferrer\">Hacker News</a>!</div><div class=\"admonitionContent_Knsx\"><p><strong>Now</strong> is the best time to show your love for Docusaurus!</p><div style=\"display:flex\"><a href=\"https://www.producthunt.com/posts/docusaurus-2-0?utm_source=badge-featured&amp;utm_medium=badge&amp;utm_souce=badge-docusaurus-2-0\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"producthunt-badge-widget\" style=\"display:block;width:250px;height:54px\"><img class=\"producthunt-badge-widget\" src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=353916&amp;theme=light\" alt=\"Docusaurus 2.0 - Build optimized websites quickly, focus on your content. | Product Hunt\" style=\"width:250px;height:54px;max-width:initial\" width=\"250\" height=\"54\"></a><a href=\"https://news.ycombinator.com/item?id=32303052\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display:block;width:54px;height:54px\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" width=\"54\" height=\"54\"><path fill=\"#FF6D00\" d=\"M42 42H6V6h36v36z\"></path><path fill=\"#FFF\" d=\"M8 8v32h32V8H8zm30 30H10V10h28v28z\"></path><path fill=\"#FFF\" d=\"M23 32h2v-6l5.5-10h-2.1L24 24.1 19.6 16h-2.1L23 26z\"></path></svg></a></div></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>In a hurry? Check <a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#whats-new-in-20\">what's new in Docusaurus 2.0</a>!</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"what-is-docusaurus-exactly\">What is Docusaurus exactly?<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#what-is-docusaurus-exactly\" class=\"hash-link\" aria-label=\"Direct link to What is Docusaurus exactly?\" title=\"Direct link to What is Docusaurus exactly?\">​</a></h2>\n<p>Docusaurus is a <strong>static site generator</strong> that helps you ship <strong>beautiful documentation websites</strong> in <strong>no time</strong>.</p>\n<p>Focus on your content: just write <strong>Markdown files</strong>. Docusaurus will generate an optimized <strong>website</strong> for you that's easy to <strong>host anywhere</strong>.</p>\n<p>Docusaurus is <strong>full-featured</strong> and very <strong>flexible</strong>: we ship with well-designed docs and blog layout, as well as out-of-the-box versioning, search, and internationalization functionalities, with a call to accessibility and search engine optimizations. Its flexible theming system permits to <strong>adapt the UI to match your branding</strong> so that it integrates nicely with your main website or documentation portal. Its usage of <strong>React</strong> enables a <strong>modern client-side navigation</strong>, and the ability to build an <strong>interactive documentation</strong>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Introducing Slash\" src=\"https://coinsgpt.github.io/assets/images/slash-introducing-411a16dd05086935b8e9ddae38ae9b45.svg\" width=\"760\" height=\"160\" class=\"img_vXGZ\"></p>\n<p>The Docusaurus philosophy is akin to the <strong>Pareto principle</strong>: you can get <strong>80% of the results</strong> for <strong>20% of the effort</strong>. This enables you to compete with top-notch documentation sites with <strong>minimal effort</strong>.</p>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/rachelnabors/status/1452697991039660038\" target=\"_blank\" rel=\"noopener noreferrer\"><p>Unless you're spinning up a documentation team with engineering resources, you\nprobably want Docusaurus!</p></a></blockquote><figcaption><a href=\"https://x.com/rachelnabors\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Rachel Nabors\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/rachelnabors\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Rachel Nabors</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Former ReactJS &amp; React-Native docs manager</small></div></div></a></figcaption></figure>\n<p>Docusaurus aims to be the <strong>best documentation tool</strong>, but you can use it for <strong>other use-cases</strong> as well: a blog, a knowledge base, a developer portfolio, a second brain, or even to scaffold landing pages!</p>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/johnny_reilly/status/1551861926334025728\" target=\"_blank\" rel=\"noopener noreferrer\"><p>Using Docusaurus for my tech blog has been a fantastic choice. It looks\ntremendous out-of-the-box and the awesome DX means I write way more</p></a></blockquote><figcaption><a href=\"https://x.com/johnny_reilly\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Johnny Reilly\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/johnny_reilly\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Johnny Reilly</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Group Principal Engineer at Investec</small></div></div></a></figcaption></figure>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>Try Docusaurus now with our <a href=\"https://coinsgpt.github.io/docs/playground\">online playgrounds</a> and <a href=\"https://tutorial.docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\">5 minutes tutorial</a> ⏱️</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"the-story-behind-docusaurus\">The story behind Docusaurus<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#the-story-behind-docusaurus\" class=\"hash-link\" aria-label=\"Direct link to The story behind Docusaurus\" title=\"Direct link to The story behind Docusaurus\">​</a></h2>\n<p>Docusaurus was created at <strong>Facebook Open Source</strong> in <strong>2017</strong> (now <a href=\"https://opensource.fb.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Meta Open Source</a>). We had a lot of internal and open source projects to document. It's <strong>complicated enough to write good documentation</strong>, let alone to create the HTML, CSS, and JavaScript for a good-looking website. We wanted project leaders to be able to <strong>focus on the content</strong>, and <strong>Markdown</strong> is great for that.</p>\n<p>At that time, our solution was to <strong>copy/paste a Jekyll template</strong> over and over again. This naturally became <strong>hard to maintain</strong>, so we created a tool to <strong>solve our own pain</strong> once for all.</p>\n<p><strong><a href=\"https://coinsgpt.github.io/blog/2017/12/14/introducing-docusaurus\">Docusaurus v1 was born</a>!</strong></p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Birth of Slash\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvgAAACgCAIAAAD2Ao8HAAAbm0lEQVR42u3dCVhV553HcbtMp31m2uk807TTaTvtzDx52sk002xNpjZeRBY3UMANRRQXQBQXFFEWAREBt2B2Y6IhNXFp0hhj1GhMYtQY9Rwu62WVXS67F3BFWeZ/uYYgIAIiXO798nwen8v1Luec9z3v++M97zln2Nb6OgAAAIs0jE0AAAAIOgAAAAQdAAAAgg4AAABBBwAAgKADAABA0AEAAAQdAAAAgg4AAABBBwAAgKADAABA0AEAACDoAAAAgg4AAABBBwAAgKADAABA0AEAACDoAAAAEHQAAABBBwAAgKADAABA0AEAACDoAEAXNhrKwiq0q/Vn5N/NtZVsEAAEHQBD25baquCyr+blveWUFqxRZ7cZqc6Zlrk5sjKNTQSAoANgKImvr42oTF1Q+NdJuuiRiXPb55sObFQvv8L32GIACDoAzN366rylJYfcs+Ltkvy6CTedkXUAEHQAmOm0m8DSE7NzXxubsrxX4abDuE5kZTobEwBBB4AZTLupqw4tP++dt2tCelhvM83/bLV7cu+Ezs+7Z25hwwIg6AAYNJFVuoVFf5ucEWubOL9vIzfPnvUcNmzYPz7yL10N6szdZChjIwMg6AAYODE1BQEXP56R/byDdmGfj0y197v1mv99bXSX/7VS/wUbHABBB0C/8S860DlebDSUBelPeeW+Pi41sM+B5vcv2f/gNz96/K3xPX/L7NztlAgAgg6A+xKk/2JpyWF5EFJ2zpQwJO48V3cprCLRJ3+3S3q4jep1/yM3v103Yth3vnW3wZsujU1ZQekAIOgA6LWIylRJM1vqquMMJaYcMzv3tbl5O9tChm2id78cmeowI6fnL16QGRVYfCC+vpbCAkDQAXBvEhqeqzeYHo9OXiZhYnJGzNKSw+1P6u73cNNbvplr95YfKW+obmlp+ez6NUoNAEEHQI9SzrjUQPukhf5FByKrdO1Pbhr0cCO8MyN2lx8qa6hqafeTe/MmBQeAoAPg3uIMJQ/0sFTfzM8If6fsI31DZUtXPzeam/0/OvhcrYHiA0DQAdBt0LlUYibhRszLCN9VdvDijYqWbn/S09N/9+c/b67iruYACDoA7pJvXNLDRycvG528ZNDzzZyMsL+UfVhyo7zLWKPVanNzc9s/Ex0dHffeuxQiAIIOgK61nTE+mPlGF/aW/kDxjbJuBm8CAwPd3d3t7e23bt3a9qSdnV1qRQWFCICgA+Cuc5AnpIUOSr6ZrQtJ0H9QdF3fcq+f+vr6Z599Vh40NjZ6enrGxsbK4+vXrw8fPryxufklyhEAQQfA3QSUHOs+kYw45/nIZtv/Cnxa/PED1/vMN7N0wW/q9xdeL+0y0xgMBkdHx6eeemrevHkSZUxP7tmzJyYmxvS4qanJx8dnxowZzs7O27Ztk2f2X71KIQIg6ADoaEtdtdeFHd1fHefRlxy+/8sfDmv385DDb/582qNvU4yTL2d1P3gTFBS0Y8cOefD222+PGDGivLy8ubl53LhxOTk57V+mqqpWqzU9Tmy4QVECIOgA6GhR4f7uo8ljCeO+/f3vSLj50WM//fWCx/7N/b+/++O/l19//MzP+zCQc7Xpevuwkpyc7OnpOWfOnPz8/Nuni9+48cQTTzQ1NZl+PXPmzJNPPvnUU08FBAR0k42qGhspSgAEHQAdravOHpMS0E06+afHfyax5ldzH2175umPJn3vJz+QJx992aFXQefL2qQ70klV1R/+8IeTJ09+/vnnTz/9dEJCgqScqKiotkNUbQeqrl692v0g0JXGa1EViZsM5RQoAIIOgI5Hr3wL9nYZTZ75eIoEmu/+6HsdbkH1cNhwef4/ljzZ85Rjk+jV0HyzfTpZvnz5u+++a3p87dq1wMBAyT1+fn4Sd+45N/la042Uy9n7Kj5el7/NI32VfLh8xYrSzyhNAAQdAHeIr6/1yH6xy3Tyxw9cJdD8w8P/3Pm/Ht/lNOKcZ69GdG40NbQllTfeeMPW1ralxz/y3vQrue9VHFtfsH2WLnhk4pzOn++Z+wqlCYCgA+AOdxvOEcNPTP/W3337h7//Sb+cTK7UpZtSy82bN+Pi4mpqarpJNg3NN3VXLuyvPB5b+IaXLtS2q2TTwejkZZQmAIIOgDssKNjXTXp4Yo/zM4cm99ddxzscvWr/c7P5VtbVggNVn20o3Dk3Y82oxN7dSXRSimdMwYydtccpUAAEHQB3iKzS+eTvHoArBC7Mis6+WmBKNo3NjTnXig5Wndhc9Ob8jIhRifN6+2ljtLOCc2e8VzG18LpbS4uLOHN5FaUJgKAD4A6bDOUu6eEDdkFkt9RlU1KX22vn9+G9tursRVkeO0vd0y5PutXsYso3bSoaplGaAAg6AO4wN2+n+dy3vEue6TOfL57+pWHK1caO4aaDnZdzQqvO+Vx8K77+EiULgKADoC6w9MQora+5hRuX5Fnr8qcfqZ5a1eDafbhp75UK3zHZC+yzvOYVv7as7CCFC4CgA6Auvu7SspKjgx5uHLWzVubM2Fc+Le/apJ6Hm/ZO1k+RlGPilLOUkgVA0AFQt746zzF5yWDlm6mps7ZfdE+qn3yzybVv+aZNfaOrw9dBZ3S298zCLRQuAIIOYO1m524flIgzIdnzWM2U5maX+8w37S0qnNk2qDMtfz2FC4CgA1i7yMo0N906G3XuQKacGWkzKxpc+zHi3J6PXOneFnRmFG6kcAEQdAAYBelPDVjKGaOdVXrDreP54bfc9tS4NzTfO/1UVY3dt++P8+f/2t39Fx3+K/nqZFPKcciay4gOAIIOAKM1FUm2ib27tk2kOuOEMmV071POaHVWZaprS4Mxl9TcdDtaMyUk32NJwUyv/FkSUF6qmH6odlrncHP9uvMnnwxftephR8eHpk37xfbtjxUUOHR+2c1m1w9Tpi3WzXS5sJpiBUDQAaxcremB14UdvQor49VZlxS3FsWlSHHzVGf26r371anyxvpE18C0GfLryJTZbQebbg/GZHvVNhrHdZqbJ2q1IzdseMTZ+V+dnH4WF/eIqo6UJ7sb77np0qi6XkmcEl28nfIFQNABrNrpwncSqnPkwQbDxfl5uyakhfYwrBxSjGHF5KriGq7O6OEbfRSPpq/fWKW4zkz07JByxLis2XNPu0zz+JWDw0NBQQ8fOzb8+nXnuyWb2trxdzxTcvvDryR57azJbb+yr18qosQBgg4AK1KZurg0fWXbuI5/0YemODJd9ewmrCxVPdpSTps9yrSR6qx73sMhV5nU/l01itvcjFmds874dM+SqnHfxJeGO08jrx9/4MAzixf/p739Q76+v/nmvxpdWrTffHhtsndbuNlmKNWnB1LiAEEHgLXYUZNnCgRfFO6TX1eUfmaKI7Hq9Fuqy4uKe5dhxV6dXdJ60KqzRHXyhG4T0jbFvfO7DKqrd0bHcZ2AYs9bLV/PSja4tCS6NFZMOH16RETEb8eO/amr68+ff/7RjAy7jgM8+o4fXp2y6FVDqaxdcu6L8uubrcNXAAg6ACzfiaJ3TWngljo1oTrbt2CvZJG/KNNMTzYrLlFdHZB6W53WZcoxqVDcfO8yZWea6nlDce3yXXWq2wLdHVnHNXf29dbTr/LTHG6dm2hansMJf5Ksc+vWhK4PYzW5tCR38eFl6Sv2VGibWsOZrDLlDhB0AFiFYl1wWxrQpwe+WFuRnL6qfUS4pbqsUD3ahxUvdeatu6cck5uK6yZleuegc16d3M27Lquui3S3r/XnnD17x95nvLz+3WPKr+pPOd3xSn0Xp5ofOvR/xscVd/3wxq+/ukgXQrkDBB0Alu9Vg77pziNQV5K8OkeEa4qrz9cjNDbq7Iw7Z9h047Ayxb5dylmnTr/nW64orssT3e33jh5/yHnnm4+XFo9pSe/qlSXGU82PHRseFPSwg8ND7u6/SEh4whh0Uu+9VI3qpFcMZZQ+QNABYOEOlR7rYWQxqK4zWrPOCz0IK+1lq5Omtk5PdlI95UN68pZG+fdy61BNs0tL9l1fdnT7nzZseCQxsd2p5jU9XSpZcUofIOgAsHBJF17ueWQpU9z8VI9rimuvgo5x8o3iukL1OKJO7cW7tC4t9S4tBfd6WV5rGGo7hpXe089Pzn2R0gcIOgAsXFn6il5FlqZeRpz7eWNzD1+ZY8w6dXXjv/pY0/MPL09bRukDBB0AluzFuupGdVJLX7OL+Uh7b5TH9F+Wfjam52+RFZfVpw4ABB0AFmtfhWoBKee21F6/RVafOgAQdABYrJOF+ywn6PSe6QKJAAg6ACxTTma0NQed7KxY6gBA0AFgsS6lLLDmoGNI8aUOAAQdAJaqtrHbixRbvEZ10vP1BmoCQNABYIF21ORbc8ox2VGTR00ACDoALNB75WcJOrIRqAkAQQeABfqk5CBBRzYCNQEg6ACwQOfzdhB0zuXtoCYABB0AFigrK46gk5W9gZoAEHQAWKDCjDUEnSJdKDUBIOgAsECl6YEEHX16IDUBIOgAsECVqYsJOlWp/tQEgKADwAIZUnwJOrXJPtQEgKADwHzF11VtMZRuMRRtupS3sTozrjotrkobU3F+fcWZ9eUn1umPR+mPRJZ+GFHyfnjJvjXFb68pTAgtfD2k4NV6dSpB53LiNNkask1ky8j2ka0k20q2mGw32XqyDWVLyvaUrSrbVrawbGfZ2rLNqXgAQQfAXaJJ/SXpLKXX3FCti61U11eclm51belHkSV/Cy/ebQwiBa8F57+4Om9zUG5MYE7EiqzggMzlS3X+S3Te/mmzF6a6+yW7+SaN90m0n69q+uyGMpGgIxuhzxtQtr+UgpSFlIiUi5SOlJGUlJSXlJqUnZSglKOUppSplKyUr5SyMUJVnJZyl9JvTU6lUh/YKQCCDmBuYaV2i0G/qebChurUmMqz0WWfRpZ+GF6yL6wwIaRg26q8+NaMEr48c+XSjMVL0uf7p870S5ks/aJ3ot39pJN+1GT1KUfIRjCHspBaYcxMKZOlnkhtkTojNUfqj9QiqUtSo6ReSe2SOiY1Teqb1Dqpe1IDpR6yMwIEHaBHB4A2XSqMq05bX3EmSn8s8uIH4cXvhBZuX533vHQ2K7LDAjIDluh8jHkl2c1HO8ZMwsp9jeiojOi4yEYY6uUotVHqpDEh6XyklkpdbR1Mel5qr9RhqclSn6VWS92WGs5BNxB02AqwsEGX0o3VWbGVanTZibWlH4UX75HWX/5EDsyNMo616PwWpXr6Jbve5zGgIapenUDQkY1gbeUutV3qvNR8qf/GcaPcKNkjWlPRHtlHZE+R/UX2mtZjagwXgaADDJLnjAMwebGVWmmXIy8eWFO0Kzj/ZflDdnnW6tb44rFA6+St2lhhfOm5aoKO4lJtfUGnFwfUVBvZj2RvMkairNWyf8leJvua7HGteUgr++BzDBGBoAP0nmGzoTCuKnld2ecRF/eHFe1cnfdcYE5EQGbA4vR5C1Om+Ggd6YTun151JujIRqAm3PexM0fZK2XflD1U9lPZW2WflT1X9l/Zi2Vflj2aZg0EHViXLYaSDdWp0eVfGAdjChOC87dK+7g0Y+mitFkLkpwZiRkYhQQdxaWQoDMwI0NJzrJ3yz4ue7rs77LXG4eFyr+QdkBaA5pEEHQwFKNMaVx1WnTZiYiS90MLtwflxi3PXCl/8y1IdvFWbWn6zUGmOp6gIxuBmmAGSchWWgZpH6SVkLZCWgxpN6T1kDZEWhKaUxB0MFinKdVsrMmJqTwbVXoorGjX6vz4FdnhS3ULF6a6W+fc3iHnS3UcQUc2AjXB7GdPO0irIm2LtDDSzkhrI22OtDzS/kgrRFMMgg7u12ZDSWylNkp/dE3R26vy4ldkhSxJn++XNJH2d6j7UBlN0JGNQE0Y0qQtkhZJ2iVpnaSNkpZK2qvNHA4DQQedhmeqN1ZnRpefiih5P6Rg28qcdcYZM6nTGZuxYG+qDgQd2QjUBEs9i15aMGnHpDWTNs14LKz8lLRy0tbR4BN0YOE2XcqPqfgq4uL+kIJXV+ZELtX5+SW70Sxaoc2qHUFHNgI1weoGgZLdpN2T1k/aQGkJpT2UVpGugaCDoTgdWB9XpY3SHwkrTAi6sGFZZoD8fWM+9x/AoAtWRxJ0ZCNQE2C6C4e0kNJOSmspbaa0nNJ+SitKV0LQgbmc4hRbqay9eED+QAnMCV+cPt83iSmWuOepLprr1n1fT1l9b2oCuiVtqbSo0q5K6yptrLS0nAhG0MEDviJwbbn8nbG29KPQwu2BOZFLdD4LtE40RuAMc84tx4CRVlfaXmmBpR2W1ljaZGmZ6Z4IOuj9BOH62o01OdFln64pTDDODtb5LeBcJ/SrI6pVn3glq08dQL+ln6SJrVN/1kmLLe228ex3bhZG0EGHy9LEVaet1R8OLXgtMHvN4jQvznjCg/aKam/NQUdWnzqAB3rml7Tk0p5Lqy5tu7TwXPiHoGNVR6AqYiuViIv7V+e9sDxz5aJU9/lMisSAW2nd85FXstNhoI2U1l7afGn5pf2XXkD6AjpEgo5lMGyozpBEH1Lw6vKsVQuNsYYdHmahXLHSO17JilP6MAfSI0i/YJzsrD8sPQX3QCXoDJXToIrWl58IK3prZe5a//S5HISC2TpqrdN0jjJBB+Z6wEt6Dek7pAeRfkR6E7pUgo6ZDNikth6H2rwsw983idOgMGRsUEdZZ9DZwKUCMWROcXeSnkX6F+llpK9hyIegM0A3TIitTAwv+WtQbuyS9PkM2GBIX03nsvVdTecyV9DBUB7ykX5Heh/pg6Qn4qYWBJ1+mzscU3EuvPidwNwo/7TZ3qotOxsshhXexpyblsOC/laxlV5J+ibpoaSfYnYzQafnYzaXjGM2xXsCcyIXpXp4qzbsTrBUG63v6JWsMuUOC809NtJnSc8l/VfreM8lOnSCzjc21uSsLT24Km/LEp2PN0ejYE1Krencq1LOt4L15J5Ee+nRpF+T3k36OIKO1QWdLYbS6LIToQWvBWStYAYxrNk7ioP1BB1ZWUocVjuvWfo76fWk77POm3YNs5Zhm4sHgnJjFqV6UOkBE3/V5oZ1TEmW1fTnSDTQSvpB6Q2lT7SewR7LDDrx9bVxVclrinevyA7zS3alZgNdOq6OsYagI6tJWQOdSf8ovaT0ldJjWvBduoZZ0FTiqvUVZ0ILXw/IDPDVjqUGA/cUoI60+EEdWcEAbvsA3PMIl3as9J7Sh0pPKv0pQceMzpOKqTwbUrBtqW6hdyKnVAC9dtDSB3UOMpwD9Ho68yjpVaVvlR7WAs7hGjY0D0tpwwoTJHv6aLmgO3C/M3Us+OKBl5mdA9wf6Welt5U+V3reIXp4a8gEnQ3VuvDi3cuzVvsmjafmAf1ot+JoqUFHVo3yBfrvBK7x0gtLXyw9MkGnv04F10fpj6zMWceEYuABDlOrmhzVyfJSjqwU93wAHtxEZumdpY+Wnpqg02txVSmhRTuM02646wIwIEJU2wbLSjmyOiE0IMBA/KVkK/219NrSdxN0ur+xVHmU/uOVOdEM3gCDYq9qUQewZHUoU2AwhnmipTeXPp2g882l/MKKdi3VLWLwBhj0A1hpynjLSDmpyngOWgGDPczjL/27OVyWcHCCTlx1Wkjhdv+0OdQGwHwsVm306pC/AZaswmLOtALM59TOtDnS40u/bxVBJ7ZSCc57YVGqOwUPmKdg1fbKUD7bXBY+mOFhwCxJ7y8ZQJKApQWd+Pra9RWngy5sZPINMCRsVkfdGpopRxZbFp4SBMx/Ko+kAskGA3NhnmEP8uQp7er8ePINMORsVe1uDrVxHVlgWWzKDhhaiUdygqSFIRZ0NtbkhBZu5z7hwJC2RbFrGFInk8sCU2rAkD2q5SHJ4QHNXB7Wfxf3K1lTvHuJzocCAyzDJtXu+lAY15GF3MRYDmARJEVIlpBEYVZBx7BOfzwgK5DzwwHLE6bamvl5WLJ4YTQ+gGWRRCG5QtKFZIzBDDqbLuWFFGzzS3ajSABLHlJWbRKVceaZcmTBFnEmOWDJk3jcJGlI3hjgoGOI0h8LyFzuTfsCWI19iuMN1YwOY8nC7OOGnYC1DPDYSOqQ7NG3AZ5hvRrCCc5/hbOoAOu0Wh1pJpdOlsWQhaFEACs8S0tySG8HeHoUdGKrklbkhDMLB8B2xb5GmTBYEUe+WhaAUgCsfAaPZBJJJv0TdNaVfbY0YzGbFUAbX1WzS3GoHti4I18nX+rL9gfwNcknklL6GHTi66ojSt7zT53JdgTQxue8xu+sxv8rzZIvNctPaf76pcPFs04POuKUnnV697RD0EnNslPG75Vvl2WQJaE4AAjJKpJYJLf0NOg8V1sZVrRzQdJEth1gpcPCijFJSKRYcVKz6jNN6HFNxFFN1MeamMOamEMjOtt+dORXX4yuP9fPAzzygfKx8uFdfqnRYeNSybLJEspyytLKMsuSy/JTiIC1kdwi6UUyTHdBR9LQmuK3iTiA2QpRbcMfxFQ5xThMIkEh5FPN2qN3DTT39OYx208/d7zw5fiG8308P0veKG+XD5GP6tsymAKQrIWsi6yRrNd8cg9gTXFHkkyH0Z1hrffdvBRR8i5XxAHMbSrMWnXUTtXhuDomR3UyXaRYfu23kZvzmoDTmrDjEg40fU8VXYk9rHnj6Mj3j9ud+Nwx9dTYkjNOlV85156bcO3cxEbFRcgD+VWelP+SF8jL5MXyltjD/bwkrYzrKGvqzdEuwFpOznKTVCPZ5nbQWXvxwMKUaWwXYNAtUm1ilVHvKA6nlLFFilPnW4g3Ky4B/XT9qqWnNeuOPIhUYb5kfWWtqWaAlZBsIwknvr52GNsCGPxpMapmp+pQod5jmku+6txf3xhtZSnHRNa6JxtnrTrqA3V0juokcbMbqeq4vaojN6AAzHuq8iyCDmBGYtRRx9UxdXc5c3u/Orq/vogRnXsf7Fdt4lW7T5Wx7U+kb2i9XOE+xTGcfAMMEQQdwBwHeLYodqeVsVfvvOvCWnVUf37LA5ujY2b6YY5OhDpqj+oohbKAW98ABB0A/XYGgWrzsmqvqOMaFBeDMuFBfVE/nXVlLjjrCgBBBxhy85SjFdv7eftmdVQPLyvc5XV0jMe5zC0AHTYuFdfRAUDQAazRMnXkS6r9UXVMvuLUqEw8qI65/8/0Pa/xO3f7ysgBpzWBJzUrT2hWf64J/nRE6PERa45rwj/RRBzTRLZeYHDdx8YgEt1q/WFjLhGmE8hjWx8Led70AnmlvF7eJe+VT5DPkU+Tz5RPls+Xb5Hvkm+8fWXkc8YloYgBEHQAa7RQtTmtjG1uN7knW3HyZssAIOgAsBhbVbt81dl4LwV1QqA6kg0CgKADwOLijmK/SbVjOwAg6AAAABB0AAAACDoAAAAEHQAAAIIOAAAAQQcAAICgAwAACDoAAAAEHQAAAIIOAAAAQQcAAICgAwAAQNABAADW4v8BIMkHbXsCeUgAAAAASUVORK5CYII=\" width=\"760\" height=\"160\" class=\"img_vXGZ\"></p>\n<p>It quickly built momentum at Facebook and in the frontend ecosystem, adopted by many popular projects such as <a href=\"https://prettier.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Prettier</a>, <a href=\"https://babeljs.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Babel</a>, <a href=\"https://archive.reactnative.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">React-Native</a>, <a href=\"https://katex.org/docs/\" target=\"_blank\" rel=\"noopener noreferrer\">KaTeX</a>, and of course <a href=\"http://v1.docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus v1</a> itself.</p>\n<div class=\"cssCarousel_jWvs\" style=\"aspect-ratio:1.8356164383561644\"><div class=\"cssCarouselSlider_nIAN\" style=\"aspect-ratio:1.8356164383561644\"><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAvklEQVR4nDXCzwvBUBwA8PcHO6yWQktIK0kcnJRc5OIosZ1wkXKRNjYchmbzY794tnnv7SsHnz6IGy6rfbnWkyqdkViXxJJULspCYcyXB6naDM23Bvac4+mk69rFNv2n6z9dx7uzOJiuTaQYNwCGo4gwBn+MJQCwUm2kGVegJMD4FYaUEEbp74cAwHm+QfrBihnx8Nt6uO4Le/gdhHFEaALgTJZIaS+UVldrNlQxqxbTmzy/zXG7DLcXeDOV/gIPyZWv09LiSwAAAABJRU5ErkJggg==&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"355\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/prettier.0987194.640.png srcset=\"/assets/ideal-img/prettier.0987194.640.png 640w,/assets/ideal-img/prettier.ac62bde.1030.png 1030w\" width=640 height=355></noscript></div><a href=\"https://prettier.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Prettier</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxUlEQVR4nAG6AEX/AHW3yo+qtZWouZOjuZCTupGGu4yEuoKCt3yHsnCOwQDI2OD07urj4uHc29ns6+fy8+3y8+3s7Oj18enC0+UA1ODq/vz78vP06+vu8PDz9PT38/P39/f5////0dbpANjf6f/9/Pj28fDs4PXy6P767/757v359P///+TH1wDb3ej4/Pv1+PPw8eb1+O31+Oz1+ez4+/b+///vwMwA1p7J1Zuk2JSQ1oZ71IB01Htx1nhv23lw3Xxy5m11yK+UrA2JDh4AAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"355\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/babel.cbc364a.640.png srcset=\"/assets/ideal-img/babel.cbc364a.640.png 640w,/assets/ideal-img/babel.3669cfa.1030.png 1030w\" width=640 height=355></noscript></div><a href=\"https://babeljs.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Babel</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxUlEQVR4nAG6AEX/AGisw32brIaZrYCSqn2EroB1rX52r5eYzoGMumSBtwC8ztfm4uHZ2dnLy8rP0c/i49/q6+f4+fX/+/S7zN8Az9zl+/n38vP04uTm6enq7O3u7Ovt9vb3////0NXpANDY4vXz8vHx8efm5+zr6vPy8vTz8vv4+f///+PG1wDY2+b3+/ni6OnO1djY3d/d4uTb4OPu8fL////uwMwA1p7J1pylzYiFvW5iu2dcu2NZulxUz2tk33505mx04r2PDpDiiAMAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"355\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/react-native.e8025ec.640.png srcset=\"/assets/ideal-img/react-native.e8025ec.640.png 640w,/assets/ideal-img/react-native.8cebf9a.1030.png 1030w\" width=640 height=355></noscript></div><a href=\"https://archive.reactnative.dev/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->React-Native</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAv0lEQVR4nAXB3wrBUBwA4PPAaiHSduOGG4UiV0rIC3gCNwqToraz5d8K46zNzraznbMxP9+HqqrV3eiDldFfmp252Z4arQluTLA83UnjA1pfbJFxQv2n51LOaMbiXPgiiri/wARplgP5N04S50VCSlkY8ThJRQYAe40gwyIAOWPMth9vzw0CGoZBygUA3FYYna4kB6Asvr8c4r1dGkQiFZ/vD8BfbBEeqfpwZva6elPW6mVNKeKadKxJZ6VkFyp/r/+XglW08JQAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"355\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/katex.2b3ecc9.640.png srcset=\"/assets/ideal-img/katex.2b3ecc9.640.png 640w,/assets/ideal-img/katex.91ac937.1030.png 1030w\" width=640 height=355></noscript></div><a href=\"https://katex.org/docs/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Katex</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAwUlEQVR4nBXJPQuCQBgA4PvBQWE4CEFBSwQhRG1KU1M/oYYCzaCGCLIPjb4uQ++6pNOztHqjZ32QPFk0LbM1MtW+0eiZDX1c18ZV3VD0QV63kLU7xSL0yPnkbRn3aHQJxZVGPhdkaF/Q8kgAIIkfd4pf4p4m4Tfjn3cKAPOlj1zM/p1wEhzYDYcMC+5/MwEA2Fqhw/nf4skD4gTUpbd9FOPsHX0A2HCGVp2prXU3bXVdU+yKtC5LTqngKnm3VPRy8g+/UpX4n6rSEgAAAABJRU5ErkJggg==&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"355\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/docusaurus.2ad1782.640.png srcset=\"/assets/ideal-img/docusaurus.2ad1782.640.png 640w,/assets/ideal-img/docusaurus.ba4280f.1030.png 1030w\" width=640 height=355></noscript></div><a href=\"https://v1.docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Docusaurus</a></div></div><button class=\"navButton_qSul navButtonPrev_SxeT\" type=\"button\">&lt;</button><button class=\"navButton_qSul navButtonNext_yu77\" type=\"button\">&gt;</button></div></div>\n<br>\n<div class=\"theme-admonition theme-admonition-note admonition_o5H7 alert alert--secondary\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z\"></path></svg></span>note</div><div class=\"admonitionContent_Knsx\"><p>Notice that the sample sites above use different colors, but still look quite the same.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"toward-docusaurus-20\">Toward Docusaurus 2.0<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#toward-docusaurus-20\" class=\"hash-link\" aria-label=\"Direct link to Toward Docusaurus 2.0\" title=\"Direct link to Toward Docusaurus 2.0\">​</a></h2>\n<p><a href=\"http://v1.docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Docusaurus v1</strong></a> has been very successful, but we started to <strong>question some architectural choices</strong>:</p>\n<ul>\n<li>React was only used as a <strong>server-side templating language</strong>, and not used on the client</li>\n<li><strong>Theming system was pretty limited</strong>, and apart from changing a few colors with CSS, it was difficult to do more advanced customizations</li>\n<li>The <strong>docs versioning system was confusing</strong>, since it was based on a diff algorithm</li>\n<li>The codebase was <strong>monolithic</strong>, neither well-tested nor easy to extend</li>\n</ul>\n<p><a href=\"https://docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Docusaurus v2</strong></a> was <strong>rebuilt</strong> from the ground up with a new <strong>modular architecture</strong>:</p>\n<ul>\n<li>React is now also used on the client, enabling a <strong>modern Single Page Application navigation</strong></li>\n<li><strong>Plugins</strong> empower the community to contribute useful features as third-party packages</li>\n<li><strong>Theming</strong> is more <strong>flexible</strong> than ever</li>\n<li>Docs versioning is now based on snapshot copies, much easier to understand</li>\n<li>We kept <strong>everything good from v1</strong>: docs, blog, pages, versioning, i18n...</li>\n<li>We implemented <strong>several new features</strong></li>\n</ul>\n<p>More details in the <a href=\"https://coinsgpt.github.io/blog/2018/09/11/Towards-Docusaurus-2\">Docusaurus 2 project announcement</a> and <a href=\"https://docusaurus.io/docs/migration\" target=\"_blank\" rel=\"noopener noreferrer\">v1 to v2 migration guide</a></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"who-uses-docusaurus-20\">Who uses Docusaurus 2.0?<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#who-uses-docusaurus-20\" class=\"hash-link\" aria-label=\"Direct link to Who uses Docusaurus 2.0?\" title=\"Direct link to Who uses Docusaurus 2.0?\">​</a></h2>\n<p>Despite being in pre-release, it didn't take long for <strong>Docusaurus v2 to outgrow Docusaurus v1</strong> in terms of NPM downloads:</p>\n<p><a href=\"https://npmtrends.com/docusaurus-vs-@docusaurus/core\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"NPM downloads: v2 outgrows v1\" src=\"https://coinsgpt.github.io/assets/images/npm-downloads-f9d754a81ff372a5bae83c8751195e2b.png\" width=\"1200\" height=\"645\" class=\"img_vXGZ\"></a></p>\n<p>Our GitHub star trend is very positive, competing with major frameworks:</p>\n<p><a href=\"https://star-history.com/#facebook/docusaurus&amp;vercel/next.js&amp;gatsbyjs/gatsby&amp;hexojs/hexo&amp;nuxt/nuxt.js&amp;vuejs/vuepress&amp;11ty/eleventy&amp;gohugoio/hugo&amp;remix-run/remix&amp;mkdocs/mkdocs&amp;Timeline\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"GitHub stars: Docusaurus is well-positioned\" src=\"https://coinsgpt.github.io/assets/images/star-history-72ae014f60d05445753e9f690e41d347.png\" width=\"1200\" height=\"759\" class=\"img_vXGZ\"></a></p>\n<p>Today, Docusaurus v2 has already been a great success even before its launch:</p>\n<ul>\n<li>We received so many <a href=\"https://x.com/sebastienlorber/timelines/1392048416872706049\" target=\"_blank\" rel=\"noopener noreferrer\">lovely testimonials</a></li>\n<li>Companies like <a href=\"https://blog.1password.com/docusaurus-documentation-framework/\" target=\"_blank\" rel=\"noopener noreferrer\">1Password</a> and <a href=\"https://www.courier.com/blog/how-we-built-our-documentation/\" target=\"_blank\" rel=\"noopener noreferrer\">Courier</a> are writing down their positive experience</li>\n<li>Our <a href=\"https://coinsgpt.github.io/showcase\">site showcase</a> references hundreds of sites, and this is only the tip of the iceberg.</li>\n</ul>\n<div class=\"cssCarousel_jWvs\" style=\"aspect-ratio:1.7989949748743719\"><div class=\"cssCarouselSlider_nIAN\" style=\"aspect-ratio:1.7989949748743719\"><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFucsWV/jXCCk2h4kGBljmFXjl9Yk1tbkVBbiFV0qgBFWWMTEhIYGxwuLyQ4ODM0NzMuKhoxNjczNDI5SFcAQ1lmSkM2UUxELTk4S0pKR0hLPzcnQEpYPUpbR0dSAEhWY0ZEOE1HPh4fJTc4PDQ0NyIkKSomIyYmG1w9SwBNUl0PHB4YIicaHyEwNjg0Oz0YHiAkKCcaJyFbLTkAtXypqGt0rWZirVxPpVBDqE1CrExCrUlAqEc+xUlStsQ1Jd2lGVkAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/tauri.7d284be.640.png srcset=\"/assets/ideal-img/tauri.7d284be.640.png 640w,/assets/ideal-img/tauri.4852075.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://tauri.app/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Tauri</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AHCswX+aqIearISVrH6Cq4F3rn93r3V1rG54pmeFuQDC09zu6ebp5+fl5OTo6OXu7+rx8ezr7Ojz7+e8zuEA0d7o///++fn65+fo9fX1+Pj5+Pj5/Pz9////0NToANXd5/z6+Pf39+Xk4+Ph5ePi5urp6vv5+f///+PF1QDe4ez////z+Pnf4+rg5O7m6/Hr8fP5/Pz9///uvssA157K1pqk2ZOO1YN50nxz1Xtw2Hdu3Hdv3Hpw52pyiw2SNplStDwAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/figma.e023b25.640.png srcset=\"/assets/ideal-img/figma.e023b25.640.png 640w,/assets/ideal-img/figma.4b79b06.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://www.figma.com/plugin-docs/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Figma</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AHGztIijj5GjlYydlIqNkYqAk4Z9lYCAlnJ9iGiGpQDQ2Er96gDz5wP26QDv5RHw5xD47QD26wP/7wDAykgAr7dRwbcEvrcSwLYLvLMWurQWv7gQv7cQxLsFpqZLAD9IY19YEVtVGxUiNy0oMDQ0LTA+PxwZIhkeI1E0SgBITFs2OB44OiggLC8mLSovLSwoLSskKSwbKytaLDkAuH2ppGl3q2ZlrlxPqlRJqE9Fq0pDsk1ErkxDx0pT21lMrI2uNt0AAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/snapchat.5f28663.640.png srcset=\"/assets/ideal-img/snapchat.5f28663.640.png 640w,/assets/ideal-img/snapchat.39e00a7.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://docs.snap.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Snapchat</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFOYtVZ2j111kl1zlFpilVtVl09LjkhLjEJSi05uqgA0TWYSGC8lLkQTGzELFy0IFCknOEsoOk4FDSAmQmUAO1BoGyU7NURYHTJIEh83DBQsZJGpbJeuBQ8lSUZpAEBPZwYRJw8qPRVDUwwWLR4sQUpvkUhoihAhNFQxUQA7Rl8ABx0DESgADSUCEigNHjQRJkIVJ0MAGCxJITwAs3uqnWNypmNjpFZOpVJKo0xFoUI8pEE8oUJAxEhVk18yaV+3uG0AAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/iota.95754da.640.png srcset=\"/assets/ideal-img/iota.95754da.640.png 640w,/assets/ideal-img/iota.117672c.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://wiki.iota.org/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Iota</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJjT3Mzc1NLa1tDW2M7F186318i12MG217q50Zas1ADUrU3/pgD8pwv+rBD/uC//uTD/rxH9rQ3/rQDHokwA2bRi/7Ie/bkx/7Yq9rxT9rtS/7Yt/bUx/7QezqJbANzk7P///8XHyN7g4f//+f///dLPyNzZz////+PF1ADf4+7////N2NzW5Ob7///5/v/U3dTV2sr6///uvssA153K0JWe15CK14R2035y1Hlu1HRs1nJr13Vr52pyn7CEdE5qo0kAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/sap-cloud.f57d7fa.640.png srcset=\"/assets/ideal-img/sap-cloud.f57d7fa.640.png 640w,/assets/ideal-img/sap-cloud.312bf29.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://sap.github.io/cloud-sdk/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->SAP Cloud</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFibsGF8iWx/kGd4jmFljWFWjFxUjFhYjU5ZhVRypgBGWGAXEg4jIiEnJiQcHBgZGhUaGhUcHRkZFQ0yRFcAUV5nHx0cKiorLS0tKSkqJyYoKSgpKCgqHx4cPkNXAFdfaB8dGywsLDIxMS0rKyknJzEvLzAuLyMmI1Y4SABVWWMTFxUiJicnLC0hJicdIiMlKywkKCkTISBbLTkAuX+so2dxqmVgqllMp1FFp01Cqkk/rEc+qEY9xkpSZqAv5L+d0r8AAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/supabase.e96fd5f.640.png srcset=\"/assets/ideal-img/supabase.e96fd5f.640.png 640w,/assets/ideal-img/supabase.f37ca60.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://supabase.com/docs\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Supabase</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AGmswn6ZqIibrISUq4CDrH90qntyqXNzqGl1omaEuADK2+Tx6+ns6unv7evr6+j4+fT5+vXz8/D//fW+z+IA2ebv/v37+Pr79v7/8vX3ysrMv8DDur3B0tbXzdLmAN3m7////fj5+ff//9bv9SEmKwUIDgYNFR0sM9W5yQDLz9nd4uDZ3d7a4ePE1txxen5kbHBka29oeXnRpLEAv4azsHR/uHJuuGdbuGFUwWdbxGNaxmFZw2JY0FRd0wl8G5D7uNgAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/stackblitz.3a585ac.640.png srcset=\"/assets/ideal-img/stackblitz.3a585ac.640.png 640w,/assets/ideal-img/stackblitz.786829d.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://developer.stackblitz.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->StackBlitz</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AIzU7rnd78Te8cHa8b7I87+69ri19ayx8qCy7oao5wCd1eWz3eO94OTI5eXM6/K43/+bw/6Bqfxji/xTgOoAt93q1/b53PX65fr83/T7zuT8vdT8rMT6nrj/hpzmAN3k7vTw8PLw8Pv6+vHv8P/+/Pn29fXw7P///uTH1gDe4ezx9/bx9vj2+/zw9vj3/f7x9/nq7/Pz///pu8kA153J0JWf1pCN2IZ60ntv1ntw13dt1G9n13Vr52pzffeTuLcnN78AAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/lacework.dfc8aa5.640.png srcset=\"/assets/ideal-img/lacework.dfc8aa5.640.png 640w,/assets/ideal-img/lacework.33303f9.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://docs.lacework.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Lacework</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJna8c3n9tLl99Hh+c3Q+czC+cjA+L+/9bfC8JWz6QDN3u728Pjw7/j29Pz19fv09fr29/zz8/n69vjC1O4Aydfr3dzu2Nrp19fkzc7gzs/g29znxMXitbbevsTiAMzU6c/O7NHR5+Xk7c/O3aWkt+bl7bOy2Kyx29W30wDKzujQ1fHR1vHb4PXZ3/LT1+za4PXP1O/R4Pnaq8gA0pjHz5Oi1I6P1YR71H901Xtz1HNv1XFu1HNv4mVyADiS2eC63VAAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/react-navigation.1b40364.640.png srcset=\"/assets/ideal-img/react-navigation.1b40364.640.png 640w,/assets/ideal-img/react-navigation.a6b28c6.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://reactnavigation.org/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->React-Navigation</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJfa783n9dXo+c/g9szP98zB98i/98C+9LfC7pa06QDS5e3+/Pj7+/r8/Pr2+vX7/vr8/fr2+/b///vH2e4A1eLs9Pb08fT09PX26/Dw9vb38vL06/Dx/f38zNHlAN3l7v////z+/v7+//3+/v////7//v39/f///+PG1wCcoKuWmZiVmZqWm5yXm5yVmZqWm5yWmZuRnp2qfIgAsXejmF1noFlUolBDnkk8nUM4oUA3oj41njwywENMFZ6NFBzee74AAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/solana.8bcac78.640.png srcset=\"/assets/ideal-img/solana.8bcac78.640.png 640w,/assets/ideal-img/solana.e7c1e4f.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://docs.solana.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Solana</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJG2zL6ls8OmuMGiubuLs7x9tLd7s7F+taR/rIeGugDU3eb/8/D97+7/8e/97en45N/76eX57On/6+PBx9oA0N/o8fPz7fDy7fDx8fT1/P7++fT189/i////ztLmANHY4u/r6vDu7+/t7fXz8//+/vrt7vXY2v///+PE1QDg4+7////9/v7+///8/v729/j3+/v2+fr4///ru8gA153J1pqj25SQ2ol82IF12X5z2npw3Hdu3Hpw52py1S6WZvfndWMAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/gulp.645374a.640.png srcset=\"/assets/ideal-img/gulp.645374a.640.png 640w,/assets/ideal-img/gulp.f298c97.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://gulpjs.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Gulp</a></div></div><button class=\"navButton_qSul navButtonPrev_SxeT\" type=\"button\">&lt;</button><button class=\"navButton_qSul navButtonNext_yu77\" type=\"button\">&gt;</button></div></div>\n<br>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>Please add your site to our <a href=\"https://coinsgpt.github.io/showcase\">site showcase</a>! It only takes a few seconds: just <a href=\"https://github.com/facebook/docusaurus/discussions/7826\" target=\"_blank\" rel=\"noopener noreferrer\">post a comment here</a>.</p></div></div>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/maxlynch/status/1549415692704825346\" target=\"_blank\" rel=\"noopener noreferrer\"><p>We use Docusaurus everywhere now and love it</p></a></blockquote><figcaption><a href=\"https://x.com/maxlynch\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Max Lynch\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/maxlynch\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Max Lynch</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Ionic co-founder and CEO</small></div></div></a></figcaption></figure>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/supabase/status/1328960757149671425\" target=\"_blank\" rel=\"noopener noreferrer\"><p>We've been using V2 since January and it has been great</p></a></blockquote><figcaption><a href=\"https://x.com/supabase\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Supabase\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/supabase\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Supabase</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Open Source Firebase alternative</small></div></div></a></figcaption></figure>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/gabrielcsapo/status/1415061312917233665\" target=\"_blank\" rel=\"noopener noreferrer\"><p>Docusaurus is next level easy for literally everything you would need for\ndocumentation in your project.</p></a></blockquote><figcaption><a href=\"https://x.com/gabrielcsapo\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Gabriel Csapo\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/gabrielcsapo\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Gabriel Csapo</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Staff Software Engineer at LinkedIn</small></div></div></a></figcaption></figure>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/ItWasMattGregg/status/1526682295075102721\" target=\"_blank\" rel=\"noopener noreferrer\"><p>Docusaurus is awesome. We use it</p></a></blockquote><figcaption><a href=\"https://x.com/ItWasMattGregg\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Matt Gregg\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/ItWasMattGregg\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Matt Gregg</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Senior Front End Developer at Shopify</small></div></div></a></figcaption></figure>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"whats-new-in-20\">What's New in 2.0?<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#whats-new-in-20\" class=\"hash-link\" aria-label=\"Direct link to What's New in 2.0?\" title=\"Direct link to What's New in 2.0?\">​</a></h2>\n<p>It would be difficult to describe every single new feature coming with Docusaurus v2. Let's focus on the features we believe are the <strong>most impactful</strong>.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"mdx\">MDX<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#mdx\" class=\"hash-link\" aria-label=\"Direct link to MDX\" title=\"Direct link to MDX\">​</a></h3>\n<p><a href=\"https://github.com/mdx-js/mdx\" target=\"_blank\" rel=\"noopener noreferrer\">MDX</a> allows you to <strong>interleave React components</strong> in Markdown. This enables you to build top-notch <strong>interactive documentation experiences</strong> very easily.</p>\n<p>A demo is worth a thousand words:</p>\n<div class=\"language-md codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docs/my-document.mdx</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-md codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token title important punctuation\" style=\"color:#393A34;font-weight:bold\">###</span><span class=\"token title important\" style=\"color:#0550AE;font-weight:bold\"> Give it a try: press that button!</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">import ColorModeToggle from '@theme/ColorModeToggle';</span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token tag punctuation\" style=\"color:#393A34\">&lt;</span><span class=\"token tag\" style=\"color:#22863A\">ColorModeToggle</span><span class=\"token tag punctuation\" style=\"color:#393A34\">/&gt;</span><br></span></code></pre></div></div>\n<div class=\"browserWindow_my1Q\"><div class=\"browserWindowHeader_jXSR\"><div class=\"buttons_uHc7\"><span class=\"dot_giz1\" style=\"background:#f25f58\"></span><span class=\"dot_giz1\" style=\"background:#fbbe3c\"></span><span class=\"dot_giz1\" style=\"background:#58cb42\"></span></div><div class=\"browserWindowAddressBar_Pd8y text--truncate\">http://localhost:3000</div><div class=\"browserWindowMenuIcon_Vhuh\"><div><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span><span class=\"bar_rrRL\"></span></div></div></div><div class=\"browserWindowBody_Idgs\"><h3>Give it a try: press that button!</h3><div class=\"toggle_bT41\"><button class=\"clean-btn toggleButton_x9TT toggleButtonDisabled_Dj8q\" type=\"button\" disabled=\"\" title=\"system mode\" aria-label=\"Switch between dark and light mode (currently system mode)\"><svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" class=\"toggleIcon_nCQi lightToggleIcon_dnYY\"><path fill=\"currentColor\" d=\"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z\"></path></svg><svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" class=\"toggleIcon_nCQi darkToggleIcon_OBbf\"><path fill=\"currentColor\" d=\"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z\"></path></svg><svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" class=\"toggleIcon_nCQi systemToggleIcon_IWwm\"><path fill=\"currentColor\" d=\"m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z\"></path></svg></button></div></div></div>\n<div class=\"theme-admonition theme-admonition-info admonition_o5H7 alert alert--info\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_Knsx\"><p>MDX has its own <a href=\"https://mdxjs.com/docs/extending-mdx/\" target=\"_blank\" rel=\"noopener noreferrer\">plugin system</a>. You to customize your Markdown authoring experience, and even create your own Markdown syntax.</p></div></div>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/HamelHusain/status/1551962275250053123\" target=\"_blank\" rel=\"noopener noreferrer\"><p>Docusaurus + MDX is great: we were able to implement a beautiful two-pane\nlayout and give the author fine-grained control on the placement of code and\ncorresponding prose.</p></a></blockquote><figcaption><a href=\"https://x.com/HamelHusain\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Hamel Husain\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/HamelHusain\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Hamel Husain</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Head Of Data Science at Outerbounds</small></div></div></a></figcaption></figure>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"file-system-conventions\">File system conventions<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#file-system-conventions\" class=\"hash-link\" aria-label=\"Direct link to File system conventions\" title=\"Direct link to File system conventions\">​</a></h3>\n<p>Our goal is to make Docusaurus very <strong>intuitive</strong> to use. We added file system conventions, and adding a doc page is as easy as creating one Markdown file.</p>\n<!-- --><article class=\"yt-lite \" data-title=\"Explain Like I'm 5: Docusaurus\" style=\"background-image:url(https://i.ytimg.com/vi_webp/T3S8GyFIXjo/maxresdefault.webp);--aspect-ratio:56.25%\"><button type=\"button\" class=\"lty-playbtn\" aria-label=\"Watch Explain Like I'm 5: Docusaurus\"></button></article>\n<br>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/paularmstrong/status/1552005085168865281\" target=\"_blank\" rel=\"noopener noreferrer\"><p>Using the auto-generated sidebars makes it so simple to just create a page and\nnot worry about any other configuration.</p></a></blockquote><figcaption><a href=\"https://x.com/paularmstrong\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Paul Armstrong\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/paularmstrong\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Paul Armstrong</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Principal Engineer at Microsoft</small></div></div></a></figcaption></figure>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"plugins\">Plugins<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#plugins\" class=\"hash-link\" aria-label=\"Direct link to Plugins\" title=\"Direct link to Plugins\">​</a></h3>\n<p>Docusaurus now has a <strong>modular architecture</strong> with a plugin system — our <strong>core features</strong> like docs, blog, pages, and search are all powered by individual plugins.</p>\n<p>More importantly, it enables our community to <strong>enhance Docusaurus</strong> with additional features.</p>\n<p>Let's highlight some examples:</p>\n<ul>\n<li><a href=\"https://github.com/rohit-gohri/redocusaurus\" target=\"_blank\" rel=\"noopener noreferrer\">redocusaurus</a>: seamless integration with <a href=\"https://www.openapis.org/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenAPI</a> and <a href=\"https://github.com/Redocly/redoc\" target=\"_blank\" rel=\"noopener noreferrer\">Redoc</a></li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"redocusaurus plugin example\" src=\"https://coinsgpt.github.io/assets/images/redocusaurus-5cf08a76be6f85090544417b82986cfb.png\" width=\"1200\" height=\"667\" class=\"img_vXGZ\"></p>\n<ul>\n<li><a href=\"https://www.npmjs.com/package/docusaurus-preset-shiki-twoslash\" target=\"_blank\" rel=\"noopener noreferrer\">docusaurus-preset-shiki-twoslash</a>: use <a href=\"https://github.com/shikijs/shiki\" target=\"_blank\" rel=\"noopener noreferrer\">Shiki</a> code block syntax highlighting with <a href=\"https://shikijs.github.io/twoslash/\" target=\"_blank\" rel=\"noopener noreferrer\">TwoSlash</a> TypeScript compiler hints</li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"shiki-twoslash plugin example\" src=\"https://coinsgpt.github.io/assets/images/shiki-twoslash-b74271684fa819a0175595409b2f323b.png\" width=\"1200\" height=\"667\" class=\"img_vXGZ\"></p>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/orta\" target=\"_blank\" rel=\"noopener noreferrer\"><p>The plugin API was a breeze to use, and powerful enough that I could port the\ncode sample renderer from the TypeScript website site in a couple of hours.</p></a></blockquote><figcaption><a href=\"https://x.com/orta\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Orta Therox\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/orta\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Orta Therox</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Former TypeScript core team at Microsoft</small></div></div></a></figcaption></figure>\n<ul>\n<li><a href=\"https://github.com/easyops-cn/docusaurus-search-local\" target=\"_blank\" rel=\"noopener noreferrer\">docusaurus-search-local</a>: one of the various local search alternatives to the built-in Algolia plugin</li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"local search plugin example\" src=\"https://coinsgpt.github.io/assets/images/search-848f1f1b9eb0d1b710e1d1dec50fb84a.png\" width=\"1200\" height=\"627\" class=\"img_vXGZ\"></p>\n<div class=\"theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>tip</div><div class=\"admonitionContent_Knsx\"><p>We have a curated list of outstanding plugins in our <a href=\"https://coinsgpt.github.io/community/resources\">community resources</a> page.</p></div></div>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/jodyheavener/status/1551974535452311552\" target=\"_blank\" rel=\"noopener noreferrer\"><p>The plugin system in Docusaurus v2 has made expanding 1Password's developer\nportal so easy and fun. Super excited to show you what we've got cooking up.</p></a></blockquote><figcaption><a href=\"https://x.com/jodyheavener\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Jody Heavener\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/jodyheavener\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Jody Heavener</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Senior Developer at 1Password</small></div></div></a></figcaption></figure>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"theming\">Theming<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#theming\" class=\"hash-link\" aria-label=\"Direct link to Theming\" title=\"Direct link to Theming\">​</a></h3>\n<p>Theming is one of the most important features of Docusaurus: we believe a professional documentation site should <strong>respect your company's branding</strong> and create a consistent experience.</p>\n<p>Docusaurus theming gives a lot of <strong>flexibility</strong> on multiple levels:</p>\n<ul>\n<li>Customize CSS variables to adjust colors, fonts, and more</li>\n<li>Provide your own CSS stylesheets</li>\n<li>Implement your own theme from scratch</li>\n<li><strong>Override any React component</strong> provided by our default theme: we call this <a href=\"https://docusaurus.io/docs/swizzling\" target=\"_blank\" rel=\"noopener noreferrer\">swizzling</a></li>\n</ul>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/hung_dev/status/1546918275065741312\" target=\"_blank\" rel=\"noopener noreferrer\"><p>I love Docusaurus Swizzling feature. It’s opinionated and flexible at the same\ntime. This is super cool since a framework usually needs to sacrifice one for\nthe other.</p></a></blockquote><figcaption><a href=\"https://x.com/hung_dev\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"\nHung Viet Nguyen\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/hung_dev\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>\nHung Viet Nguyen</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Creator of JestPreview</small></div></div></a></figcaption></figure>\n<p>This enables users willing to invest a bit more time on <strong>customizations</strong> to build sites that <strong>look different</strong> from others.</p>\n<div class=\"cssCarousel_jWvs\" style=\"aspect-ratio:1.7989949748743719\"><div class=\"cssCarouselSlider_nIAN\" style=\"aspect-ratio:1.7989949748743719\"><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJbY7s3o99Xo+tPk+8DK/MbA+ci/98HB98DM+Ji26gDK3ej//Pzy8vLs6+rn6u74+vn////x8u/w7OXE1uoA0d7p////7u/w4uPm6Ojq7e7z8/T309PW19fWub7UANTd6P/+/vj4+Pj4+fr6/Pr7/fb3+tve5/3//tCzxADZ3en8///0+Pn1+vv2+/v2+/vz+fvO2ef3///crLoA1ZzJ1Zqj2ZSP2ol814F12H1z2Hhv1HFq23lw42ZvKQ2aZPs/3GIAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/ionic.7f10b53.640.png srcset=\"/assets/ideal-img/ionic.7f10b53.640.png 640w,/assets/ideal-img/ionic.cd19b49.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://ionicframework.com/docs/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Ionic</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAwklEQVR4nAXBPWvCQBgA4Pu7UhQsUh2Kk2sXF8Ghkz/BqdqCIBkUbf1Ag5GKaFsjyZ2X+3ovd+bt85BuxD9jszip6T6bzPVsBMFQfLzzt/Gt0/8jy3OCWFCasvSaZdR7i17fnUSEIIzJ4vvi81xIBZAbcNY6kMIIgd5MZ0eyin6cBSU1ZTJOtFRWcXZLWYH5cfRFosO1QJQGuJBCG3COZYIybhGTQUDC18mm2wvbL5vW07pZ3T5Xw3p5V3vYNSq/pcd/0kecLyndd98AAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/outerbounds.7fa8be7.640.png srcset=\"/assets/ideal-img/outerbounds.7fa8be7.640.png 640w,/assets/ideal-img/outerbounds.17abaf6.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://outerbounds.com/docs/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Outerbounds</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AIyt27SXz7ud17eW2bGD269z3qhv3p5x3ZJw2X1+2gDIyeH52u/XwdTDq8LRu8/SvdLQu9Hm1+j/8//EzewAz9ro+/j+3dzizczR1NPY19XbxMHIxLzH49/hvb7XANTW5/ft+Pr3+//+/v39/f///8S+xUIjSS8XPIZdfwDW1ub39v3y9Pju8fTy9vj///+4uMImFDceEjeUVXkA1pzJ1Jej2JKO2IZ61oB024B1zGpjrUNDrERE11Vl8lGDEKxF5owAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/courier.e9b71f4.640.png srcset=\"/assets/ideal-img/courier.e9b71f4.640.png 640w,/assets/ideal-img/courier.f8addf0.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://www.courier.com/docs/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Courier</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFyguGaElrfL3djp/8zP+MvA98e99b7C97yt3pmd1QBLYG0jIii6u77x7+3s7On+//z+/fr8/vz/9/PHy+EAVWRzKCszvb/C6uvr4ODi7+7w8vHz8vL0////ztToAFxmdSkrM7/Bw/Ty8ujo6Ors6/T09P38/P///+PF1QBXXW0bIyu4vcDk7OzZ3+Dc4eLn7e72+fr9///uvssAuYCtpGl0zYeD2Ip70n1x13xy13du2XVs3Hpx52tzWcaFkyvPIw8AAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/quickwit.aae4257.640.png srcset=\"/assets/ideal-img/quickwit.aae4257.640.png 640w,/assets/ideal-img/quickwit.e851c05.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://quickwit.io/docs/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Quickwit</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAvElEQVR4nCXJPQ/BQBgA4Pu9FqSDIBKjicFmEIPERmwkWCQkREvQpr4SJK7otb1DtXp3r4hnfVBhZrfmZHpg6uGpLkJt+BkP/H6PNjqs2LyhWmfZ7por82RZl3foCxBSSi4iABgaDlJ3FucCM/9IGKYv2/+QgLNAAIC2xEjfYwBJXM/1vIj/CcF/fR7paLO3JIBD6eVuXx2XsAd9B2H0e2cwRUZ1olfqZrlkFrLrvGLklE06sUvFt5kkjilfulmaxNksu3AAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/dyte.b411d0a.640.png srcset=\"/assets/ideal-img/dyte.b411d0a.640.png 640w,/assets/ideal-img/dyte.9d967ec.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://docs.dyte.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Dyte</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AGaqwXuXqIWWqoKSqoKEroN1rYF2rXVzq32Jt22MwAC/0drp4uDF0NSpvcS+0dTI3N6909nQ3N789+++0eQA0+Dp///90urysdjlttrmuN3rpsXg0+Xw////ztPoANTc5vv5+PTy8ejk5O3p6fn19fz39f36+f///+PG1QDZ3Of09/bv8/Xq7/Hz+Pr0+vv0+vz5/Pz9///uvssA1p3J05eh1Y+L1IN22YN32X9023px3Hhv23pw52pzwqeO97QIzhcAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/react-native.9ad7a23.640.png srcset=\"/assets/ideal-img/react-native.9ad7a23.640.png 640w,/assets/ideal-img/react-native.02f5343.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://reactnative.dev/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->React-Native</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFqhu2SFmW2FnGR7l2Bpl2Fcl1pXk1dblk1lm1N7tgBGXm0VGyImLjUhKC0cJCgdJykbJSYWHyERHB0sSGIASl1sGSIqJi81KzI4KDA1JCsxJSwyISkvGiAiOUJZAFJgbxwkLCYuNiUtNR8nLiIqMh8mLiQqMhooLk42TABOWWkPHSUbKTMgMkEcLTsjNEEdMD4hMD4XNEFYMUUAtn6soWhzqmZjqFpPplJIqFBHqElCq0lCp0hAxUpUim0yiR9LFnEAAAAASUVORK5CYII=&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/hasura.e4f3ebd.640.png srcset=\"/assets/ideal-img/hasura.e4f3ebd.640.png 640w,/assets/ideal-img/hasura.226d6d3.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://hasura.io/docs/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Hasura</a></div></div><div class=\"cssCarouselItem_GXZ2\"><div class=\"cssCarouselContent_dGP2\"><div style=\"background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAtElEQVR4nB3MSwtBQRiH8fm+SkoSycLOykI2ZOUb2CqxILlEJ5dDlFyaFIccnZk5877zF+un3yMah3B+UytpvJOZLsykb0Y90+urzjCstaVYyhcAdg6Ati6M6RFGlhiIB/5d+JcnAGMptsTETKyUUTomsjNPisP1l91fR5rfEQdvzUQAzsO1OJ4DAIqcIheR+1j3+Gj9vwfdidg0x+t6a1ut7MoFv5Txi+ldLrXPJvf5lEykv9L2nupSFk8xAAAAAElFTkSuQmCC&quot;)\"><svg style=\"width:100%;height:auto;max-width:100%;margin-bottom:-4px\" width=\"640\" height=\"356\"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/assets/ideal-img/datagit.98630dd.640.png srcset=\"/assets/ideal-img/datagit.98630dd.640.png 640w,/assets/ideal-img/datagit.afeea1f.1030.png 1030w\" width=640 height=356></noscript></div><a href=\"https://www.datagit.ir/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"siteLink_IglZ\">🔗 <!-- -->Datagit</a></div></div><button class=\"navButton_qSul navButtonPrev_SxeT\" type=\"button\">&lt;</button><button class=\"navButton_qSul navButtonNext_yu77\" type=\"button\">&gt;</button></div></div>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/dabit3/status/1382855449813389315\" target=\"_blank\" rel=\"noopener noreferrer\"><p>So far it’s working out really nicely. It’s been really easy to style up the\nway that we wanted it to look. No blockers at all.</p></a></blockquote><figcaption><a href=\"https://x.com/dabit3\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Nader Dabit\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/dabit3\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Nader Dabit</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">Web3 developer, Developer DAO founder</small></div></div></a></figcaption></figure>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"other-features\">Other features<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#other-features\" class=\"hash-link\" aria-label=\"Direct link to Other features\" title=\"Direct link to Other features\">​</a></h3>\n<p>Docusaurus 2 comes with a very long list of useful features:</p>\n<ul>\n<li>Theme: dark mode, better UI and UX, flexible <code>themeConfig</code> options...</li>\n<li>Docs versioning: flexible plugin options to adapt to your workflow</li>\n<li>Docs sidebar: collapsible category, category index pages...</li>\n<li>Blog: multiple authors, authors map, archive page...</li>\n<li>Markdown: tabs, math equations, live code blocks, linking, flexible front matter...</li>\n<li>Search: use the new Algolia DocSearch 3 experience</li>\n<li>Assets: make it easy to incorporate images and other kinds of files</li>\n<li>Internationalization: config options, default theme translations...</li>\n<li>Accessibility: aria labels, color contrasts, skip-to-content, keyboard navigation, progressive enhancement...</li>\n<li>SEO: sensible defaults, easy to customize, canonical url, social card, no-index, sitemap, microdata, hreflang...</li>\n<li>PWA: add offline support to your site, and make it installable</li>\n<li>Fail-fast: strict config validation, detect broken links, and prevent bad production deployments</li>\n<li>TypeScript support for config files, plugins, custom pages and theme authors</li>\n<li>Playgrounds: assess Docusaurus easily from your browser with <a href=\"https://docusaurus.new/\" target=\"_blank\" rel=\"noopener noreferrer\">docusaurus.new</a></li>\n<li>Canary releases: use the @canary npm tag to use the upcoming release before anyone else</li>\n<li>Tests: Docusaurus is well-tested, we dogfood features and ensure they keep working</li>\n</ul>\n<figure class=\"tweetQuote_h8Rz\"><blockquote><a href=\"https://x.com/alexbdebrie/status/1540010328335032320\" target=\"_blank\" rel=\"noopener noreferrer\"><p>Recently, I was shocked at how good Docusaurus is out of the box. Super solid,\na good bit of configuration without being overwhelming, and the ability to\nreally customize the styling if you're braver than I am.</p></a></blockquote><figcaption><a href=\"https://x.com/alexbdebrie\" target=\"_blank\" rel=\"nofollow\"><div class=\"avatar\"><img alt=\"Alex DeBrie\" class=\"avatar__photo avatarImg_b51M\" src=\"https://unavatar.io/x/alexbdebrie\"><div class=\"avatar__intro\"><strong class=\"avatar__name\"><cite>Alex DeBrie</cite></strong><small class=\"avatar__subtitle\" itemprop=\"description\">AWS Data Hero, author of The DynamoDB Book</small></div></div></a></figcaption></figure>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"why-20-now\">Why 2.0 now?<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#why-20-now\" class=\"hash-link\" aria-label=\"Direct link to Why 2.0 now?\" title=\"Direct link to Why 2.0 now?\">​</a></h2>\n<p>Many enthusiastic followers of ours have been curious <strong>why it took us 4 years to release Docusaurus 2.0</strong>, considering the beta is already successful and <strong>widely used in production</strong>.</p>\n<p>The reason is that we aim to <strong>respect <a href=\"https://semver.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Semantic Versioning</a></strong>, which means we will be incrementing the major version number whenever we release a <strong>breaking change</strong>.</p>\n<p>It is important for multiple reasons:</p>\n<ul>\n<li>It <strong>guarantees simple minor version upgrades</strong>, as long as you only use the <a href=\"https://coinsgpt.github.io/community/release-process#public-api-surface\">public API</a></li>\n<li>It follows front-end ecosystem conventions</li>\n<li>A new major version is an opportunity to thoroughly document breaking changes</li>\n<li>A new major/minor version is an opportunity to communicate new features through a blog post</li>\n</ul>\n<p>The problem is that our flexible theming system inherently creates a very <strong>implicit API surface</strong> on which it is <strong>hard to know what is a breaking change</strong> in the first place. Highly customized Docusaurus sites sometimes have a hard time upgrading Docusaurus because they achieve customizations using internal APIs. We dedicated time to extensive theme refactors and clearly defining our <a href=\"https://coinsgpt.github.io/community/release-process#public-api-surface\">public API</a>, so that future code changes can be made more safely. We will continue to expand this public theming API so that the most common site customizations do not need to use any internal API.</p>\n<div class=\"theme-admonition theme-admonition-info admonition_o5H7 alert alert--info\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_Knsx\"><p>From now on, Docusaurus will <strong>release new major versions more frequently</strong>. In practice, you can expect a <strong>new major version every 2 to 4 months</strong>.</p><p><a href=\"https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html\" target=\"_blank\" rel=\"noopener noreferrer\">Major version numbers are not sacred</a>, but we still group breaking changes together and avoid releasing major versions too often.</p><p>Check our <a href=\"https://coinsgpt.github.io/community/release-process\">release process</a> documentation for details.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"whats-next\">What's Next?<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#whats-next\" class=\"hash-link\" aria-label=\"Direct link to What's Next?\" title=\"Direct link to What's Next?\">​</a></h2>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Slash Up and Running\" src=\"https://coinsgpt.github.io/assets/images/slash-up-and-running-1c1f83f3064dcd56be41632c51be62ac.png\" width=\"760\" height=\"160\" class=\"img_vXGZ\"></p>\n<p>The work on Docusaurus 3.0 has started, and this next version will be released only in a few months. We will <strong>backport retro-compatible changes in Docusaurus 2.x</strong> minor versions to make them available as soon as possible to the community on a stable channel.</p>\n<p>A sample of the features on our roadmap for the upcoming major versions of Docusaurus:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4029\" target=\"_blank\" rel=\"noopener noreferrer\">Upgrade to MDX 2.0</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4625\" target=\"_blank\" rel=\"noopener noreferrer\">Improve Markdown infrastructure</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/6114\" target=\"_blank\" rel=\"noopener noreferrer\">Improve theming and swizzle</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/2961\" target=\"_blank\" rel=\"noopener noreferrer\">TailwindCSS theme</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/7227\" target=\"_blank\" rel=\"noopener noreferrer\">Theme; support custom item types for navbar, doc sidebar, blog sidebar, footer</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4389\" target=\"_blank\" rel=\"noopener noreferrer\">Dynamic navbar: navbar item activation strategies</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/2968\" target=\"_blank\" rel=\"noopener noreferrer\">Custom Social Cards</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/3236\" target=\"_blank\" rel=\"noopener noreferrer\">CSS-in-JS support</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/6520\" target=\"_blank\" rel=\"noopener noreferrer\">Use Node.js ES Modules</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4765\" target=\"_blank\" rel=\"noopener noreferrer\">Improve build time performance</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4138\" target=\"_blank\" rel=\"noopener noreferrer\">Extend Docusaurus plugins, CMS integration</a></li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"thank-you\">Thank You<a href=\"https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0#thank-you\" class=\"hash-link\" aria-label=\"Direct link to Thank You\" title=\"Direct link to Thank You\">​</a></h2>\n<p>We'd like to express our gratitude to <a href=\"https://github.com/facebook/docusaurus/graphs/contributors\" target=\"_blank\" rel=\"noopener noreferrer\">all our contributors</a>, including:</p>\n<ul>\n<li>The Docusaurus core team: <a href=\"https://github.com/lex111\" target=\"_blank\" rel=\"noopener noreferrer\">Alexey Pyltsyn</a>, <a href=\"https://github.com/Josh-Cena\" target=\"_blank\" rel=\"noopener noreferrer\">Joshua Chen</a>, <a href=\"https://github.com/slorber\" target=\"_blank\" rel=\"noopener noreferrer\">Sébastien Lorber</a>, <a href=\"https://github.com/yangshun\" target=\"_blank\" rel=\"noopener noreferrer\">Yangshun Tay</a> and all our <a href=\"https://docusaurus.io/community/team\" target=\"_blank\" rel=\"noopener noreferrer\">former team members</a></li>\n<li><a href=\"https://github.com/JoelMarcey\" target=\"_blank\" rel=\"noopener noreferrer\">Joel Marcey</a> for creating Docusaurus 1.0 and supporting the Docusaurus 2.0 project at Meta Open Source</li>\n<li><a href=\"https://github.com/zpao\" target=\"_blank\" rel=\"noopener noreferrer\">Paul O’Shannessy</a> for supporting the development of all the next versions of Docusaurus at Meta Open Source</li>\n<li><a href=\"https://github.com/ericnakagawa\" target=\"_blank\" rel=\"noopener noreferrer\">Eric Nakagawa</a> for creating our cutest mascot Slash</li>\n<li><a href=\"https://github.com/endiliey\" target=\"_blank\" rel=\"noopener noreferrer\">Endilie Yacop Sucipto</a> for his significant <a href=\"https://coinsgpt.github.io/blog/2020/01/07/tribute-to-endi\">initial work on Docusaurus v2</a></li>\n<li><a href=\"https://github.com/shortcuts\" target=\"_blank\" rel=\"noopener noreferrer\">Clément Vannicatte</a>, <a href=\"https://github.com/Shipow\" target=\"_blank\" rel=\"noopener noreferrer\">Kevin Granger</a> and the whole Algolia team for their support</li>\n<li>All the community members for making valuable code contributions, improving our documentation, and answering questions on <a href=\"https://discordapp.com/invite/docusaurus\" target=\"_blank\" rel=\"noopener noreferrer\">Discord</a></li>\n</ul>\n<p>We'd like to thank in particular all our <strong>Docusaurus 2.0 early adopters</strong> for assessing its alpha, beta and canary releases, providing a ton of <strong>invaluable feedback</strong>. We sincerely hope you had a great experience using it, and that you will continue to provide feedback on the upcoming pre-releases of Docusaurus 3.0.</p>\n<p>At <a href=\"https://opensource.fb.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Meta Open Source</a>, Docusaurus is one of our <strong>most successful projects</strong>. We can't wait to see all the outstanding documentation websites that you will create! Don't forget to <strong>submit them to our <a href=\"https://coinsgpt.github.io/showcase\">site showcase</a></strong>!</p>\n<p><strong>Now, let your imagination run wild 🤪!</strong></p>\n<p>— Slash</p>\n<div class=\"theme-admonition theme-admonition-info admonition_o5H7 alert alert--info\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>We are on <a href=\"https://www.producthunt.com/posts/docusaurus-2-0\" target=\"_blank\" rel=\"noopener noreferrer\">ProductHunt</a> and <a href=\"https://news.ycombinator.com/item?id=32303052\" target=\"_blank\" rel=\"noopener noreferrer\">Hacker News</a>!</div><div class=\"admonitionContent_Knsx\"><p>🙏 Share your experience using Docusaurus with the community!</p><div style=\"display:flex\"><a href=\"https://www.producthunt.com/posts/docusaurus-2-0?utm_source=badge-featured&amp;utm_medium=badge&amp;utm_souce=badge-docusaurus-2-0\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"producthunt-badge-widget\" style=\"display:block;width:250px;height:54px\"><img class=\"producthunt-badge-widget\" src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=353916&amp;theme=light\" alt=\"Docusaurus 2.0 - Build optimized websites quickly, focus on your content. | Product Hunt\" style=\"width:250px;height:54px;max-width:initial\" width=\"250\" height=\"54\"></a><a href=\"https://news.ycombinator.com/item?id=32303052\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display:block;width:54px;height:54px\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" width=\"54\" height=\"54\"><path fill=\"#FF6D00\" d=\"M42 42H6V6h36v36z\"></path><path fill=\"#FFF\" d=\"M8 8v32h32V8H8zm30 30H10V10h28v28z\"></path><path fill=\"#FFF\" d=\"M23 32h2v-6l5.5-10h-2.1L24 24.1 19.6 16h-2.1L23 26z\"></path></svg></a></div></div></div>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Slash plushies\" src=\"https://coinsgpt.github.io/assets/images/slash-plushies-71b7a47477442dfcf890627669aba97d.jpg\" width=\"1332\" height=\"1331\" class=\"img_vXGZ\"></p>",
            "url": "https://coinsgpt.github.io/blog/2022/08/01/announcing-docusaurus-2.0",
            "title": "Announcing Docusaurus 2.0",
            "summary": "Today we are extremely happy to finally announce Docusaurus 2.0! 🥳️",
            "date_modified": "2022-08-01T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/2022/01/24/docusaurus-2021-recap",
            "content_html": "<p>Docusaurus has made great progress in 2021! We've seen a lot of traction and just crossed <strong>30k stars on GitHub</strong>!</p>\n<p>We've <strong>reached full feature parity</strong> with v1 after <a href=\"https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n\">the release of internationalization</a>, <a href=\"https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta\">announced our <strong>first beta</strong></a>, and welcomed <strong>significantly more users</strong> this year.</p>\n<p>The <strong>official v2 release</strong> is just around the corner! Follow the <a href=\"https://github.com/facebook/docusaurus/issues/6113\" target=\"_blank\" rel=\"noopener noreferrer\">roadmap issue</a> for any latest news.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://coinsgpt.github.io/assets/images/thumbnail-dbb46fec970f4431a6846603224dd2fe.png\" width=\"1000\" height=\"562\" class=\"img_vXGZ\"></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"highlights\">Highlights<a href=\"https://coinsgpt.github.io/blog/2022/01/24/docusaurus-2021-recap#highlights\" class=\"hash-link\" aria-label=\"Direct link to Highlights\" title=\"Direct link to Highlights\">​</a></h2>\n<p>Let's begin by going over a few highlights this year. Remember the <a href=\"https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta#whats-next\">todo-list</a> from half a year ago? Time to take it out again and see how far we've come!</p>\n<ul>\n<li><strong>Internationalization</strong>: officially released four months after its initial landing in late 2020. Seen great success in <a href=\"https://coinsgpt.github.io/showcase?tags=i18n\">many projects</a></li>\n<li><strong>Autogenerated sidebars</strong>: no need to maintain a big <code>sidebars.js</code> anymore</li>\n<li><strong>Webpack 5</strong>: significantly improved build performance</li>\n<li><strong>Trailing slash config</strong>: seamless integration with any content hosting provider</li>\n<li><strong>Redesigned mobile navigation</strong>: mobile users now enjoy all navigation features as on desktop</li>\n<li><strong>UI improvements</strong>: more accessible quotes, better admonitions, back-to-top button...</li>\n<li><strong>Blog multi-authors</strong>: credit all the amazing contributors that collaborated on one blog post!</li>\n<li><strong>More blog features</strong>: archive page, structured data for SEO, full post content in feeds – empowering you to ship a fully-featured blog in no time</li>\n<li><strong>Asset collocation</strong>: no need for a bloated static folder anymore: colocate your images with Markdown files</li>\n<li><strong>Sidebar category index pages</strong>: category labels can now be associated with pages, enabling better doc organization</li>\n</ul>\n<p>Our codebase has been polished over time as well. We have improved test coverage, migrated all packages to TypeScript, and reduced our published bundle size by a maximum of 60%!</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"trends\">Trends<a href=\"https://coinsgpt.github.io/blog/2022/01/24/docusaurus-2021-recap#trends\" class=\"hash-link\" aria-label=\"Direct link to Trends\" title=\"Direct link to Trends\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"npm\">npm<a href=\"https://coinsgpt.github.io/blog/2022/01/24/docusaurus-2021-recap#npm\" class=\"hash-link\" aria-label=\"Direct link to npm\" title=\"Direct link to npm\">​</a></h3>\n<p>Docusaurus v2 continues to grow steadily. V2 installation is now 8 times more than v1. In terms of weekly downloads, we have witnessed another three-fold increase (+209.4%), growing from 28,066 in early January to a peak of 86,846 in mid-December.</p>\n<p><a href=\"https://www.npmtrends.com/docusaurus-vs-@docusaurus/core\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus v1 vs. v2 npm trends of the year 2021. The installations of Docusaurus v2 is constantly rising, while v1 is almost constant. V1 stays at 10000, while v2 grows from 30000 to almost 90000. There&amp;#39;s a sharp drop from 90000 to 40000 just before the Jan 2022 line.\" src=\"https://coinsgpt.github.io/assets/images/npm-trend-1e69b5c9e35be8bd6d9ac6fbaaf313d7.png\" width=\"800\" height=\"483\" class=\"img_vXGZ\"></a></p>\n<p>(Ah, the classic Christmas dip...)</p>\n<p>We released 18 versions, going from <code>2.0.0-alpha.71</code> to <code>2.0.0-beta.14</code>. That's one release every 20 days!</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"github\">GitHub<a href=\"https://coinsgpt.github.io/blog/2022/01/24/docusaurus-2021-recap#github\" class=\"hash-link\" aria-label=\"Direct link to GitHub\" title=\"Direct link to GitHub\">​</a></h3>\n<ul>\n<li><strong>Stars</strong>: 20,460 → 29,679 (+45.1% y/y). And, just before this blog post is published, we have reached 30k stars!</li>\n<li><strong>Total contributors</strong>: 512 → 773 (+51.0% y/y)</li>\n<li><strong>Dependents</strong>: 5,039 → 14,579 (+189.3% y/y) for v2, and 6,311 → 7,581 (+20.1% y/y) for v1</li>\n<li><strong>Commits</strong>: 1,187 commits in the past year, averaging 23 commits every week</li>\n<li><strong>Issues</strong>: 619 issues opened, 505 of them eventually resolved</li>\n<li>A <a href=\"https://github.com/Josh-Cena\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>new core team member</strong></a> (yep, that's me 😝)</li>\n</ul>\n<p>Our star trend is also very positive. Compared to similar projects, we are <strong>growing at a faster rate</strong>:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Stars trend by year of 9 static site generators. Next.js grows the fastest, with Docusaurus at the 4th place in terms of growth rate.\" src=\"https://coinsgpt.github.io/assets/images/star-history-c7ba492b822fed1336d08fe449f87840.png\" width=\"800\" height=\"550\" class=\"img_vXGZ\"></p>\n<p>With an 8.4k increase in stars, we are ranked number 3 in this year's <a href=\"https://risingstars.js.org/2021/en#section-ssg\" target=\"_blank\" rel=\"noopener noreferrer\">JavaScript rising stars of static site generators</a>, preceded only by Next.js and Astro.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus placing 3rd in the &amp;quot;Static Sites&amp;quot; ranking list\" src=\"https://coinsgpt.github.io/assets/images/rising-stars-56326450d25b95f221f56db3b352c724.png\" width=\"600\" height=\"412\" class=\"img_vXGZ\"></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"featured-adoptions\">Featured adoptions<a href=\"https://coinsgpt.github.io/blog/2022/01/24/docusaurus-2021-recap#featured-adoptions\" class=\"hash-link\" aria-label=\"Direct link to Featured adoptions\" title=\"Direct link to Featured adoptions\">​</a></h2>\n<p>Our showcase has welcomed a few new <a href=\"https://coinsgpt.github.io/showcase?tags=favorite\">\"favorite\" sites</a> that showcase the true potential of Docusaurus 2's pluggable architecture.</p>\n<ul>\n<li><a href=\"https://wiki.iota.org/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>IOTA-wiki</strong></a></li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Iota wiki light mode\" src=\"https://coinsgpt.github.io/assets/images/iota-light-d899be0c1eb939a5ad13e2ecca4eb951.png#gh-light-mode-only\" width=\"800\" height=\"456\" class=\"img_vXGZ\"><img decoding=\"async\" loading=\"lazy\" alt=\"Iota wiki dark mode\" src=\"https://coinsgpt.github.io/assets/images/iota-dark-986d9518ba0e03583d734212ba93539d.png#gh-dark-mode-only\" width=\"800\" height=\"456\" class=\"img_vXGZ\"></p>\n<ul>\n<li><a href=\"https://docs.dyte.io/docs/home/introduction/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Dyte</strong></a></li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Dyte light mode\" src=\"https://coinsgpt.github.io/assets/images/dyte-light-24caa76f96400453386185ae6bc06b8a.png#gh-light-mode-only\" width=\"800\" height=\"454\" class=\"img_vXGZ\"><img decoding=\"async\" loading=\"lazy\" alt=\"Dyte dark mode\" src=\"https://coinsgpt.github.io/assets/images/dyte-dark-b9748e4bcb4281880ff1856519d58b38.png#gh-dark-mode-only\" width=\"800\" height=\"454\" class=\"img_vXGZ\"></p>\n<ul>\n<li><a href=\"https://ionicframework.com/docs\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Ionic</strong></a></li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Ionic light mode\" src=\"https://coinsgpt.github.io/assets/images/ionic-light-b8a9c77c71a99f4c71a16584dac8ccf3.png#gh-light-mode-only\" width=\"800\" height=\"456\" class=\"img_vXGZ\"><img decoding=\"async\" loading=\"lazy\" alt=\"Ionic dark mode\" src=\"https://coinsgpt.github.io/assets/images/ionic-dark-17086f816052f02e84054fe002256ed9.png#gh-dark-mode-only\" width=\"800\" height=\"456\" class=\"img_vXGZ\"></p>\n<ul>\n<li><a href=\"https://www.courier.com/docs/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Courier</strong></a></li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Courier\" src=\"https://coinsgpt.github.io/assets/images/courier-624bbae7cbef3b4e7533d1976e35f842.png\" width=\"800\" height=\"454\" class=\"img_vXGZ\"></p>\n<p>The creativity of Docusaurus users is beyond our imagination 🤩 We look forward to more and more adopters leveraging the content features of Docusaurus while exploring original theme designs! If your site uses Docusaurus, we would love to <a href=\"https://github.com/facebook/docusaurus/edit/main/website/src/data/users.tsx\" target=\"_blank\" rel=\"noopener noreferrer\">have it in our showcase</a>.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"community\">Community<a href=\"https://coinsgpt.github.io/blog/2022/01/24/docusaurus-2021-recap#community\" class=\"hash-link\" aria-label=\"Direct link to Community\" title=\"Direct link to Community\">​</a></h2>\n<p>As an active moderator on <a href=\"https://discord.gg/docusaurus\" target=\"_blank\" rel=\"noopener noreferrer\">Discord</a>, I can clearly see the community thriving. Many frequently asked questions are now integrated into our documentation, and some feature requests have been implemented as well. The project and the community reciprocally benefit each other – case in point, I was formerly a community contributor before becoming a maintainer.</p>\n<p>We are constantly mentioned on X with inspirational feedback:</p>\n<blockquote>\n<p><strong>@docusaurus</strong> is amazing! cant believe it's THAT simple to use.</p>\n</blockquote>\n<blockquote>\n<p>No extra plugins, tooling or compilation steps. It just works out of the box.</p>\n</blockquote>\n<blockquote>\n<p>I love <strong>@docusaurus</strong>. I couldn't have built the APIs, tutorials, and blogs contained in my site efficiently and beautifully in my workflow without Docusaurus.</p>\n</blockquote>\n<p>And we keep every one of them in <a href=\"https://x.com/sebastienlorber/timelines/1392048416872706049\" target=\"_blank\" rel=\"noopener noreferrer\">our little box</a> 😄 If you enjoy Docusaurus yourself, keep tagging us with your comments!</p>\n<p>As we approach the official release, we are interested in knowing more about what people are doing out there: <a href=\"https://github.com/facebook/docusaurus/discussions/4025\" target=\"_blank\" rel=\"noopener noreferrer\">plugin authors</a>, <a href=\"https://github.com/facebook/docusaurus/discussions/5468\" target=\"_blank\" rel=\"noopener noreferrer\">creators of customized sites</a>, and <a href=\"https://github.com/facebook/docusaurus/discussions/4610\" target=\"_blank\" rel=\"noopener noreferrer\">all new users</a> – please keep us posted about your achievements so we can steer our development to better serve your needs.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"going-forward\">Going forward<a href=\"https://coinsgpt.github.io/blog/2022/01/24/docusaurus-2021-recap#going-forward\" class=\"hash-link\" aria-label=\"Direct link to Going forward\" title=\"Direct link to Going forward\">​</a></h2>\n<p>In the past few months, we have been constantly speaking about the release-candidate phase of Docusaurus, and yes, it's almost there. We have created a dedicated <a href=\"https://github.com/facebook/docusaurus/milestone/15\" target=\"_blank\" rel=\"noopener noreferrer\">milestone</a> to keep track of all issues to solve before we can confidently progress to the next stage. In short, we want to build a <strong>more robust theming workflow</strong>, empowering creative site creators to customize our default theme without fearing breaking changes as they upgrade. This will include:</p>\n<ul>\n<li>Guidelines on <strong>component organization</strong>. We want the theme components to have the right granularity so when you want to customize a part of your site, there's always a component doing just what you need.</li>\n<li>Improvements to the <strong>swizzle CLI</strong>. We want users to use it with delight and let it aid you through all possible swizzling scenarios.</li>\n<li>Refactoring our <strong>theme APIs</strong>. We want all swizzlable components to be actually appropriate for swizzling, so non-UI components will be re-located.</li>\n<li><strong>Docs</strong>. We want our docs to be maximally accessible to everyone – from first-time coders to experienced web developers. We will organize it as a more progressive tutorial that can be beneficial for every skill level.</li>\n</ul>\n<p>Read more about plans for Docusaurus 2.0 in this <a href=\"https://github.com/facebook/docusaurus/issues/6113\" target=\"_blank\" rel=\"noopener noreferrer\">roadmap issue</a>. 2.0 will be a greater release with the help from the community, so please share your opinions and suggestions under any of the milestone issues!</p>\n<p>As the core team is working hard to ship the general availability release, we plan to release other useful features as minor versions after 2.0. We have even made further plans for <a href=\"https://github.com/facebook/docusaurus/milestone/16\" target=\"_blank\" rel=\"noopener noreferrer\">architectural changes in 3.0</a>!</p>\n<p>With the official release of Docusaurus 2.0, we are confident to see much more new adoptions and migrations from v1.</p>\n<p>We'd like to express our gratitude to <a href=\"https://github.com/facebook/docusaurus/graphs/contributors?from=2021-01-01&amp;to=2022-01-01&amp;type=c\" target=\"_blank\" rel=\"noopener noreferrer\">all the contributors in 2021</a>, including:</p>\n<ul>\n<li>The core team: <a href=\"https://github.com/lex111\" target=\"_blank\" rel=\"noopener noreferrer\">Alexey Pyltsyn</a>, <a href=\"https://github.com/slorber\" target=\"_blank\" rel=\"noopener noreferrer\">Sébastien Lorber</a>, <a href=\"https://github.com/Josh-Cena\" target=\"_blank\" rel=\"noopener noreferrer\">Joshua Chen</a>, and <a href=\"https://github.com/yangshun\" target=\"_blank\" rel=\"noopener noreferrer\">Yangshun Tay</a> for moderating the community, publicizing Docusaurus, triaging issues, and implementing new features</li>\n<li><a href=\"https://github.com/JoelMarcey\" target=\"_blank\" rel=\"noopener noreferrer\">Joel Marcey</a> for creating Docusaurus and supporting its development all along</li>\n<li>The Algolia team for helping Docusaurus users <a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration\">migrate to the new DocSearch</a> and answering search-related questions</li>\n<li>All the active community members for making valuable code contributions, improving our documentation, and answering questions on Discord</li>\n</ul>\n<p>So long, 2021, and let's greet a great 2022!</p>",
            "url": "https://coinsgpt.github.io/blog/2022/01/24/docusaurus-2021-recap",
            "title": "Docusaurus 2021 Recap",
            "summary": "Docusaurus has made great progress in 2021! We've seen a lot of traction and just crossed 30k stars on GitHub!",
            "date_modified": "2022-01-24T00:00:00.000Z",
            "author": {
                "name": "Joshua Chen",
                "url": "https://joshcena.com/"
            },
            "tags": [
                "Recap"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration",
            "content_html": "<p><a href=\"https://docsearch.algolia.com/\" target=\"_blank\" rel=\"noopener noreferrer\">DocSearch</a> is migrating to a new, more powerful system, which gives users their own Algolia application and new credentials.</p>\n<p>Docusaurus site owners should upgrade their configuration with their new credentials <strong>by February 1, 2022</strong>, existing search indexes will be frozen and become read-only after this date.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"upgrading-your-docusaurus-site\">Upgrading your Docusaurus site<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#upgrading-your-docusaurus-site\" class=\"hash-link\" aria-label=\"Direct link to Upgrading your Docusaurus site\" title=\"Direct link to Upgrading your Docusaurus site\">​</a></h2>\n<p>In the next few weeks, Docusaurus site owners will receive an email inviting them to join their personal Algolia application.</p>\n<p>This email will include a new <code>appId</code> and <code>apiKey</code> to use in your Docusaurus configuration.</p>\n<p>The only things you have to do:</p>\n<ul>\n<li>Join the Algolia application (eventually creating a new Algolia account)</li>\n<li>Update your site configuration.</li>\n</ul>\n<div class=\"language-js codeBlockContainer_jDV4 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockTitle_U6Q0\">docusaurus.config.js</div><div class=\"codeBlockContent_cKMj\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_Gebt thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_FJaf\"><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#CF222E\">const</span><span class=\"token plain\"> config </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token literal-property property\" style=\"color:#005CC5\">themeConfig</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token literal-property property\" style=\"color:#005CC5\">algolia</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">appId</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'&lt;NEW_APP_ID&gt;'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line theme-code-block-highlighted-line\" style=\"color:#393A34\"><span class=\"token plain\">      </span><span class=\"token literal-property property\" style=\"color:#005CC5\">apiKey</span><span class=\"token operator\" style=\"color:#D73A49\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:#C6105F\">'&lt;NEW_SEARCH_API_KEY&gt;'</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">module</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token property-access\">exports</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#D73A49\">=</span><span class=\"token plain\"> config</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-info admonition_o5H7 alert alert--info\"><div class=\"admonitionHeading_FzoX\"><span class=\"admonitionIcon_rXq6\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>info</div><div class=\"admonitionContent_Knsx\"><p><code>appId</code> is now <strong>required</strong>.</p><p>These keys are not secrets and can be added to your Git repository.</p></div></div>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"docsearch-has-a-new-home\">DocSearch has a new home!<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#docsearch-has-a-new-home\" class=\"hash-link\" aria-label=\"Direct link to DocSearch has a new home!\" title=\"Direct link to DocSearch has a new home!\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"what-is-docsearch\">What is DocSearch?<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#what-is-docsearch\" class=\"hash-link\" aria-label=\"Direct link to What is DocSearch?\" title=\"Direct link to What is DocSearch?\">​</a></h3>\n<p><a href=\"https://docsearch.algolia.com/\" target=\"_blank\" rel=\"noopener noreferrer\">DocSearch</a> is a program created by <a href=\"http://algolia.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Algolia</a>, which offers search to technical documentation of Open Source projects and technical blogs <strong>for free</strong>.</p>\n<p>You can <a href=\"https://docsearch.algolia.com/docs/what-is-docsearch/\" target=\"_blank\" rel=\"noopener noreferrer\">read more here</a>, and <a href=\"https://docsearch.algolia.com/apply\" target=\"_blank\" rel=\"noopener noreferrer\">apply</a> if you'd like to give it a try!</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"what-is-this-migration-about\">What is this migration about?<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#what-is-this-migration-about\" class=\"hash-link\" aria-label=\"Direct link to What is this migration about?\" title=\"Direct link to What is this migration about?\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"motivation\">Motivation<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#motivation\" class=\"hash-link\" aria-label=\"Direct link to Motivation\" title=\"Direct link to Motivation\">​</a></h3>\n<p>With the upcoming stable release of <a href=\"https://docsearch.algolia.com/docs/DocSearch-v3\" target=\"_blank\" rel=\"noopener noreferrer\">DocSearch UI</a>, we wanted to go further and provide better tooling for our users to improve their search, but also leverage the full potential of Algolia.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"whats-new\">What's new?<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#whats-new\" class=\"hash-link\" aria-label=\"Direct link to What's new?\" title=\"Direct link to What's new?\">​</a></h3>\n<p>DocSearch now leverages the <a href=\"https://www.algolia.com/products/search-and-discovery/crawler/\" target=\"_blank\" rel=\"noopener noreferrer\">Algolia Crawler</a>, which includes a web interface that will allow you to:</p>\n<ul>\n<li>Start, schedule and monitor your crawls</li>\n<li>Edit your config file from a live editor</li>\n<li>Test your results with DocSearch v3</li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"The Algolia crawler front page showing the project&amp;#39;s overview, such as last complete crawl and indices\" src=\"https://coinsgpt.github.io/assets/images/crawler-overview-6224cc4c7b20511010652f3f4ed5904e.png\" width=\"3832\" height=\"1882\" class=\"img_vXGZ\"></p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"The Algolia config editor opened to the docusaurus-2 config. The right pane shows the results for index and various facet filters.\" src=\"https://coinsgpt.github.io/assets/images/editor-823e50dbed8e508bd5a69c708bab8928.png\" width=\"3832\" height=\"1880\" class=\"img_vXGZ\"></p>\n<p>But also, more Algolia features in <strong>your own Algolia app</strong>:</p>\n<ul>\n<li>Team management</li>\n<li>Browse and see how your records are indexed in Algolia</li>\n<li>Try other Algolia features with free trials</li>\n</ul>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"The Algolia index overview page, showing various filters and the details of every single index\" src=\"https://coinsgpt.github.io/assets/images/index-overview-ca216346e6eee6881443644b6d7d8fe8.png\" width=\"3834\" height=\"1882\" class=\"img_vXGZ\"></p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"The Algolia index analytics page, showing trends for total users, total searches, etc.\" src=\"https://coinsgpt.github.io/assets/images/index-analytics-f9c27da3900de6206e949736b1cd8101.png\" width=\"3810\" height=\"1876\" class=\"img_vXGZ\"></p>\n<p>And of course, <strong>a lot more, for free</strong>.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"faq\">FAQ<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#faq\" class=\"hash-link\" aria-label=\"Direct link to FAQ\" title=\"Direct link to FAQ\">​</a></h2>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"im-using-docusaurus-and-docsearch-can-i-migrate\">I'm using Docusaurus and DocSearch, can I migrate?<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#im-using-docusaurus-and-docsearch-can-i-migrate\" class=\"hash-link\" aria-label=\"Direct link to I'm using Docusaurus and DocSearch, can I migrate?\" title=\"Direct link to I'm using Docusaurus and DocSearch, can I migrate?\">​</a></h3>\n<p>At the time we are writing this, we are still at an early stage of the migration. We are doing small batches every week but will increase the load shortly, so please be patient and keep an eye out in your mailbox, you'll be contacted as soon as your Algolia app is ready!</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"where-can-i-read-more-about-this\">Where can I read more about this?<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#where-can-i-read-more-about-this\" class=\"hash-link\" aria-label=\"Direct link to Where can I read more about this?\" title=\"Direct link to Where can I read more about this?\">​</a></h3>\n<p>We wrote a small <a href=\"https://docsearch.algolia.com/docs/migrating-from-legacy\" target=\"_blank\" rel=\"noopener noreferrer\">migration guide</a> but you'll have more detailed information in the migration email.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"i-received-the-migration-email-but-the-invite-expired\">I received the migration email but the invite expired<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#i-received-the-migration-email-but-the-invite-expired\" class=\"hash-link\" aria-label=\"Direct link to I received the migration email but the invite expired\" title=\"Direct link to I received the migration email but the invite expired\">​</a></h3>\n<p>Please contact us via either <a href=\"mailto:docsearch@algolia.com\" target=\"_blank\" rel=\"noopener noreferrer\">email</a> or <a href=\"https://discord.gg/bRTacwYrfX\" target=\"_blank\" rel=\"noopener noreferrer\">DocSearch's Discord</a> or on <a href=\"https://discordapp.com/invite/docusaurus\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus's Discord #algolia channel</a></p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"i-have-feedback\">I have feedback!<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#i-have-feedback\" class=\"hash-link\" aria-label=\"Direct link to I have feedback!\" title=\"Direct link to I have feedback!\">​</a></h3>\n<p>For any feedback regarding our documentation or the DocSearch UI component, you can open an issue <a href=\"https://github.com/algolia/docsearch/issues\" target=\"_blank\" rel=\"noopener noreferrer\">on our GitHub repository</a>, but also contact us via the methods above.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"can-i-still-run-my-own-docsearch-instance\">Can I still run my own DocSearch instance?<a href=\"https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration#can-i-still-run-my-own-docsearch-instance\" class=\"hash-link\" aria-label=\"Direct link to Can I still run my own DocSearch instance?\" title=\"Direct link to Can I still run my own DocSearch instance?\">​</a></h3>\n<p>In favor of the new infrastructure and DocSearch v3, we will no longer maintain our beloved <a href=\"https://github.com/algolia/docsearch-scraper\" target=\"_blank\" rel=\"noopener noreferrer\">DocSearch scraper</a> and <a href=\"https://github.com/algolia/docsearch/tree/master\" target=\"_blank\" rel=\"noopener noreferrer\">DocSearch v2</a>, but the repositories will still be available and open to pull requests.</p>\n<p>The previous documentation (now called <code>legacy</code>) remains available as well as our <a href=\"https://docsearch.algolia.com/docs/legacy/run-your-own\" target=\"_blank\" rel=\"noopener noreferrer\"><code>run your own</code></a> guide.</p>",
            "url": "https://coinsgpt.github.io/blog/2021/11/21/algolia-docsearch-migration",
            "title": "DocSearch migration",
            "summary": "DocSearch is migrating to a new, more powerful system, which gives users their own Algolia application and new credentials.",
            "date_modified": "2021-11-21T00:00:00.000Z",
            "author": {
                "name": "Clément Vannicatte",
                "url": "https://github.com/shortcuts"
            },
            "tags": [
                "Search"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta",
            "content_html": "<p>After a lengthy alpha stage in order to ensure feature parity and quality, we are excited to officially release the first <strong><a href=\"https://github.com/facebook/docusaurus/releases/tag/v2.0.0-beta.0\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus 2 beta</a></strong>.</p>\n<p>With the announcement of this beta, the team is even more confident that Docusaurus 2 is <strong>ready for mainstream adoption</strong>!</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://coinsgpt.github.io/assets/images/image_cropped-2744c01b1fc0b451dbdb65a1d568fbff.png\" width=\"682\" height=\"416\" class=\"img_vXGZ\"></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"docusaurus-adoption\">Docusaurus adoption<a href=\"https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta#docusaurus-adoption\" class=\"hash-link\" aria-label=\"Direct link to Docusaurus adoption\" title=\"Direct link to Docusaurus adoption\">​</a></h2>\n<p><strong>Don't fear the beta tag!</strong></p>\n<p>Docusaurus 2 is widely adopted and growing fast:</p>\n<p><a href=\"https://www.npmtrends.com/docusaurus-vs-@docusaurus/core\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus v1 vs. v2 npm trends from 2019 to mid 2021. The installations of Docusaurus v2 is sharply rising, while v1 is mostly stable. V1 fluctuates between 10000 and 20000, while v2 starts at 0 and ends at almost 60000. The intersection happens around June 2020.\" src=\"https://coinsgpt.github.io/assets/images/trend-2735e446f67fbcaa0811d103588e9b82.png\" width=\"1786\" height=\"918\" class=\"img_vXGZ\"></a></p>\n<p>To get a fuller understanding of the quality of current Docusaurus 2 sites, our new <a href=\"https://docusaurus.io/showcase\" target=\"_blank\" rel=\"noopener noreferrer\">showcase</a> page allows you to filter Docusaurus sites by features, so you may get inspired by real-world production sites with a similar use-case as yours!</p>\n<p>Don't miss our <a href=\"https://docusaurus.io/showcase?tags=favorite\" target=\"_blank\" rel=\"noopener noreferrer\">favorite</a> sites; they all stand out with something unique:</p>\n<p><a href=\"https://docusaurus.io/showcase?tags=favorite\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"A screenshot of the showcase&amp;#39;s favorites section, with 12 cards each displaying the information and preview of one site\" src=\"https://coinsgpt.github.io/assets/images/favorites-7220082695a33eba77188ba7223c165c.png\" width=\"1033\" height=\"1450\" class=\"img_vXGZ\"></a></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"why-was-docusaurus-v2-in-alpha-for-so-long\">Why was Docusaurus v2 in alpha for so long?<a href=\"https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta#why-was-docusaurus-v2-in-alpha-for-so-long\" class=\"hash-link\" aria-label=\"Direct link to Why was Docusaurus v2 in alpha for so long?\" title=\"Direct link to Why was Docusaurus v2 in alpha for so long?\">​</a></h2>\n<p>It's hard to believe that the first alpha release <a href=\"https://github.com/facebook/docusaurus/releases/tag/v2.0.0-alpha.0\" target=\"_blank\" rel=\"noopener noreferrer\">v2.0.0-alpha.0</a> was 2 years ago 😳 , unusually long for a software alpha.</p>\n<p>As this was a substantial re-architecture of the code base, we wanted to ensure that we had confidence in the stability and features of Docusaurus 2 before moving on to a beta stage, since beta suggests a high level of quality. We are happy to say that Docusaurus 2 has reached <strong>feature parity</strong> with Docusaurus 1 with <strong><a href=\"https://docusaurus.io/blog/2021/03/09/releasing-docusaurus-i18n\" target=\"_blank\" rel=\"noopener noreferrer\">i18n</a></strong>, and it has been <strong>successfully adopted</strong> by many Docusaurus sites (see <a href=\"https://docusaurus.io/showcase?tags=i18n\" target=\"_blank\" rel=\"noopener noreferrer\">i18n showcase</a>).</p>\n<p>We're now quite confident that the core features of Docusaurus 2 are stable enough to be in beta.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"what-are-the-goals-of-the-beta\">What are the goals of the beta?<a href=\"https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta#what-are-the-goals-of-the-beta\" class=\"hash-link\" aria-label=\"Direct link to What are the goals of the beta?\" title=\"Direct link to What are the goals of the beta?\">​</a></h2>\n<p>Now that Docusaurus 2 is stable and major feature complete, the goal of the beta is to inspire confidence in new users on the production-readiness of Docusaurus 2, migrate more remaining Docusaurus 1 users to version 2, and officially deprecate Docusaurus 1. We will, of course, continue to resolve any issues and bugs that may be discovered.</p>\n<p>In addition, we will use the beta phase to <strong>improve our theming system</strong>.</p>\n<p>We want to make it:</p>\n<ul>\n<li>\n<p><strong>easier to implement a custom theme</strong>, including for ourselves. We want to provide <a href=\"https://github.com/facebook/docusaurus/issues/3522\" target=\"_blank\" rel=\"noopener noreferrer\">multiple official themes</a> (including <a href=\"https://github.com/facebook/docusaurus/issues/2961\" target=\"_blank\" rel=\"noopener noreferrer\">Tailwind CSS</a>) for a long time.</p>\n</li>\n<li>\n<p><strong>safer to extend an existing theme</strong>: it can be painful to upgrade a highly customized Docusaurus site, as customizations can conflict with internal changes. We need to make the theme public API surface more explicit, and make it clear what is safe to customize.</p>\n</li>\n</ul>\n<p>We will build a better <strong>theming infrastructure</strong> and refactor the classic theme to use it.</p>\n<p>If you customize your site, you may find these planned improvements quite valuable.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"whats-new\">What's new?<a href=\"https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta#whats-new\" class=\"hash-link\" aria-label=\"Direct link to What's new?\" title=\"Direct link to What's new?\">​</a></h2>\n<p>In case you missed it, we recently shipped two major improvements:</p>\n<ul>\n<li><a href=\"https://docusaurus.io/docs/sidebar#sidebar-item-autogenerated\" target=\"_blank\" rel=\"noopener noreferrer\">Auto-generated sidebars</a>: no need to maintain a <code>sidebars.js</code> file anymore!</li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4027\" target=\"_blank\" rel=\"noopener noreferrer\">Webpack 5 / PostCSS 8</a>: persistent caching significantly speeds up <strong>rebuild time</strong>!</li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"whats-next\">What's next?<a href=\"https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta#whats-next\" class=\"hash-link\" aria-label=\"Direct link to What's next?\" title=\"Direct link to What's next?\">​</a></h2>\n<p>Shipping the official 2.0 release!</p>\n<p>To get there, we will continue to <strong>fix bugs</strong> and implement the <strong>most wanted features</strong>, including:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/2643\" target=\"_blank\" rel=\"noopener noreferrer\">Sidebar category index pages</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/2220\" target=\"_blank\" rel=\"noopener noreferrer\">Better mobile navigation UX</a></li>\n<li><a href=\"https://github.com/facebookincubator/infima/issues/55\" target=\"_blank\" rel=\"noopener noreferrer\">Better admonition design</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/3236\" target=\"_blank\" rel=\"noopener noreferrer\">CSS-in-JS support</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4765\" target=\"_blank\" rel=\"noopener noreferrer\">Improve build time performance</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4138\" target=\"_blank\" rel=\"noopener noreferrer\">Extend Docusaurus plugins, CMS integration</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/3372\" target=\"_blank\" rel=\"noopener noreferrer\">Fix trailing slashes and relative link issues</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/3018\" target=\"_blank\" rel=\"noopener noreferrer\">Better compatibility with CommonMark</a></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4029\" target=\"_blank\" rel=\"noopener noreferrer\">Upgrade to MDX 2.0</a></li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"conclusion\">Conclusion<a href=\"https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>This is an exciting time for Docusaurus.</p>\n<p>We are inspired by the <a href=\"https://x.com/sebastienlorber/timelines/1392048416872706049\" target=\"_blank\" rel=\"noopener noreferrer\">positive feedback</a> about Docusaurus, and discover new sites online every single day.</p>\n<p>We are so excited for this beta release. We strove for quality and stability while continuing to try to increase the adoption of Docusaurus. For those that have been on the fence from migrating an existing Docusaurus site to Docusaurus 2, it is a great time to upgrade. We want you running on the latest infrastructure when we deprecate Docusaurus 1 at the end of this beta period. Let us know how we can help.</p>\n<p>Thank you to everyone for reading and to the entire community who supports Docusaurus. 🤗</p>",
            "url": "https://coinsgpt.github.io/blog/2021/05/12/announcing-docusaurus-two-beta",
            "title": "Announcing Docusaurus 2 Beta",
            "summary": "After a lengthy alpha stage in order to ensure feature parity and quality, we are excited to officially release the first Docusaurus 2 beta.",
            "date_modified": "2021-05-12T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release",
                "Beta"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n",
            "content_html": "<p>Today, we officially release <strong><a href=\"https://docusaurus.io/docs/i18n/introduction\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus 2 i18n</a></strong> (<a href=\"https://en.wikipedia.org/wiki/Internationalization_and_localization\" target=\"_blank\" rel=\"noopener noreferrer\">internationalization</a>), as part of <a href=\"https://github.com/facebook/docusaurus/releases/tag/v2.0.0-alpha.71\" target=\"_blank\" rel=\"noopener noreferrer\">2.0.0-alpha.71</a>.</p>\n<p>Docusaurus 2 has now reached <strong>full feature parity with Docusaurus 1</strong>. 🎉 And soon, after a few additional infrastructure updates and a bit more testing, the <strong>first Docusaurus 2 beta</strong> will be released.</p>\n<p><strong>We went the extra mile</strong>, and the new i18n support is <strong>even better than in Docusaurus 1</strong>.</p>\n<p>In this post, we will present you the <strong>translation workflow</strong>, explain some <strong>design decisions</strong> and <strong>showcase early adopter sites</strong> that just went live: <a href=\"https://jestjs.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Jest</a>, <a href=\"https://learn.redwoodjs.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Redwood</a>, and <a href=\"https://datagit.ir/\" target=\"_blank\" rel=\"noopener noreferrer\">Datagit</a>.</p>\n<p>We also <strong>dogfood</strong> the i18n support on the <strong>Docusaurus 2 site itself</strong>, and this post is already available in <a href=\"https://docusaurus.io/blog/2021/03/09/releasing-docusaurus-i18n\" target=\"_blank\" rel=\"noopener noreferrer\">English</a> and <a href=\"https://docusaurus.io/fr/blog/2021/03/09/releasing-docusaurus-i18n\" target=\"_blank\" rel=\"noopener noreferrer\">French</a>!</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"translate-your-site\">Translate your site<a href=\"https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n#translate-your-site\" class=\"hash-link\" aria-label=\"Direct link to Translate your site\" title=\"Direct link to Translate your site\">​</a></h2>\n<p>You can translate a Docusaurus site in <strong>3 simple steps</strong>:</p>\n<ol>\n<li><strong>Configure</strong>: declare the default locale and alternative locales in <code>docusaurus.config.js</code></li>\n<li><strong>Translate</strong>: put the translation files at the <a href=\"https://docusaurus.io/docs/next/i18n/introduction#translation-files-location\" target=\"_blank\" rel=\"noopener noreferrer\">correct filesystem location</a></li>\n<li><strong>Deploy</strong>: build and deploy your site using a single or multi-domain strategy</li>\n</ol>\n<p>The i18n support is <strong>very flexible</strong> and based on the <strong>filesystem</strong>.</p>\n<p>The <strong><a href=\"https://docusaurus.io/docs/i18n/tutorial\" target=\"_blank\" rel=\"noopener noreferrer\">i18n tutorial</a></strong> is the best way to get started, and we provide help to use <strong><a href=\"https://docusaurus.io/docs/i18n/git\" target=\"_blank\" rel=\"noopener noreferrer\">Git</a></strong> or <strong><a href=\"https://docusaurus.io/docs/i18n/crowdin\" target=\"_blank\" rel=\"noopener noreferrer\">Crowdin</a></strong>.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"design-decisions\">Design decisions<a href=\"https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n#design-decisions\" class=\"hash-link\" aria-label=\"Direct link to Design decisions\" title=\"Direct link to Design decisions\">​</a></h2>\n<p>The goals of the Docusaurus i18n system are:</p>\n<ul>\n<li><strong>Simple</strong>: just put the translated files in the <a href=\"https://docusaurus.io/docs/next/i18n/introduction#translation-files-location\" target=\"_blank\" rel=\"noopener noreferrer\">correct filesystem location</a></li>\n<li><strong>Flexible translation workflows</strong>: use Git (monorepo, forks, or submodules), SaaS software, FTP</li>\n<li><strong>Flexible deployment options</strong>: single, multiple domains, or hybrid</li>\n<li><strong>Modular</strong>: allow plugin authors to provide i18n support</li>\n<li><strong>Low-overhead runtime</strong>: documentation is mostly static and does not require a heavy JS library or polyfills</li>\n<li><strong>Scalable build-times</strong>: allow building and deploying localized sites independently</li>\n<li><strong>Localize assets</strong>: an image of your site might contain text that should be translated</li>\n<li><strong>No coupling</strong>: not forced to use any SaaS, yet integrations are possible</li>\n<li><strong>Easy to use with <a href=\"https://crowdin.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Crowdin</a></strong>: multiple Docusaurus 1 sites use Crowdin, and should be able to migrate to v2</li>\n<li><strong>Good SEO defaults</strong>: we set useful SEO headers like <a href=\"https://developers.google.com/search/docs/advanced/crawling/localized-versions\" target=\"_blank\" rel=\"noopener noreferrer\"><code>hreflang</code></a> for you</li>\n<li><strong>RTL support</strong>: locales reading right-to-left (Arabic, Hebrew, etc.) are supported and easy to implement</li>\n<li><strong>Default translations</strong>: classic theme labels are translated for you in <a href=\"https://github.com/facebook/docusaurus/tree/main/packages/docusaurus-theme-translations/locales\" target=\"_blank\" rel=\"noopener noreferrer\">many languages</a></li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"showcase\">Showcase<a href=\"https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n#showcase\" class=\"hash-link\" aria-label=\"Direct link to Showcase\" title=\"Direct link to Showcase\">​</a></h2>\n<p>We worked with a few volunteers to <strong>dogfood the i18n support</strong> before releasing it.</p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"jest-upgrading-docusaurus\">Jest: upgrading Docusaurus<a href=\"https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n#jest-upgrading-docusaurus\" class=\"hash-link\" aria-label=\"Direct link to Jest: upgrading Docusaurus\" title=\"Direct link to Jest: upgrading Docusaurus\">​</a></h3>\n<p>We have made it possible to <strong>upgrade</strong> a <strong>translated Docusaurus 1 site</strong> to Docusaurus 2.</p>\n<p><strong><a href=\"https://jestjs.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Jest</a></strong>, using Docusaurus 1 and Crowdin was one of those sites.</p>\n<p>The Docusaurus 2 migration was successful and the new site is now deployed in production (<a href=\"https://jestjs.io/blog/2021/03/09/jest-website-upgrade\" target=\"_blank\" rel=\"noopener noreferrer\">announcement post</a>).</p>\n<p><a href=\"https://jestjs.io/\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"Jest&amp;#39;s website front page in Japanese\" src=\"https://coinsgpt.github.io/assets/images/jest-59f159eb97ecd87655cf47ec5cc00d47.png\" width=\"2772\" height=\"1798\" class=\"img_vXGZ\"></a></p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"redwood-adopting-docusaurus\">Redwood: adopting Docusaurus<a href=\"https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n#redwood-adopting-docusaurus\" class=\"hash-link\" aria-label=\"Direct link to Redwood: adopting Docusaurus\" title=\"Direct link to Redwood: adopting Docusaurus\">​</a></h3>\n<p><a href=\"https://redwoodjs.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Redwood</a> is a React full-stack Jamstack framework.</p>\n<p>They were looking for a solution to create an <strong>internationalized learning platform</strong>, and became early adopters of Docusaurus 2 i18n for <a href=\"https://learn.redwoodjs.com/\" target=\"_blank\" rel=\"noopener noreferrer\">learn.redwoodjs.com</a>, using Crowdin to get it translated to French.</p>\n<p><a href=\"https://learn.redwoodjs.com/\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"Redwood&amp;#39;s doc page in French\" src=\"https://coinsgpt.github.io/assets/images/redwood-c3155187911b62428e0cc1e8b662de76.png\" width=\"2772\" height=\"1798\" class=\"img_vXGZ\"></a></p>\n<h3 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"datagit-using-ltr-support\">Datagit: using LTR support<a href=\"https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n#datagit-using-ltr-support\" class=\"hash-link\" aria-label=\"Direct link to Datagit: using LTR support\" title=\"Direct link to Datagit: using LTR support\">​</a></h3>\n<p>The i18n system should work with any language, including <strong>Right-to-Left languages</strong>.</p>\n<p><a href=\"https://datagit.ir/\" target=\"_blank\" rel=\"noopener noreferrer\">Datagit.ir</a> is using Farsi, and a simple configuration option is able to <strong>flip the Docusaurus theme</strong> to add the required Right-to-Left support.</p>\n<p><a href=\"https://datagit.ir/\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" loading=\"lazy\" alt=\"Datagit&amp;#39;s website in Persian, a right-to-left language. The sidebar appears on the right of the window and the TOC appears on the left.\" src=\"https://coinsgpt.github.io/assets/images/datagit-9cff7b631eaa43b00d9e1373359abfb1.png\" width=\"2772\" height=\"1798\" class=\"img_vXGZ\"></a></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"conclusion\">Conclusion<a href=\"https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\">​</a></h2>\n<p>We sincerely hope you will adopt and like the new i18n support.</p>\n<p>This feature has not been an easy one, and we would like to thank everyone that got involved in this journey:</p>\n<ul>\n<li><a href=\"https://github.com/lex111\" target=\"_blank\" rel=\"noopener noreferrer\">Alexey</a> for his help to make the i18n support exhaustive and even better than v1</li>\n<li><a href=\"https://github.com/SimenB\" target=\"_blank\" rel=\"noopener noreferrer\">Simen</a> for volunteering and supporting the Jest migration</li>\n<li><a href=\"https://github.com/clairefro\" target=\"_blank\" rel=\"noopener noreferrer\">Claire</a> for adopting Docusaurus 2 on the new Redwood platform and providing many feedbacks</li>\n<li><a href=\"https://github.com/massoudmaboudi\" target=\"_blank\" rel=\"noopener noreferrer\">Massoud</a> for reviewing my work on LTR and adopting it on Datagit</li>\n<li><a href=\"https://crowdin.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Crowdin</a> for their support and willingness to improve their translation SaaS</li>\n<li>The Docusaurus community for their patience, and providing many useful feedbacks on GitHub</li>\n</ul>\n<p>Thanks for reading.</p>\n<p>🙏 And please, add your brand new i18n sites to our <a href=\"https://docusaurus.io/showcase\" target=\"_blank\" rel=\"noopener noreferrer\">showcase page</a>. We accept any all polished Docusaurus site here, and we are working on a <a href=\"https://github.com/facebook/docusaurus/issues/4238\" target=\"_blank\" rel=\"noopener noreferrer\">redesign</a> allowing you to filter sites by features.</p>",
            "url": "https://coinsgpt.github.io/blog/2021/03/09/releasing-docusaurus-i18n",
            "title": "Releasing Docusaurus i18n",
            "summary": "Today, we officially release Docusaurus 2 i18n (internationalization), as part of 2.0.0-alpha.71.",
            "date_modified": "2021-03-09T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Release",
                "I18n"
            ]
        },
        {
            "id": "https://coinsgpt.github.io/blog/2021/01/19/docusaurus-2020-recap",
            "content_html": "<p><strong>2020 was great for Docusaurus</strong>, despite <a href=\"https://docusaurus.io/blog/2020/01/07/tribute-to-endi\" target=\"_blank\" rel=\"noopener noreferrer\">a regrettable start</a> and a tumultuous year for everyone.</p>\n<p>We continued to invest in <a href=\"https://docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus 2</a>, and made it reach <strong>full feature parity</strong> with <a href=\"https://v1.docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Docusaurus 1</a>.</p>\n<p>We now <strong>recommend Docusaurus 2</strong> as the <strong>default choice</strong> to start a new Docusaurus project and encourage v1 users to <a href=\"https://docusaurus.io/docs/migration\" target=\"_blank\" rel=\"noopener noreferrer\">migrate to Docusaurus 2</a>.</p>\n<p>We are <strong>still in alpha</strong>, but expect <strong>some good news very soon</strong>!</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Three Docusaurus plushies laid side-by-side on the table\" src=\"https://coinsgpt.github.io/assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg\" width=\"1500\" height=\"500\" class=\"img_vXGZ\"></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"docusaurus-2-highlights\">Docusaurus 2 highlights<a href=\"https://coinsgpt.github.io/blog/2021/01/19/docusaurus-2020-recap#docusaurus-2-highlights\" class=\"hash-link\" aria-label=\"Direct link to Docusaurus 2 highlights\" title=\"Direct link to Docusaurus 2 highlights\">​</a></h2>\n<p>We have worked on many features this year, and would like to highlight the most significant ones:</p>\n<ul>\n<li><strong>i18n</strong>: easily translate your Docusaurus site, released soon! (<a href=\"https://github.com/facebook/docusaurus/pull/3325\" target=\"_blank\" rel=\"noopener noreferrer\">preview</a>, <a href=\"https://docusaurus.io/docs/next/i18n/introduction\" target=\"_blank\" rel=\"noopener noreferrer\">doc</a>)</li>\n<li><strong>Version dropdown</strong>: enable contextual version switch</li>\n<li><strong>Versioning options</strong>: solving the most common pain-points users had with versioning</li>\n<li><strong>Contextual search</strong>: search in the current version, use the brand-new DocSearch 3 experience</li>\n<li><strong>Markdown pages</strong>: use Markdown instead of React components to create standalone pages</li>\n<li><strong>Better theme</strong>: various UI, UX and accessibility improvements</li>\n<li><strong>PWA</strong>: add offline support to your site, and make it installable</li>\n<li><strong>Fail-fast</strong>: strict config validation, detect broken links, and prevent bad production deployments</li>\n<li><strong>Multi-instance</strong>: use the docs plugin twice on a single site (e.g. iOS/Android SDK docs)</li>\n<li><strong>Migration CLI</strong>: automate the upgrade from Docusaurus 1</li>\n<li><strong>CodeSandbox</strong>: assess Docusaurus easily from your browser with <a href=\"https://new.docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\">new.docusaurus.io</a></li>\n<li><strong>Canary releases</strong>: use the <code>@canary</code> npm tag to use the upcoming release before anyone else</li>\n<li><strong>TypeScript</strong>: progressive adoption for internal code, and improve usage for users</li>\n<li><strong>Publish Infima</strong>: it is now <a href=\"https://github.com/facebookincubator/infima\" target=\"_blank\" rel=\"noopener noreferrer\">open-source</a></li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"docusaurus-2-growth\">Docusaurus 2 growth<a href=\"https://coinsgpt.github.io/blog/2021/01/19/docusaurus-2020-recap#docusaurus-2-growth\" class=\"hash-link\" aria-label=\"Direct link to Docusaurus 2 growth\" title=\"Direct link to Docusaurus 2 growth\">​</a></h2>\n<p>The plan to <a href=\"https://docusaurus.io/blog/2019/12/30/docusaurus-2019-recap\" target=\"_blank\" rel=\"noopener noreferrer\">rebuild Docusaurus from scratch in 2019</a> paid off: after a slow start, Docusaurus 2 has been widely adopted and has <strong>already outgrown Docusaurus 1</strong> usage.</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Docusaurus v1 vs. v2 npm trends of the year 2020. The installations of Docusaurus v2 is visibly up-growing, while v1 is slightly downward. V1 starts at 15000 and ends at 10000, while v2 starts at 2000 and ends at 25000. The intersection happens around June 2020.\" src=\"https://coinsgpt.github.io/assets/images/docusaurus-npm-trends-3c618d573fc9ca319e54667383ea1e01.png\" width=\"2480\" height=\"922\" class=\"img_vXGZ\"></p>\n<p>Notable <strong>projects, startups, large companies, and individuals</strong> adopted Docusaurus 2 (<a href=\"https://docusaurus.io/showcase\" target=\"_blank\" rel=\"noopener noreferrer\">showcase</a>):</p>\n<ul>\n<li><a href=\"https://supabase.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Supabase</a></li>\n<li><a href=\"https://reactnavigation.org/\" target=\"_blank\" rel=\"noopener noreferrer\">React Navigation</a></li>\n<li><a href=\"https://react-redux.js.org/\" target=\"_blank\" rel=\"noopener noreferrer\">React Redux</a></li>\n<li><a href=\"https://vector.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Vector</a></li>\n<li><a href=\"https://docsearch.algolia.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Algolia DocSearch</a></li>\n<li><a href=\"https://sap.github.io/cloud-sdk\" target=\"_blank\" rel=\"noopener noreferrer\">SAP Cloud SDK</a></li>\n<li><a href=\"https://xsoar.pan.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">Palo Alto Cortex XSOAR</a></li>\n<li><a href=\"https://portfoliosaurus.now.sh/\" target=\"_blank\" rel=\"noopener noreferrer\">Quddús George's website</a></li>\n</ul>\n<p>We helped <strong>large scale Docusaurus 1 sites to upgrade</strong>, ensuring a proper <strong>migration path</strong> and <strong>feature parity</strong>.</p>\n<p><a href=\"https://reactnative.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">React Native</a> was successfully upgraded to Docusaurus 2 (<a href=\"http://archive.reactnative.dev/\" target=\"_blank\" rel=\"noopener noreferrer\">archived v1 site</a>):</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"React Native&amp;#39;s new website built with Docusaurus v2\" src=\"https://coinsgpt.github.io/assets/images/react-native-screenshot-d5ace12ce89fe59dc14ac25859685b01.png\" width=\"2914\" height=\"1664\" class=\"img_vXGZ\"></p>\n<p>Localized Docusaurus 1 sites (like <strong>Jest</strong>) will be able to upgrade too:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Jest&amp;#39;s new website built with Docusaurus v2 in Japanese\" src=\"https://coinsgpt.github.io/assets/images/jest-screenshot-fa8ba3dd1b0ebbf923ed56274f0e4f5e.png\" width=\"3324\" height=\"1878\" class=\"img_vXGZ\"></p>\n<p>We also saw the <strong><a href=\"https://datagit.ir/\" target=\"_blank\" rel=\"noopener noreferrer\">first right-to-left</a></strong> Docusaurus 2 site published:</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Datagit&amp;#39;s website in Persian, a right-to-left language. The sidebar appears on the right of the window and the TOC appears on the left.\" src=\"https://coinsgpt.github.io/assets/images/datagit-rtl-screenshot-0def4b4e4d5f458ea864774e78b0bf8f.png\" width=\"1447\" height=\"944\" class=\"img_vXGZ\"></p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"github-activity\">GitHub Activity<a href=\"https://coinsgpt.github.io/blog/2021/01/19/docusaurus-2020-recap#github-activity\" class=\"hash-link\" aria-label=\"Direct link to GitHub Activity\" title=\"Direct link to GitHub Activity\">​</a></h2>\n<ul>\n<li><strong>Stars</strong>: 14632 → 20946 (+43.2% y/y)</li>\n<li><strong>Total Contributors</strong>: 303 → 512 (+68.9% y/y). Most of which are non-Facebook contributors</li>\n<li><strong>Weekly npm Downloads</strong>: 2356 → 25592 (+986% y/y)</li>\n<li><strong>On GitHub</strong>, Docusaurus 1 is used by 6311 projects (+62.9% y/y) while Docusaurus 2 is used by 5039 projects (+1940% y/y)</li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"collaboration-with-major-league-hacking\">Collaboration with Major League Hacking<a href=\"https://coinsgpt.github.io/blog/2021/01/19/docusaurus-2020-recap#collaboration-with-major-league-hacking\" class=\"hash-link\" aria-label=\"Direct link to Collaboration with Major League Hacking\" title=\"Direct link to Collaboration with Major League Hacking\">​</a></h2>\n<p>We have welcomed <a href=\"https://mlh.io/\" target=\"_blank\" rel=\"noopener noreferrer\">Major League Hacking</a> (MLH) fellows for 2 seasons already.</p>\n<p>We are very thankful for the <strong>various contributions</strong> they made, such as:</p>\n<ul>\n<li>Writing the foundations of the v1 to v2 migration CLI</li>\n<li>Help migrate the React Native website from v1 to v2</li>\n<li>Making the config validation more strict and exhaustive, returning helpful error messages</li>\n<li>Adding CodeSandbox support</li>\n<li>Improving the CI pipelines: build size and Lighthouse bots</li>\n</ul>\n<p>We look forward to continuing this collaboration in 2021.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"media\">Media<a href=\"https://coinsgpt.github.io/blog/2021/01/19/docusaurus-2020-recap#media\" class=\"hash-link\" aria-label=\"Direct link to Media\" title=\"Direct link to Media\">​</a></h2>\n<p>Dmitry Vinnik (Developer Advocate @ Facebook) explains Docusaurus in <a href=\"https://www.youtube.com/watch?v=_An9EsKPhp0\" target=\"_blank\" rel=\"noopener noreferrer\">60 seconds</a> or <a href=\"https://www.youtube.com/watch?v=Yhyx7otSksg\" target=\"_blank\" rel=\"noopener noreferrer\">15min</a> videos.</p>\n<p>Rachel Nabors (Documentation Engineer @ Facebook) talked a bit about Docusaurus in <a href=\"https://reactnativeradio.com/episodes/178-documenting-react-native-with-rachel-nabors-gWxwySPl\" target=\"_blank\" rel=\"noopener noreferrer\">React Native Radio 178 (podcast)</a>, and William Candillon the <a href=\"https://www.youtube.com/watch?v=-zhjq2ECKq4\" target=\"_blank\" rel=\"noopener noreferrer\">React Native website migration (video)</a>.</p>\n<p>Many blog posts have been published:</p>\n<ul>\n<li><a href=\"https://portfoliosaurus.now.sh/blog/toTheMakers\" target=\"_blank\" rel=\"noopener noreferrer\">To the Makers of Docusaurus</a> by Quddus George</li>\n<li><a href=\"https://davidgoss.co/blog/api-documentation-redoc-docusaurus/\" target=\"_blank\" rel=\"noopener noreferrer\">Richer API documentation with Redoc and Docusaurus</a> by David Goss</li>\n<li><a href=\"https://aknapen.nl/blog/how-to-build-a-plugin-for-docusaurus-v2/\" target=\"_blank\" rel=\"noopener noreferrer\">How to Build a Plugin for Docusaurus v2</a> by Adriaan Knapen</li>\n<li><a href=\"https://blog.axlight.com/posts/react-tracked-documentation-website-with-docusaurus-v2/\" target=\"_blank\" rel=\"noopener noreferrer\">React Tracked Documentation Website with Docusaurus v2</a> by Daishi Kato</li>\n<li><a href=\"https://blog.logrocket.com/easy-documentation-with-docusaurus/\" target=\"_blank\" rel=\"noopener noreferrer\">Easy documentation with Docusaurus</a> by Anshul Goyal (MLH fellow)</li>\n<li><a href=\"https://lo-victoria.com/build-beautiful-documentation-websites-with-docusaurus\" target=\"_blank\" rel=\"noopener noreferrer\">Build Beautiful Documentation Websites with Docusaurus</a> by Victoria Lo</li>\n</ul>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"community\">Community<a href=\"https://coinsgpt.github.io/blog/2021/01/19/docusaurus-2020-recap#community\" class=\"hash-link\" aria-label=\"Direct link to Community\" title=\"Direct link to Community\">​</a></h2>\n<p>The Docusaurus community continues to grow, the <a href=\"https://discord.gg/docusaurus\" target=\"_blank\" rel=\"noopener noreferrer\">Discord</a> server is quite active, and <a href=\"https://stackoverflow.com/questions/tagged/docusaurus\" target=\"_blank\" rel=\"noopener noreferrer\">Stack Overflow questions</a> keep being posted.</p>\n<p>The <strong>modular architecture</strong> of Docusaurus 2 allowed the community to build and publish <a href=\"https://docusaurus.io/community/resources#community-plugins-\" target=\"_blank\" rel=\"noopener noreferrer\">third-party plugins</a>. As we would like to federate better our community, if you are building a plugin, please <a href=\"https://github.com/facebook/docusaurus/discussions/4025\" target=\"_blank\" rel=\"noopener noreferrer\">let us know</a>.</p>\n<h2 class=\"anchor anchorWithHideOnScrollNavbar_SSbb\" id=\"whats-next\">What's next?<a href=\"https://coinsgpt.github.io/blog/2021/01/19/docusaurus-2020-recap#whats-next\" class=\"hash-link\" aria-label=\"Direct link to What's next?\" title=\"Direct link to What's next?\">​</a></h2>\n<p>As the <strong>core features of Docusaurus 2</strong> have finally been built, we will be able to dedicate more time to solve the pain points and bugs reported by the community, and make Docusaurus stable and convenient enough to enter the <strong>beta and release-candidate phase</strong>.</p>\n<p>With proper support for <strong>i18n and versioning</strong>, and <strong>large scale migrations</strong> such as <strong>React Native</strong> and <strong>Jest</strong>, we now have a clear migration path for all Docusaurus 1 sites.</p>\n<p>We still have a few <strong>major features</strong> that we would like to work on:</p>\n<ul>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/3522\" target=\"_blank\" rel=\"noopener noreferrer\">Create a theme gallery</a>, make it easy to switch from one another, and include <strong>first-class Tailwind support</strong></li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4027\" target=\"_blank\" rel=\"noopener noreferrer\">Upgrade to Webpack 5</a>, improve performances and build times</li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/3018\" target=\"_blank\" rel=\"noopener noreferrer\">Better compatibility with CommonMark</a>, as MDX and makes it harder for CommonMark-based sites to adopt Docusaurus</li>\n<li><a href=\"https://github.com/facebook/docusaurus/issues/4029\" target=\"_blank\" rel=\"noopener noreferrer\">Upgrade to MDX 2.0</a></li>\n<li>Other tasks that we might discover during 2021</li>\n</ul>\n<p>Huge thanks to the community for <a href=\"https://github.com/facebook/docusaurus/graphs/contributors?from=2020-01-01&amp;to=2021-01-01&amp;type=c\" target=\"_blank\" rel=\"noopener noreferrer\">their contributions in 2020</a>, especially:</p>\n<ul>\n<li><a href=\"https://github.com/JoelMarcey\" target=\"_blank\" rel=\"noopener noreferrer\">Joel Marcey</a> for creating Docusaurus and supporting the project all this time</li>\n<li>the core team - <a href=\"https://github.com/lex111\" target=\"_blank\" rel=\"noopener noreferrer\">Alexey Pyltsyn</a>, <a href=\"https://sebastienlorber.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Sébastien Lorber</a>, <a href=\"https://x.com/yangshunz\" target=\"_blank\" rel=\"noopener noreferrer\">Yangshun Tay</a></li>\n<li>the Major League Hacking and Facebook interns for their significant impact</li>\n<li>the Algolia team for DocSearch 3 and their support</li>\n<li><a href=\"https://github.com/Simek\" target=\"_blank\" rel=\"noopener noreferrer\">Bartosz Kaszubowski</a> for his investment in the React Native migration</li>\n<li>the whole community for their contributions, and providing support to each other</li>\n</ul>\n<p>Cheers to a great 2021! 🎉</p>",
            "url": "https://coinsgpt.github.io/blog/2021/01/19/docusaurus-2020-recap",
            "title": "Docusaurus 2020 Recap",
            "summary": "2020 was great for Docusaurus, despite a regrettable start and a tumultuous year for everyone.",
            "date_modified": "2021-01-19T00:00:00.000Z",
            "author": {
                "name": "Sébastien Lorber",
                "url": "https://thisweekinreact.com"
            },
            "tags": [
                "Recap"
            ]
        }
    ]
}