<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hugo on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/tags/hugo/</link><description>Recent content in Hugo on Backend Engineering Strategy Tools</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 18 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://backend-engineering-strategy-tools.github.io/site/tags/hugo/index.xml" rel="self" type="application/rss+xml"/><item><title>This Site</title><link>https://backend-engineering-strategy-tools.github.io/site/projects/best-site/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/projects/best-site/</guid><description>&lt;p&gt;This started as an effort to clean up and publish existing notes — things accumulated over years of work that were sitting in various raw forms and never properly written up. The act of publishing forces a level of clarity that private notes rarely get: you have to explain the context, fill the gaps, and decide what actually matters.&lt;/p&gt;
&lt;p&gt;It doubles as deliberate practice in documentation. Getting into the habit of writing things up properly — not just as a record of what was done, but as something useful to come back to — is a skill that compounds. The site is both the output and the exercise.&lt;/p&gt;
&lt;p&gt;Practically it also serves as a personal reference: a place to look things up that I have actually done and know the details of, rather than re-deriving them from scratch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Hugo static site using the &lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener"
 &gt;Stack theme&lt;/a&gt; v4 via Go modules. Deployed to &lt;a class="link" href="https://pages.github.com/" target="_blank" rel="noopener"
 &gt;GitHub Pages&lt;/a&gt; via GitHub Actions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a class="link" href="https://github.com/Backend-Engineering-Strategy-Tools/site" target="_blank" rel="noopener"
 &gt;Backend-Engineering-Strategy-Tools/site&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="why-hugo"&gt;Why Hugo
&lt;/h2&gt;&lt;p&gt;Static is the right default for content that does not need dynamic rendering. Hugo is fast — full site builds in milliseconds — and its template model maps well to a Go-centric mindset. The theme ecosystem is good and the Stack theme in particular supports the layout and content model needed here without significant customisation.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="build-pipeline"&gt;Build Pipeline
&lt;/h2&gt;&lt;p&gt;The GHA workflow runs on push to &lt;code&gt;main&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fetch private assets&lt;/strong&gt; — CV and cover letter PDFs are stored in a private release on a separate repo. The workflow fetches them via GitHub API using a scoped &lt;code&gt;BEST_SITE_PAT&lt;/code&gt; secret and writes them into &lt;code&gt;static/cv/&lt;/code&gt; before the build.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugo build&lt;/strong&gt; — &lt;code&gt;hugo --minify&lt;/code&gt; via the official &lt;code&gt;ghcr.io/gohugoio/hugo&lt;/code&gt; Docker image, producing &lt;code&gt;public/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy&lt;/strong&gt; — &lt;code&gt;actions/deploy-pages&lt;/code&gt; pushes &lt;code&gt;public/&lt;/code&gt; to GitHub Pages.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This keeps CV content separate from site code — the PDF repo can be updated independently without touching the site repo, and a site redeploy picks up the latest version.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="theme-customisation"&gt;Theme Customisation
&lt;/h2&gt;&lt;p&gt;Stack theme v4 is imported via &lt;code&gt;go.mod&lt;/code&gt;. Hugo&amp;rsquo;s lookup order means local files in &lt;code&gt;layouts/&lt;/code&gt; or &lt;code&gt;assets/&lt;/code&gt; override the theme without forking it.&lt;/p&gt;
&lt;p&gt;The main override is &lt;code&gt;layouts/_default/single.html&lt;/code&gt; — the site uses &lt;code&gt;layout: single&lt;/code&gt; on all content pages to get full-width rendering (no sidebar). All pages also set &lt;code&gt;showReadingTime: false&lt;/code&gt; in front matter.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="domain"&gt;Domain
&lt;/h2&gt;&lt;p&gt;Currently served at &lt;code&gt;backend-engineering-strategy-tools.github.io/site/&lt;/code&gt;. A redirect from &lt;code&gt;best.mjnet.info&lt;/code&gt; is set up via an S3 static website bucket — no files in the bucket, just a redirect rule. DNS managed in Route53.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;S3 bucket setup&lt;/strong&gt; (bucket name must match domain):&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;aws s3api create-bucket &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --bucket best.mjnet.info &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --region eu-central-1 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --create-bucket-configuration LocationConstraint&lt;span style="color:#f92672"&gt;=&lt;/span&gt;eu-central-1
&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;aws s3api put-public-access-block &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --bucket best.mjnet.info &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --public-access-block-configuration BlockPublicAcls&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false,IgnorePublicAcls&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false,BlockPublicPolicy&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false,RestrictPublicBuckets&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false
&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;aws s3api put-bucket-website &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --bucket best.mjnet.info &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --website-configuration &lt;span style="color:#e6db74"&gt;&amp;#39;{&amp;#34;IndexDocument&amp;#34;:{&amp;#34;Suffix&amp;#34;:&amp;#34;index.html&amp;#34;},&amp;#34;RoutingRules&amp;#34;:[{&amp;#34;Redirect&amp;#34;:{&amp;#34;Protocol&amp;#34;:&amp;#34;https&amp;#34;,&amp;#34;HostName&amp;#34;:&amp;#34;backend-engineering-strategy-tools.github.io&amp;#34;,&amp;#34;ReplaceKeyPrefixWith&amp;#34;:&amp;#34;site/&amp;#34;}}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Route53 ALIAS record&lt;/strong&gt; pointing &lt;code&gt;best.mjnet.info&lt;/code&gt; at the S3 website endpoint:&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;aws route53 change-resource-record-sets &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --hosted-zone-id &amp;lt;ZONE_ID&amp;gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --change-batch &lt;span style="color:#e6db74"&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;Changes&amp;#34;: [{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;Action&amp;#34;: &amp;#34;CREATE&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;ResourceRecordSet&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;Name&amp;#34;: &amp;#34;best.mjnet.info&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;Type&amp;#34;: &amp;#34;A&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;AliasTarget&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;HostedZoneId&amp;#34;: &amp;#34;Z21DNDUVLTQW6Q&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;DNSName&amp;#34;: &amp;#34;s3-website.eu-central-1.amazonaws.com&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;EvaluateTargetHealth&amp;#34;: false
&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;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&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;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Z21DNDUVLTQW6Q&lt;/code&gt; is the fixed AWS hosted zone ID for S3 website endpoints in &lt;code&gt;eu-central-1&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="content-model"&gt;Content Model
&lt;/h2&gt;&lt;p&gt;Two sections with distinct purposes:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Section&lt;/th&gt;
 &lt;th&gt;Tone&lt;/th&gt;
 &lt;th&gt;What goes here&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;homelab/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Narrative, first-person&lt;/td&gt;
 &lt;td&gt;What actually happened — the sequence, dead ends, workarounds&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;public-notes/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Reference, factual&lt;/td&gt;
 &lt;td&gt;How things work — distilled, structured, without the personal journey&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The separation keeps the narrative and reference writing from muddying each other. A reader looking for a quick reference does not want to read about what went wrong first; a reader following the homelab story wants the context.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;projects/&lt;/code&gt; and &lt;code&gt;thinking/&lt;/code&gt; round out the structure — projects are documented outcomes, thinking is longer-form analysis.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s Next
&lt;/h2&gt;&lt;p&gt;The current setup — Hugo on GitHub Pages — is the right foundation for a content-heavy site. A few things are planned or in progress:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Custom domain&lt;/strong&gt; — &lt;code&gt;best.mjnet.info&lt;/code&gt; redirect via S3 + Route53 (see Domain section above). Proper custom domain with HTTPS as a follow-up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better build pipeline&lt;/strong&gt; — replacing the Makefile with a &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/cicd/dagger/" &gt;Dagger&lt;/a&gt; Go module for local/CI parity and pinned Hugo versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More content&lt;/strong&gt; — the backlog of notes and projects is long. The site grows as things get cleaned up and published.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Longer term, the intent is to grow this into a more multi-faceted site — login-protected sections, dynamic content, interactive tooling. Hugo handles the static part well; the approach is to add separate paths alongside it for authentication and dynamic content rather than replacing the static foundation. The static site stays fast and low-cost, dynamic parts layer in where they are actually needed.&lt;/p&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>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>