<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docs as Code on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/</link><description>Recent content in Docs as Code on Backend Engineering Strategy Tools</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 04 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/index.xml" rel="self" type="application/rss+xml"/><item><title>Document Tools — Pandoc, LaTeX, Typst, AsciiDoc, Sphinx</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/adjacent/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/adjacent/</guid><description>&lt;p&gt;Tools adjacent to the Markdown/Hugo docs-as-code workflow — format conversion, typesetting, heavier markup languages, and documentation generators.&lt;/p&gt;
&lt;h2 id="pandoc"&gt;Pandoc
&lt;/h2&gt;&lt;p&gt;The universal document converter. Pandoc reads and writes dozens of formats: Markdown, HTML, DOCX, EPUB, LaTeX, RST, AsciiDoc, and more. The most common use in a docs-as-code workflow is converting Markdown to PDF (via LaTeX), to DOCX for stakeholders who need Word files, or to self-contained HTML for offline distribution. A single source in Markdown, multiple output formats on demand. Docker images make it easy to run without a local install — the full LaTeX stack is large but containable.&lt;/p&gt;
&lt;h2 id="latex"&gt;LaTeX
&lt;/h2&gt;&lt;p&gt;A typesetting system built for precision output — academic papers, technical documentation, books. LaTeX gives exact control over typography, equations, cross-references, and bibliography. The source is plain text markup that compiles to PDF. Steep learning curve, verbose syntax, but the output quality for complex documents (especially anything with mathematical notation) is unmatched. Pandoc uses LaTeX as the intermediate format when generating PDFs, so you often interact with LaTeX indirectly through a Pandoc pipeline rather than writing &lt;code&gt;.tex&lt;/code&gt; directly.&lt;/p&gt;
&lt;h2 id="typst"&gt;Typst
&lt;/h2&gt;&lt;p&gt;A newer alternative to LaTeX with a friendlier syntax and faster compilation. Typst is designed from scratch for the same use case — precise typeset documents, scientific papers, equations — but the markup is more readable and the error messages are useful. Still maturing but gaining traction as a LaTeX replacement for teams starting fresh. Compiles to PDF directly; no intermediate format.&lt;/p&gt;
&lt;h2 id="asciidoc"&gt;AsciiDoc
&lt;/h2&gt;&lt;p&gt;A markup language heavier than Markdown but lighter than LaTeX, designed specifically for technical documentation. AsciiDoc supports cross-references, admonitions (NOTE, WARNING, TIP blocks), includes (assembling a document from multiple source files), and detailed table and image control — things Markdown handles awkwardly or not at all. Asciidoctor is the primary processor (Ruby, with a Java port). Used heavily by Red Hat, the O&amp;rsquo;Reilly book toolchain, and projects that need a single-source publishing pipeline for both web and print output.&lt;/p&gt;
&lt;h2 id="sphinx"&gt;Sphinx
&lt;/h2&gt;&lt;p&gt;A documentation generator from the Python ecosystem, originally built for the Python language documentation. Sphinx reads reStructuredText (RST) or Markdown source and produces HTML sites, PDF (via LaTeX), and ePub. The key feature is its cross-referencing system — links between pages, auto-generated API docs from docstrings, and an index are all first-class. The &lt;code&gt;Read the Docs&lt;/code&gt; hosting platform is built around Sphinx. Common outside Python too for any project that wants a structured documentation site with strong cross-referencing.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://pandoc.org/MANUAL.html" target="_blank" rel="noopener"
 &gt;Pandoc documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://hub.docker.com/r/pandoc/latex" target="_blank" rel="noopener"
 &gt;Pandoc Docker image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.latex-project.org/" target="_blank" rel="noopener"
 &gt;LaTeX project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://typst.app/docs/" target="_blank" rel="noopener"
 &gt;Typst documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.asciidoctor.org/" target="_blank" rel="noopener"
 &gt;AsciiDoc / Asciidoctor documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.sphinx-doc.org/" target="_blank" rel="noopener"
 &gt;Sphinx documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Site Navigation</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/site-navigation/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/site-navigation/</guid><description>&lt;p&gt;Technical reference for the search, mindmap, and word cloud navigation on this site. The design approach is in &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/thinking/site-navigation/" &gt;Thinking: Site Navigation — Beyond the Menu&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="architecture-overview"&gt;Architecture overview
&lt;/h2&gt;&lt;p&gt;Three navigation modes, one data source:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Hugo build
 └── list.json.json template
 └── /public-notes/index.json ← built once
 ├── search.js (Fuse.js)
 ├── mindmap.js (D3.js)
 └── wordcloud.js (wordcloud2.js)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;All three run entirely client-side. No server, no external search service. Hugo generates a JSON index at build time; JavaScript fetches it and does the rest.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-json-index"&gt;The JSON index
&lt;/h2&gt;&lt;p&gt;Hugo outputs a JSON file for the public-notes section via a custom output format. The &lt;code&gt;_index.md&lt;/code&gt; for the section declares both HTML and JSON outputs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;outputs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;HTML&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The template at &lt;code&gt;layouts/public-notes/list.json.json&lt;/code&gt; iterates all published pages recursively:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{{- $pages := where .RegularPagesRecursive &amp;#34;Draft&amp;#34; false -}}
[
{{- range $i, $page := $pages -}}
{{- if $i }},{{ end }}
{&amp;#34;title&amp;#34;:{{ $page.Title | jsonify }},
 &amp;#34;url&amp;#34;:{{ $page.RelPermalink | jsonify }},
 &amp;#34;section&amp;#34;:{{ $page.Section | jsonify }},
 &amp;#34;subsection&amp;#34;:{{ index (split $page.RelPermalink &amp;#34;/&amp;#34;) 2 | jsonify }},
 &amp;#34;tags&amp;#34;:{{ $page.Params.tags | default slice | jsonify }},
 &amp;#34;summary&amp;#34;:{{ $page.Summary | plainify | truncate 160 | jsonify }}}
{{- end }}
]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Available at &lt;code&gt;/public-notes/index.json&lt;/code&gt; after build. Each entry:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Content&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Page title&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Relative URL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;section&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Top-level section (&lt;code&gt;public-notes&lt;/code&gt;)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;subsection&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Second path segment (e.g. &lt;code&gt;infra-as-code&lt;/code&gt;)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Array from front matter, empty array if none&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Auto-generated from first ~160 chars of content&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="search--fusejs"&gt;Search — Fuse.js
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.fusejs.io/" target="_blank" rel="noopener"
 &gt;Fuse.js&lt;/a&gt; is a lightweight fuzzy-search library. It runs entirely in the browser against the JSON index — no server, no indexing step at build time beyond what Hugo already produces.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Initialisation:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/public-notes/index.json&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fuse&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Fuse&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;keys&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;weight&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;tags&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;weight&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;subsection&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;weight&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.5&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;summary&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;weight&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;threshold&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.35&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 0 = exact, 1 = match anything
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;includeScore&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Title matches rank highest, followed by tags, then section, then summary text. &lt;code&gt;threshold: 0.35&lt;/code&gt; allows minor typos and partial matches without returning garbage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trade-offs vs alternatives:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fuse.js&lt;/strong&gt; — zero build-time overhead, smallest setup, good enough for ~100 notes. Gets slower with very large corpora.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pagefind&lt;/strong&gt; — generates its own index at build time, better at full-text search, needs a build step integration. Worth switching to if the notes grow large enough that Fuse becomes slow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lunr.js&lt;/strong&gt; — similar to Fuse, slightly more powerful query syntax, heavier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Implemented as a Hugo shortcode (&lt;code&gt;layouts/shortcodes/search-notes.html&lt;/code&gt;) — the CDN script, input, results container, and JS logic are all inline, same pattern as the carousel shortcode.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="mindmap--d3js-force-simulation"&gt;Mindmap — D3.js force simulation
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://d3js.org/" target="_blank" rel="noopener"
 &gt;D3.js&lt;/a&gt; force simulation lays out notes as nodes connected by edges. Nodes are coloured by subsection. Edges connect notes that share tags (strong) or belong to the same subsection (light).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data model:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// nodes: one per page
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt; =&amp;gt; ({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;section&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;subsection&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;tags&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;tags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// edges: shared tags (strength 0.8) or same subsection (strength 0.15)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;links&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;j&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;j&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;j&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sharedTags&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;tags&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;j&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;tags&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;includes&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sharedTags&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;links&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;source&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;j&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;strength&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.8&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;section&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;j&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;section&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;links&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;source&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;j&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;strength&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.15&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Forces:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;d3&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forceSimulation&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;force&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;link&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;d3&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forceLink&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;links&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;d&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;d&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;strength&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;l&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;l&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;strength&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;distance&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;force&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;charge&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;d3&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forceManyBody&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;strength&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;120&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;force&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;d3&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forceCenter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;W&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;H&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;force&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;collision&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;d3&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forceCollide&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;radius&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Interaction:&lt;/strong&gt; click a node to highlight its direct neighbours and hide unrelated edges. Click the background to reset. Drag nodes to rearrange. Scroll to zoom (zoom is applied to a &lt;code&gt;&amp;lt;g&amp;gt;&lt;/code&gt; transform via &lt;code&gt;d3.zoom&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Current limitation:&lt;/strong&gt; most notes do not have tags in their front matter, so edges are mostly section-based. The graph becomes more useful as tags are added. Adding &lt;code&gt;tags:&lt;/code&gt; to front matter of any note immediately creates cross-section connections in the mindmap.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="word-cloud--wordcloud2js"&gt;Word cloud — wordcloud2.js
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/timdream/wordcloud2.js/" target="_blank" rel="noopener"
 &gt;wordcloud2.js&lt;/a&gt; renders a canvas-based word cloud. Words are sections and tags from the index, sized by frequency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frequency counting:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;counts&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {}, &lt;span style="color:#a6e22e"&gt;sectionOf&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sub&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;subsection&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;section&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;counts&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;sub&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;counts&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;sub&lt;/span&gt;] &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// sections weight more
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sectionOf&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;sub&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sub&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;tags&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tag&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;counts&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;tag&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;counts&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;tag&lt;/span&gt;] &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sectionOf&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;tag&lt;/span&gt;]) &lt;span style="color:#a6e22e"&gt;sectionOf&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;tag&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sub&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sections are weighted 3× per page so they appear prominently even with sparse tags. Tags accumulate naturally as notes get tagged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Click behaviour:&lt;/strong&gt; clicking a word feeds it into the search input on the search page (if present on the same page) or navigates to &lt;code&gt;/public-notes/search/&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="section-colour-map"&gt;Section colour map
&lt;/h2&gt;&lt;p&gt;Both mindmap and word cloud use the same colour map:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Section&lt;/th&gt;
 &lt;th&gt;Colour&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;infra-as-code&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#4CAF50&lt;/code&gt; green&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;cloud-infrastructure&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#2196F3&lt;/code&gt; blue&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;cicd&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#FF9800&lt;/code&gt; amber&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;languages&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#9C27B0&lt;/code&gt; purple&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;networking&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#00BCD4&lt;/code&gt; cyan&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;security&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#F44336&lt;/code&gt; red&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;observability&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#FF5722&lt;/code&gt; deep orange&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;frameworks-tools&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#795548&lt;/code&gt; brown&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;dev-environment&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#607D8B&lt;/code&gt; blue-grey&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;docs-as-code&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#E91E63&lt;/code&gt; pink&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ai&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#673AB7&lt;/code&gt; deep purple&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;hardware&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#8BC34A&lt;/code&gt; light green&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;When a new section is added, add it to the colour map in both shortcodes (&lt;code&gt;mindmap-notes.html&lt;/code&gt; and &lt;code&gt;wordcloud-notes.html&lt;/code&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="adding-tags-to-notes"&gt;Adding tags to notes
&lt;/h2&gt;&lt;p&gt;Tags are the key input that makes cross-section connections appear in the mindmap. Add them to any note&amp;rsquo;s front matter:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;title&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Terraform&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;tags&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;iac&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;terraform&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;hcl&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;state-management&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notes that share tags will be connected across section boundaries in the mindmap. The word cloud will show the tags sized by how many notes carry them.&lt;/p&gt;
&lt;p&gt;No rebuild of the shortcode or template is needed — the JSON template picks up tags automatically at build time.&lt;/p&gt;</description></item><item><title>Diagrams as Code — Mermaid and PlantUML</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/diagrams/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/diagrams/</guid><description>&lt;p&gt;Diagrams as code: describe a diagram in text, render it as an image. No drag-and-drop, no binary file that diffs as noise, no diagram that goes stale because it&amp;rsquo;s a PNG nobody updates. The source lives in Git alongside the code it describes.&lt;/p&gt;
&lt;h2 id="mermaid"&gt;Mermaid
&lt;/h2&gt;&lt;p&gt;Mermaid is a JavaScript-based diagramming tool with a simple, readable syntax. It renders natively in GitHub Markdown, GitLab, and many documentation tools — paste a fenced code block with &lt;code&gt;mermaid&lt;/code&gt; as the language and the diagram appears inline. No server needed for basic use.&lt;/p&gt;
&lt;p&gt;Flowchart:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;```mermaid
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flowchart LR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; A[Source] --&amp;gt; B{Build}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; B -- pass --&amp;gt; C[Test]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; B -- fail --&amp;gt; D[Notify]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; C --&amp;gt; E[Deploy]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sequence diagram:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;```mermaid
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sequenceDiagram
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; participant Client
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; participant API
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; participant DB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Client-&amp;gt;&amp;gt;API: POST /order
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; API-&amp;gt;&amp;gt;DB: INSERT order
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DB--&amp;gt;&amp;gt;API: ok
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; API--&amp;gt;&amp;gt;Client: 201 Created
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Other supported types: class diagrams, entity-relationship, state machines, Gantt charts, Git graphs.&lt;/p&gt;
&lt;p&gt;The &lt;a class="link" href="https://mermaid.live" target="_blank" rel="noopener"
 &gt;Mermaid live editor&lt;/a&gt; is the fastest way to iterate on a diagram.&lt;/p&gt;
&lt;h2 id="plantuml"&gt;PlantUML
&lt;/h2&gt;&lt;p&gt;PlantUML predates Mermaid and has a wider set of diagram types — UML sequence, class, component, deployment, activity, state, and non-UML types like C4 (architecture), BPMN, and Gantt. The syntax is more verbose than Mermaid but more expressive for complex diagrams.&lt;/p&gt;
&lt;p&gt;PlantUML requires a rendering server (Java-based, self-hostable) or the hosted server at &lt;code&gt;plantuml.com&lt;/code&gt;. Most IDE plugins (IntelliJ, VS Code) bundle a renderer.&lt;/p&gt;
&lt;p&gt;Sequence diagram:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-plantuml" data-lang="plantuml"&gt;@startuml
actor Client
participant API
database DB

Client -&amp;gt; API : POST /order
API -&amp;gt; DB : INSERT order
DB --&amp;gt; API : ok
API --&amp;gt; Client : 201 Created
@enduml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Component diagram:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-plantuml" data-lang="plantuml"&gt;@startuml
package &amp;#34;Frontend&amp;#34; {
 [Web App]
}

package &amp;#34;Backend&amp;#34; {
 [API Server]
 [Worker]
}

database &amp;#34;PostgreSQL&amp;#34;

[Web App] --&amp;gt; [API Server]
[API Server] --&amp;gt; PostgreSQL
[Worker] --&amp;gt; PostgreSQL
@enduml
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="which-to-use"&gt;Which to use
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;Mermaid&lt;/th&gt;
 &lt;th&gt;PlantUML&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Renders in GitHub/GitLab&lt;/td&gt;
 &lt;td&gt;Yes, natively&lt;/td&gt;
 &lt;td&gt;No, requires plugin or pre-rendering&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Setup&lt;/td&gt;
 &lt;td&gt;Zero&lt;/td&gt;
 &lt;td&gt;Rendering server or plugin&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Syntax&lt;/td&gt;
 &lt;td&gt;Simple, readable&lt;/td&gt;
 &lt;td&gt;More verbose, more powerful&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Diagram types&lt;/td&gt;
 &lt;td&gt;Core UML + Git/Gantt&lt;/td&gt;
 &lt;td&gt;Full UML + C4 + more&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Best for&lt;/td&gt;
 &lt;td&gt;Quick diagrams in docs and READMEs&lt;/td&gt;
 &lt;td&gt;Complex architecture and UML diagrams&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://mermaid.js.org/" target="_blank" rel="noopener"
 &gt;Mermaid documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://mermaid.live" target="_blank" rel="noopener"
 &gt;Mermaid live editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://plantuml.com/" target="_blank" rel="noopener"
 &gt;PlantUML documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.plantuml.com/plantuml/uml/" target="_blank" rel="noopener"
 &gt;PlantUML online server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Hugo</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/hugo/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/hugo/</guid><description>&lt;p&gt;Hugo is a static site generator written in Go. Content is Markdown, templates are Go HTML templates, and the output is plain HTML/CSS/JS — no server-side runtime, no database. Build times are fast even for large sites; most builds complete in under a second. This site is built with Hugo.&lt;/p&gt;
&lt;h2 id="structure"&gt;Structure
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;content/ # Markdown pages — mirrors the URL structure
layouts/ # Template overrides (Hugo prefers local files over theme files)
assets/ # CSS, JS, images processed by Hugo Pipes
static/ # Files copied as-is into the output
themes/ # Theme(s), typically pulled via Go modules
config.yaml # Site configuration
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Content files use YAML front matter to set metadata:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;title: &amp;#34;My Page&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;date: 2026-06-04
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;draft: false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tags: [&amp;#34;example&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Page content here.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="themes-via-go-modules"&gt;Themes via Go modules
&lt;/h2&gt;&lt;p&gt;Themes are imported as Go modules in &lt;code&gt;go.mod&lt;/code&gt;. To override a theme template or style, mirror the file path under &lt;code&gt;layouts/&lt;/code&gt; or &lt;code&gt;assets/&lt;/code&gt; — Hugo&amp;rsquo;s lookup order prefers local files over theme files, so the override takes effect without touching the theme itself.&lt;/p&gt;
&lt;h2 id="build-and-serve"&gt;Build and serve
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Serve locally with draft and future content enabled&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hugo server -D --buildFuture
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Build to public/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hugo --minify
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sections-and-taxonomies"&gt;Sections and taxonomies
&lt;/h2&gt;&lt;p&gt;Hugo&amp;rsquo;s content model is built around sections (top-level directories in &lt;code&gt;content/&lt;/code&gt;) and taxonomies (tags, categories). Each section and taxonomy gets its own listing page automatically. &lt;code&gt;_index.md&lt;/code&gt; in a section directory controls the listing page&amp;rsquo;s content and front matter.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gohugo.io/documentation/" target="_blank" rel="noopener"
 &gt;Hugo documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener"
 &gt;Hugo themes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener"
 &gt;Hugo Stack theme&lt;/a&gt; — used by this site&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Markdown</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/markdown/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/markdown/</guid><description>&lt;p&gt;Markdown is a lightweight markup language that converts to HTML. The syntax is designed to be readable as plain text — a &lt;code&gt;# Heading&lt;/code&gt; looks like a heading even in a text editor, and &lt;code&gt;**bold**&lt;/code&gt; reads naturally. John Gruber created the original spec in 2004; CommonMark later formalised an unambiguous specification. GitHub Flavored Markdown (GFM) extends CommonMark with tables, task lists, and syntax-highlighted fenced code blocks.&lt;/p&gt;
&lt;h2 id="core-syntax"&gt;Core syntax
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Heading 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Heading 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;**bold**&lt;/span&gt; &lt;span style="font-style:italic"&gt;*italic*&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`inline code`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; unordered list item
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; another item
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; nested item
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;1.&lt;/span&gt; ordered list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;2.&lt;/span&gt; second item
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#f92672"&gt;link text&lt;/span&gt;](&lt;span style="color:#a6e22e"&gt;https://example.com&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;![&lt;span style="color:#f92672"&gt;alt text&lt;/span&gt;](&lt;span style="color:#a6e22e"&gt;image.png&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;&amp;gt; &lt;/span&gt;&lt;span style="font-style:italic"&gt;blockquote
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--- (horizontal rule)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="code-blocks"&gt;Code blocks
&lt;/h2&gt;&lt;p&gt;Fenced code blocks with a language identifier get syntax highlighting in most renderers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;```go
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tables-gfm"&gt;Tables (GFM)
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| Column 1 | Column 2 |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|---|---|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| value | value |
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alignment is controlled by colons in the separator row: &lt;code&gt;|:---|&lt;/code&gt; left, &lt;code&gt;|---:|&lt;/code&gt; right, &lt;code&gt;|:---:|&lt;/code&gt; centre.&lt;/p&gt;
&lt;h2 id="front-matter"&gt;Front matter
&lt;/h2&gt;&lt;p&gt;Static site generators (Hugo, Jekyll) extend Markdown with YAML front matter — a metadata block delimited by &lt;code&gt;---&lt;/code&gt; at the top of the file. Hugo uses it for titles, dates, tags, and draft status; it is not part of the Markdown spec but is the universal convention in docs-as-code workflows.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://spec.commonmark.org/" target="_blank" rel="noopener"
 &gt;CommonMark specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.github.com/gfm/" target="_blank" rel="noopener"
 &gt;GitHub Flavored Markdown specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.markdownguide.org/" target="_blank" rel="noopener"
 &gt;Markdown guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Reveal.js</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/reveal/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/docs-as-code/reveal/</guid><description>&lt;p&gt;Reveal.js is a browser-based presentation framework. Slides are HTML rendered in a browser — transitions, speaker notes, code highlighting, nested slides, and a presenter view all included. The source can be plain HTML or Markdown. Stored in Git, versioned, diffable, buildable in CI. No PowerPoint, no Keynote, no binary blobs.&lt;/p&gt;
&lt;p&gt;The practical workflow for a docs-as-code setup: write slides in Markdown, serve with Hugo using the Reveal Hugo theme, export to PDF with DeckTape for distribution.&lt;/p&gt;
&lt;h2 id="hugo-integration--reveal-hugo"&gt;Hugo integration — Reveal Hugo
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/dzello/reveal-hugo" target="_blank" rel="noopener"
 &gt;Reveal Hugo&lt;/a&gt; is a Hugo theme that turns a Hugo site into a Reveal.js presentation builder. Add the theme, create a content directory, and Hugo renders each section as a Reveal.js presentation.&lt;/p&gt;
&lt;p&gt;Slides live in a Hugo content directory. Horizontal slides are separated by &lt;code&gt;---&lt;/code&gt;, vertical slides (a column within a section) by &lt;code&gt;___&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+++
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;title = &amp;#34;My Talk&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;outputs = [&amp;#34;Reveal&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+++
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# First slide
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Second slide
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Horizontal neighbour of the first.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;___
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Second slide, vertical child
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Press down to reach this one.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Third slide
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;outputs = [&amp;quot;Reveal&amp;quot;]&lt;/code&gt; in the front matter tells Hugo to use the Reveal layout instead of the standard page layout.&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Reveal.js options set in &lt;code&gt;config.yaml&lt;/code&gt; under &lt;code&gt;[params.reveal_hugo]&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;params&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;reveal_hugo&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;theme&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;black&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;highlight_theme&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;monokai&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;slide_number&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;transition&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;slide&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per-slide overrides go in a front matter block on that slide.&lt;/p&gt;
&lt;h2 id="shortcodes"&gt;Shortcodes
&lt;/h2&gt;&lt;p&gt;Reveal Hugo provides shortcodes for Reveal.js features:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{&amp;lt; slide background-image=&amp;#34;bg.jpg&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Slide with background image
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{&amp;lt; /slide &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{% note %}}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Speaker notes — visible in presenter mode, not on screen.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{% /note %}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="exporting-to-pdf-with-decktape"&gt;Exporting to PDF with DeckTape
&lt;/h2&gt;&lt;p&gt;DeckTape drives a headless browser through each slide and captures a PDF that preserves the rendered layout — fonts, colours, syntax highlighting. The simplest path is Docker:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Export from a live URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --rm -t -v &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;pwd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;:/slides &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; astefanutti/decktape &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; https://example.com/my-presentation slides.pdf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Export from a local Hugo server (hugo server running on 1313)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --rm -t --net&lt;span style="color:#f92672"&gt;=&lt;/span&gt;host -v &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;pwd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;:/slides &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; astefanutti/decktape &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; http://localhost:1313/presentations/my-talk/ slides.pdf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DeckTape auto-detects the presentation framework. Override the output size with &lt;code&gt;--size 1920x1080&lt;/code&gt; if needed.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://revealjs.com/" target="_blank" rel="noopener"
 &gt;Reveal.js documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/dzello/reveal-hugo" target="_blank" rel="noopener"
 &gt;Reveal Hugo documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/astefanutti/decktape" target="_blank" rel="noopener"
 &gt;DeckTape GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>